feat(post): implement post crate with board, post CRUD and subresources (stage-post)
zhenyi committed
Added lib/export/post/mod.rs lib/export/post/mod.rs +3 −0 View lib/export/post/mod.rs
@@ -0,0 +1,3 @@
1pub mod views;
2
3pub use views::*;
Added lib/export/post/views.rs lib/export/post/views.rs +360 −0 View lib/export/post/views.rs
@@ -0,0 +1,360 @@
1use db::post::post as post_entity;
2use db::post::post_labels as label_entity;
3use db::post::post_mentions as mention_entity;
4use db::post::post_reactions as reaction_entity;
5use db::post::post_replies as reply_entity;
6use db::post::post_watch as watch_entity;
7use db::post::posts as posts_entity;
8use serde::{Deserialize, Serialize};
9use time::OffsetDateTime;
10use time::format_description::well_known::Rfc3339;
11use utoipa::{IntoParams, ToSchema};
12use uuid::Uuid;
13
14fn fmt_ts(ts: OffsetDateTime) -> String {
15 ts.format(&Rfc3339).unwrap_or_default()
16}
17fn fmt_ts_opt(ts: Option<OffsetDateTime>) -> Option<String> {
18 ts.map(fmt_ts)
19}
20
21#[derive(Debug, Clone, Copy, Serialize, Deserialize, ToSchema, PartialEq, Eq)]
22#[serde(rename_all = "snake_case")]
23pub enum PostStatusView {
24 Open,
25 Closed,
26 Archived,
27 Locked,
28}
29
30impl From<post_entity::PostStatus> for PostStatusView {
31 fn from(s: post_entity::PostStatus) -> Self {
32 match s {
33 post_entity::PostStatus::Open => PostStatusView::Open,
34 post_entity::PostStatus::Closed => PostStatusView::Closed,
35 post_entity::PostStatus::Archived => PostStatusView::Archived,
36 post_entity::PostStatus::Locked => PostStatusView::Locked,
37 }
38 }
39}
40
41#[derive(Debug, Clone, Copy, Serialize, Deserialize, ToSchema, PartialEq, Eq)]
42#[serde(rename_all = "snake_case")]
43pub enum PostTargetView {
44 Post,
45 Reply,
46}
47
48impl From<mention_entity::MentionTarget> for PostTargetView {
49 fn from(t: mention_entity::MentionTarget) -> Self {
50 match t {
51 mention_entity::MentionTarget::Post => PostTargetView::Post,
52 mention_entity::MentionTarget::Reply => PostTargetView::Reply,
53 }
54 }
55}
56
57impl From<reaction_entity::ReactionTarget> for PostTargetView {
58 fn from(t: reaction_entity::ReactionTarget) -> Self {
59 match t {
60 reaction_entity::ReactionTarget::Post => PostTargetView::Post,
61 reaction_entity::ReactionTarget::Reply => PostTargetView::Reply,
62 }
63 }
64}
65
66/// A post board (collection) hosting posts for a space.
67#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
68pub struct PostBoardView {
69 pub id: Uuid,
70 pub channel_id: Uuid,
71 pub name: String,
72 pub icon: Option<String>,
73 pub description: Option<String>,
74 pub nums_open_post: i64,
75 pub nums_closed_post: i64,
76 pub created_at: String,
77 pub updated_at: Option<String>,
78}
79
80impl From<posts_entity::Model> for PostBoardView {
81 fn from(m: posts_entity::Model) -> Self {
82 Self {
83 id: m.id,
84 channel_id: m.channel_id,
85 name: m.name,
86 icon: m.icon,
87 description: m.description,
88 nums_open_post: 0,
89 nums_closed_post: 0,
90 created_at: fmt_ts(m.created_at),
91 updated_at: fmt_ts_opt(m.updated_at),
92 }
93 }
94}
95
96#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
97pub struct PostBoardPage {
98 pub items: Vec<PostBoardView>,
99 pub total: i64,
100}
101
102#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
103pub struct CreatePostBoardOption {
104 pub parent_dir: Option<Uuid>,
105 pub name: String,
106 pub icon: Option<String>,
107 pub description: Option<String>,
108}
109
110/// A single post (thread).
111#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
112pub struct PostView {
113 pub id: Uuid,
114 pub collection_id: Uuid,
115 pub number: i64,
116 pub author_id: Uuid,
117 pub title: String,
118 pub body: String,
119 pub status: PostStatusView,
120 pub is_pinned: bool,
121 pub reply_count: i32,
122 pub last_reply_at: Option<String>,
123 pub last_reply_by: Option<Uuid>,
124 pub created_at: String,
125 pub updated_at: Option<String>,
126 pub closed_at: Option<String>,
127 pub archived_at: Option<String>,
128}
129
130impl From<post_entity::Model> for PostView {
131 fn from(m: post_entity::Model) -> Self {
132 Self {
133 id: m.id,
134 collection_id: m.collection_id,
135 number: m.autoincrement_id as i64,
136 author_id: m.author_id,
137 title: m.title,
138 body: m.body,
139 status: PostStatusView::from(m.status),
140 is_pinned: m.is_pinned,
141 reply_count: m.reply_count,
142 last_reply_at: fmt_ts_opt(m.last_reply_at),
143 last_reply_by: m.last_reply_by,
144 created_at: fmt_ts(m.created_at),
145 updated_at: fmt_ts_opt(m.updated_at),
146 closed_at: fmt_ts_opt(m.closed_at),
147 archived_at: fmt_ts_opt(m.archived_at),
148 }
149 }
150}
151
152#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
153pub struct PostPage {
154 pub items: Vec<PostView>,
155 pub total: i64,
156}
157
158#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
159pub struct CreatePostOption {
160 pub title: String,
161 pub body: String,
162}
163
164#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
165pub struct UpdatePostOption {
166 pub title: Option<String>,
167 pub body: Option<String>,
168 pub status: Option<PostStatusView>,
169}
170
171#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, IntoParams)]
172pub struct ListPostQuery {
173 pub status: Option<PostStatusView>,
174 pub author_id: Option<Uuid>,
175 pub q: Option<String>,
176 pub limit: Option<u64>,
177 pub offset: Option<u64>,
178}
179
180#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
181pub struct PostReplyView {
182 pub id: Uuid,
183 pub post_id: Uuid,
184 pub author_id: Uuid,
185 pub body: String,
186 pub parent_reply_id: Option<Uuid>,
187 pub is_pinned: bool,
188 pub edited_at: Option<String>,
189 pub created_at: String,
190 pub updated_at: Option<String>,
191 pub deleted_at: Option<String>,
192 pub deleted_by: Option<Uuid>,
193}
194
195impl From<reply_entity::Model> for PostReplyView {
196 fn from(m: reply_entity::Model) -> Self {
197 Self {
198 id: m.id,
199 post_id: m.post_id,
200 author_id: m.author_id,
201 body: m.body,
202 parent_reply_id: m.parent_reply_id,
203 is_pinned: m.is_pinned,
204 edited_at: fmt_ts_opt(m.edited_at),
205 created_at: fmt_ts(m.created_at),
206 updated_at: fmt_ts_opt(m.updated_at),
207 deleted_at: fmt_ts_opt(m.deleted_at),
208 deleted_by: m.deleted_by,
209 }
210 }
211}
212
213#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
214pub struct PostReplyPage {
215 pub items: Vec<PostReplyView>,
216 pub total: i64,
217}
218
219#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
220pub struct CreateReplyOption {
221 pub body: String,
222 pub parent_reply_id: Option<Uuid>,
223}
224
225#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
226pub struct PostLabelView {
227 pub id: Uuid,
228 pub channel_id: Uuid,
229 pub name: String,
230 pub color: String,
231 pub is_archived: bool,
232 pub created_at: String,
233 pub updated_at: Option<String>,
234}
235
236impl From<label_entity::Model> for PostLabelView {
237 fn from(m: label_entity::Model) -> Self {
238 Self {
239 id: m.id,
240 channel_id: m.channel_id,
241 name: m.name,
242 color: m.color,
243 is_archived: m.is_archived,
244 created_at: fmt_ts(m.created_at),
245 updated_at: fmt_ts_opt(m.updated_at),
246 }
247 }
248}
249
250#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
251pub struct PostLabelPage {
252 pub items: Vec<PostLabelView>,
253 pub total: i64,
254}
255
256#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
257pub struct CreatePostLabelOption {
258 pub name: String,
259 pub color: String,
260}
261
262#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
263pub struct UpdatePostLabelOption {
264 pub name: Option<String>,
265 pub color: Option<String>,
266 pub is_archived: Option<bool>,
267}
268
269#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
270pub struct PostReactionView {
271 pub id: Uuid,
272 pub target: PostTargetView,
273 pub target_id: Uuid,
274 pub user_id: Uuid,
275 pub emoji: String,
276 pub created_at: String,
277}
278
279impl From<reaction_entity::Model> for PostReactionView {
280 fn from(m: reaction_entity::Model) -> Self {
281 Self {
282 id: m.id,
283 target: PostTargetView::from(m.target),
284 target_id: m.target_id,
285 user_id: m.user_id,
286 emoji: m.emoji,
287 created_at: fmt_ts(m.created_at),
288 }
289 }
290}
291
292#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
293pub struct CreatePostReactionOption {
294 pub emoji: String,
295}
296
297#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
298pub struct PostMentionView {
299 pub id: Uuid,
300 pub target: PostTargetView,
301 pub target_id: Uuid,
302 pub user_id: Option<Uuid>,
303 pub role_id: Option<Uuid>,
304 pub channel_id: Option<Uuid>,
305 pub is_everyone: bool,
306 pub is_here: bool,
307 pub created_at: String,
308}
309
310impl From<mention_entity::Model> for PostMentionView {
311 fn from(m: mention_entity::Model) -> Self {
312 Self {
313 id: m.id,
314 target: PostTargetView::from(m.target),
315 target_id: m.target_id,
316 user_id: m.user_id,
317 role_id: m.role_id,
318 channel_id: m.channel_id,
319 is_everyone: m.is_everyone,
320 is_here: m.is_here,
321 created_at: fmt_ts(m.created_at),
322 }
323 }
324}
325
326#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
327pub struct CreateMentionOption {
328 pub user_id: Option<Uuid>,
329 pub role_id: Option<Uuid>,
330 pub is_everyone: bool,
331 pub is_here: bool,
332}
333
334#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
335pub struct PostWatchView {
336 pub id: Uuid,
337 pub post_id: Uuid,
338 pub user_id: Uuid,
339 pub mode: String,
340 pub created_at: String,
341 pub updated_at: Option<String>,
342}
343
344impl From<watch_entity::Model> for PostWatchView {
345 fn from(m: watch_entity::Model) -> Self {
346 Self {
347 id: m.id,
348 post_id: m.post_id,
349 user_id: m.user_id,
350 mode: format!("{:?}", m.mode),
351 created_at: fmt_ts(m.created_at),
352 updated_at: fmt_ts_opt(m.updated_at),
353 }
354 }
355}
356
357#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
358pub struct UpsertPostWatchOption {
359 pub mode: String,
360}
Modified lib/export/lib.rs lib/export/lib.rs +1 −0 View lib/export/lib.rs
@@ -3,6 +3,7 @@
33pub mod auth;
44pub mod issues;
55pub mod openapi;
6pub mod post;
67pub mod project;
78pub mod repo;
89pub mod space;
Added lib/post/features/post/usecase/archive.rs lib/post/features/post/usecase/archive.rs +38 −0 View lib/post/features/post/usecase/archive.rs
@@ -0,0 +1,38 @@
1use db::conn::sea_orm::*;
2use db::post::post::PostStatus;
3use time::OffsetDateTime;
4use uuid::Uuid;
5
6use crate::error::PostResult;
7use crate::features::authz;
8use crate::features::PostService;
9use crate::metrics;
10
11use super::super::PostView;
12use super::helpers::{load_post, require_authenticated};
13
14pub async fn archive_post(
15 svc: &PostService,
16 actor: Uuid,
17 channel_id: Uuid,
18 post_id: Uuid,
19) -> PostResult<PostView> {
20 let _timer = metrics::Timer::start(metrics::FEATURE_POSTS_ARCHIVE);
21 let result: PostResult<PostView> = async {
22 require_authenticated(actor)?;
23 authz::authorize_post(svc, actor, channel_id).await?;
24 let cur = load_post(svc, channel_id, post_id).await?;
25 let db = svc.db.writer();
26 let now = OffsetDateTime::now_utc();
27 let mut active: db::post::post::ActiveModel = cur.into();
28 active.status = Set(PostStatus::Archived);
29 active.archived_at = Set(Some(now));
30 active.closed_at = Set(None);
31 active.updated_at = Set(Some(now));
32 let saved = active.update(&db).await?;
33 Ok(PostView::from(saved))
34 }
35 .await;
36 metrics::record_outcome(metrics::FEATURE_POSTS_ARCHIVE, &result);
37 result
38}
Added lib/post/features/post/usecase/close.rs lib/post/features/post/usecase/close.rs +38 −0 View lib/post/features/post/usecase/close.rs
@@ -0,0 +1,38 @@
1use db::conn::sea_orm::*;
2use db::post::post::PostStatus;
3use time::OffsetDateTime;
4use uuid::Uuid;
5
6use crate::error::PostResult;
7use crate::features::authz;
8use crate::features::PostService;
9use crate::metrics;
10
11use super::super::PostView;
12use super::helpers::{load_post, require_authenticated};
13
14pub async fn close_post(
15 svc: &PostService,
16 actor: Uuid,
17 channel_id: Uuid,
18 post_id: Uuid,
19) -> PostResult<PostView> {
20 let _timer = metrics::Timer::start(metrics::FEATURE_POSTS_CLOSE);
21 let result: PostResult<PostView> = async {
22 require_authenticated(actor)?;
23 authz::authorize_post(svc, actor, channel_id).await?;
24 let cur = load_post(svc, channel_id, post_id).await?;
25 let db = svc.db.writer();
26 let now = OffsetDateTime::now_utc();
27 let mut active: db::post::post::ActiveModel = cur.into();
28 active.status = Set(PostStatus::Closed);
29 active.closed_at = Set(Some(now));
30 active.archived_at = Set(None);
31 active.updated_at = Set(Some(now));
32 let saved = active.update(&db).await?;
33 Ok(PostView::from(saved))
34 }
35 .await;
36 metrics::record_outcome(metrics::FEATURE_POSTS_CLOSE, &result);
37 result
38}
Added lib/post/features/post/usecase/create.rs lib/post/features/post/usecase/create.rs +99 −0 View lib/post/features/post/usecase/create.rs
@@ -0,0 +1,99 @@
1use db::conn::sea_orm::*;
2use db::post::post as post_entity;
3use space::features::channels::usecase::ensure_channel_for_resource;
4use time::OffsetDateTime;
5use uuid::Uuid;
6
7use crate::error::{PostError, PostResult};
8use crate::features::PostService;
9use crate::features::posts::usecase::helpers::{
10 DEFAULT_BOARD_NAME, ensure_default_collection, find_board_by_space,
11};
12use crate::metrics;
13use super::super::{CreatePostOption, PostView};
14use super::helpers::require_authenticated;
15
16pub const MAX_TITLE_LEN: usize = 200;
17pub const MAX_BODY_LEN: usize = 1_000_000;
18
19pub async fn create_post(
20 svc: &PostService,
21 actor: Uuid,
22 space_id: Uuid,
23 input: CreatePostOption,
24) -> PostResult<PostView> {
25 let _timer = metrics::Timer::start(metrics::FEATURE_POSTS_CREATE);
26 let result: PostResult<PostView> = async {
27 require_authenticated(actor)?;
28
29 let title = input.title.trim().to_string();
30 if title.is_empty() || title.len() > MAX_TITLE_LEN {
31 return Err(PostError::BadRequest(format!(
32 "title length must be in 1..={MAX_TITLE_LEN}"
33 )));
34 }
35 if input.body.len() > MAX_BODY_LEN {
36 return Err(PostError::BadRequest(format!(
37 "body too long (max {MAX_BODY_LEN})"
38 )));
39 }
40
41 let db = svc.db.writer();
42 let txn = db.begin().await?;
43
44 let channel_id = match find_board_by_space(&txn, space_id).await? {
45 Some(board) => board.channel_id,
46 None => {
47 let channel = ensure_channel_for_resource(
48 &txn,
49 space_id,
50 None,
51 DEFAULT_BOARD_NAME,
52 actor,
53 )
54 .await?;
55 ensure_default_collection(&txn, channel.id, actor).await?;
56 channel.id
57 }
58 };
59 let collection = ensure_default_collection(&txn, channel_id, actor).await?;
60
61 let max_id: Option<i32> = post_entity::Entity::find()
62 .filter(post_entity::Column::CollectionId.eq(collection.id))
63 .lock_exclusive()
64 .select_only()
65 .column_as(post_entity::Column::AutoincrementId.max(), "max")
66 .into_tuple::<Option<i32>>()
67 .one(&txn)
68 .await?
69 .flatten();
70 let next_id = max_id.map(|n| n + 1).unwrap_or(1);
71
72 let now = OffsetDateTime::now_utc();
73 let post_id = Uuid::now_v7();
74 let active: post_entity::ActiveModel = post_entity::ActiveModel::builder()
75 .set_id(post_id)
76 .set_collection_id(collection.id)
77 .set_autoincrement_id(next_id)
78 .set_author_id(actor)
79 .set_title(title)
80 .set_body(input.body)
81 .set_status(post_entity::PostStatus::Open)
82 .set_is_pinned(false)
83 .set_reply_count(0)
84 .set_last_reply_at(None)
85 .set_last_reply_by(None)
86 .set_created_at(now)
87 .set_updated_at(None)
88 .set_closed_at(None)
89 .set_archived_at(None)
90 .into();
91 let saved = active.insert(&txn).await?;
92
93 txn.commit().await?;
94 Ok(PostView::from(saved))
95 }
96 .await;
97 metrics::record_outcome(metrics::FEATURE_POSTS_CREATE, &result);
98 result
99}
Added lib/post/features/post/usecase/delete.rs lib/post/features/post/usecase/delete.rs +30 −0 View lib/post/features/post/usecase/delete.rs
@@ -0,0 +1,30 @@
1use db::conn::sea_orm::*;
2use uuid::Uuid;
3
4use crate::error::PostResult;
5use crate::features::authz;
6use crate::features::PostService;
7use crate::metrics;
8
9use super::helpers::{load_post, require_authenticated};
10
11pub async fn delete_post(
12 svc: &PostService,
13 actor: Uuid,
14 channel_id: Uuid,
15 post_id: Uuid,
16) -> PostResult<()> {
17 let _timer = metrics::Timer::start(metrics::FEATURE_POSTS_DELETE);
18 let result: PostResult<()> = async {
19 require_authenticated(actor)?;
20 authz::authorize_post(svc, actor, channel_id).await?;
21 let cur = load_post(svc, channel_id, post_id).await?;
22 let db = svc.db.writer();
23 let active: db::post::post::ActiveModel = cur.into();
24 active.delete(&db).await?;
25 Ok(())
26 }
27 .await;
28 metrics::record_outcome(metrics::FEATURE_POSTS_DELETE, &result);
29 result
30}
Added lib/post/features/post/usecase/get.rs lib/post/features/post/usecase/get.rs +18 −0 View lib/post/features/post/usecase/get.rs
@@ -0,0 +1,18 @@
1use uuid::Uuid;
2
3use crate::error::PostResult;
4use crate::features::PostService;
5
6use super::super::PostView;
7use super::helpers::{load_post, require_authenticated};
8
9pub async fn get_post(
10 svc: &PostService,
11 actor: Uuid,
12 channel_id: Uuid,
13 post_id: Uuid,
14) -> PostResult<PostView> {
15 require_authenticated(actor)?;
16 let cur = load_post(svc, channel_id, post_id).await?;
17 Ok(PostView::from(cur))
18}
Added lib/post/features/post/usecase/helpers.rs lib/post/features/post/usecase/helpers.rs +53 −0 View lib/post/features/post/usecase/helpers.rs
@@ -0,0 +1,53 @@
1use db::conn::sea_orm::*;
2use db::post::post as post_entity;
3use uuid::Uuid;
4
5use crate::error::{PostError, PostResult};
6use crate::features::PostService;
7
8use crate::features::posts::usecase::load_board;
9
10pub fn require_authenticated(actor: Uuid) -> PostResult<()> {
11 if actor.is_nil() {
12 return Err(PostError::Unauthorized("authentication required".into()));
13 }
14 Ok(())
15}
16
17/// Resolve a post by its human-facing number within a channel's board
18/// (`collection_id` + `autoincrement_id` composite key).
19pub async fn resolve_post_by_number(
20 svc: &PostService,
21 channel_id: Uuid,
22 number: i64,
23) -> PostResult<post_entity::Model> {
24 let board = load_board(svc, channel_id).await?;
25 let number_i32 = i32::try_from(number)
26 .ok()
27 .filter(|n| *n > 0)
28 .ok_or_else(|| PostError::NotFound(format!("post #{number}")))?;
29 let db = svc.db.reader();
30 let row = post_entity::Entity::find()
31 .filter(post_entity::Column::CollectionId.eq(board.id))
32 .filter(post_entity::Column::AutoincrementId.eq(number_i32))
33 .one(&db)
34 .await?
35 .ok_or_else(|| PostError::NotFound(format!("post #{number}")))?;
36 Ok(row)
37}
38
39/// Load a post, asserting it belongs to the given channel's board.
40pub async fn load_post(
41 svc: &PostService,
42 channel_id: Uuid,
43 post_id: Uuid,
44) -> PostResult<post_entity::Model> {
45 let board = load_board(svc, channel_id).await?;
46 let db = svc.db.reader();
47 let it = post_entity::Entity::find_by_id(post_id)
48 .filter(post_entity::Column::CollectionId.eq(board.id))
49 .one(&db)
50 .await?
51 .ok_or_else(|| PostError::NotFound(format!("post {post_id}")))?;
52 Ok(it)
53}
Added lib/post/features/post/usecase/mod.rs lib/post/features/post/usecase/mod.rs +17 −0 View lib/post/features/post/usecase/mod.rs
@@ -0,0 +1,17 @@
1mod archive;
2mod close;
3mod create;
4mod delete;
5mod get;
6mod helpers;
7mod reopen;
8mod update;
9
10pub use archive::archive_post;
11pub use close::close_post;
12pub use create::create_post;
13pub use delete::delete_post;
14pub use get::get_post;
15pub use helpers::{load_post, require_authenticated, resolve_post_by_number};
16pub use reopen::reopen_post;
17pub use update::update_post;
Added lib/post/features/post/usecase/reopen.rs lib/post/features/post/usecase/reopen.rs +38 −0 View lib/post/features/post/usecase/reopen.rs
@@ -0,0 +1,38 @@
1use db::conn::sea_orm::*;
2use db::post::post::PostStatus;
3use time::OffsetDateTime;
4use uuid::Uuid;
5
6use crate::error::PostResult;
7use crate::features::authz;
8use crate::features::PostService;
9use crate::metrics;
10
11use super::super::PostView;
12use super::helpers::{load_post, require_authenticated};
13
14pub async fn reopen_post(
15 svc: &PostService,
16 actor: Uuid,
17 channel_id: Uuid,
18 post_id: Uuid,
19) -> PostResult<PostView> {
20 let _timer = metrics::Timer::start(metrics::FEATURE_POSTS_REOPEN);
21 let result: PostResult<PostView> = async {
22 require_authenticated(actor)?;
23 authz::authorize_post(svc, actor, channel_id).await?;
24 let cur = load_post(svc, channel_id, post_id).await?;
25 let db = svc.db.writer();
26 let now = OffsetDateTime::now_utc();
27 let mut active: db::post::post::ActiveModel = cur.into();
28 active.status = Set(PostStatus::Open);
29 active.closed_at = Set(None);
30 active.archived_at = Set(None);
31 active.updated_at = Set(Some(now));
32 let saved = active.update(&db).await?;
33 Ok(PostView::from(saved))
34 }
35 .await;
36 metrics::record_outcome(metrics::FEATURE_POSTS_REOPEN, &result);
37 result
38}
Added lib/post/features/post/usecase/update.rs lib/post/features/post/usecase/update.rs +92 −0 View lib/post/features/post/usecase/update.rs
@@ -0,0 +1,92 @@
1use db::conn::sea_orm::*;
2use time::OffsetDateTime;
3use uuid::Uuid;
4
5use crate::error::{PostError, PostResult};
6use crate::features::authz;
7use crate::features::PostService;
8use crate::metrics;
9
10use super::create::{MAX_BODY_LEN, MAX_TITLE_LEN};
11use super::helpers::{load_post, require_authenticated};
12use super::super::{PostStatusView, PostView, UpdatePostOption};
13
14pub async fn update_post(
15 svc: &PostService,
16 actor: Uuid,
17 channel_id: Uuid,
18 post_id: Uuid,
19 input: UpdatePostOption,
20) -> PostResult<PostView> {
21 let _timer = metrics::Timer::start(metrics::FEATURE_POSTS_UPDATE);
22 let result: PostResult<PostView> = async {
23 require_authenticated(actor)?;
24 authz::authorize_post(svc, actor, channel_id).await?;
25
26 let cur = load_post(svc, channel_id, post_id).await?;
27
28 if let Some(ref t) = input.title
29 && (t.trim().is_empty() || t.len() > MAX_TITLE_LEN)
30 {
31 return Err(PostError::BadRequest(format!(
32 "title length must be in 1..={MAX_TITLE_LEN}"
33 )));
34 }
35 if let Some(ref b) = input.body
36 && b.len() > MAX_BODY_LEN
37 {
38 return Err(PostError::BadRequest(format!(
39 "body too long (max {MAX_BODY_LEN})"
40 )));
41 }
42
43 let db = svc.db.writer();
44 let now = OffsetDateTime::now_utc();
45 let mut active: db::post::post::ActiveModel = cur.into();
46 if let Some(t) = input.title {
47 active.title = Set(t.trim().to_string());
48 }
49 if let Some(b) = input.body {
50 active.body = Set(b);
51 }
52 if let Some(s) = input.status {
53 apply_status(&mut active, s, now);
54 }
55 active.updated_at = Set(Some(now));
56
57 let saved = active.update(&db).await?;
58 Ok(PostView::from(saved))
59 }
60 .await;
61 metrics::record_outcome(metrics::FEATURE_POSTS_UPDATE, &result);
62 result
63}
64
65pub(super) fn apply_status(
66 active: &mut db::post::post::ActiveModel,
67 status: PostStatusView,
68 now: OffsetDateTime,
69) {
70 use db::post::post::PostStatus;
71 active.status = Set(match status {
72 PostStatusView::Open => PostStatus::Open,
73 PostStatusView::Closed => PostStatus::Closed,
74 PostStatusView::Archived => PostStatus::Archived,
75 PostStatusView::Locked => PostStatus::Locked,
76 });
77 match status {
78 PostStatusView::Open => {
79 active.closed_at = Set(None);
80 active.archived_at = Set(None);
81 }
82 PostStatusView::Closed => {
83 active.closed_at = Set(Some(now));
84 active.archived_at = Set(None);
85 }
86 PostStatusView::Archived => {
87 active.archived_at = Set(Some(now));
88 active.closed_at = Set(None);
89 }
90 PostStatusView::Locked => {}
91 }
92}
Added lib/post/features/post/impls.rs lib/post/features/post/impls.rs +73 −0 View lib/post/features/post/impls.rs
@@ -0,0 +1,73 @@
1use uuid::Uuid;
2
3use crate::error::PostResult;
4use crate::features::PostService;
5
6use super::usecase;
7use super::{CreatePostOption, PostView, UpdatePostOption};
8
9impl PostService {
10 pub async fn create_post(
11 &self,
12 actor: Uuid,
13 space_id: Uuid,
14 input: CreatePostOption,
15 ) -> PostResult<PostView> {
16 usecase::create_post(self, actor, space_id, input).await
17 }
18
19 pub async fn get_post(
20 &self,
21 actor: Uuid,
22 channel_id: Uuid,
23 post_id: Uuid,
24 ) -> PostResult<PostView> {
25 usecase::get_post(self, actor, channel_id, post_id).await
26 }
27
28 pub async fn update_post(
29 &self,
30 actor: Uuid,
31 channel_id: Uuid,
32 post_id: Uuid,
33 input: UpdatePostOption,
34 ) -> PostResult<PostView> {
35 usecase::update_post(self, actor, channel_id, post_id, input).await
36 }
37
38 pub async fn close_post(
39 &self,
40 actor: Uuid,
41 channel_id: Uuid,
42 post_id: Uuid,
43 ) -> PostResult<PostView> {
44 usecase::close_post(self, actor, channel_id, post_id).await
45 }
46
47 pub async fn reopen_post(
48 &self,
49 actor: Uuid,
50 channel_id: Uuid,
51 post_id: Uuid,
52 ) -> PostResult<PostView> {
53 usecase::reopen_post(self, actor, channel_id, post_id).await
54 }
55
56 pub async fn archive_post(
57 &self,
58 actor: Uuid,
59 channel_id: Uuid,
60 post_id: Uuid,
61 ) -> PostResult<PostView> {
62 usecase::archive_post(self, actor, channel_id, post_id).await
63 }
64
65 pub async fn delete_post(
66 &self,
67 actor: Uuid,
68 channel_id: Uuid,
69 post_id: Uuid,
70 ) -> PostResult<()> {
71 usecase::delete_post(self, actor, channel_id, post_id).await
72 }
73}
Added lib/post/features/post/mod.rs lib/post/features/post/mod.rs +4 −0 View lib/post/features/post/mod.rs
@@ -0,0 +1,4 @@
1pub mod impls;
2pub mod usecase;
3
4pub use export::post::views::*;
Added lib/post/features/post_label/usecase/bind.rs lib/post/features/post_label/usecase/bind.rs +51 −0 View lib/post/features/post_label/usecase/bind.rs
@@ -0,0 +1,51 @@
1use db::conn::sea_orm::*;
2use db::post::post_relation_label as rel_entity;
3use time::OffsetDateTime;
4use uuid::Uuid;
5
6use crate::error::{PostError, PostResult};
7use crate::features::PostService;
8use crate::metrics;
9
10use crate::features::post::usecase::load_post;
11use super::helpers::{load_post_label, require_authenticated};
12
13pub async fn bind_post_label(
14 svc: &PostService,
15 actor: Uuid,
16 channel_id: Uuid,
17 post_id: Uuid,
18 label_id: Uuid,
19) -> PostResult<()> {
20 let _timer = metrics::Timer::start(metrics::FEATURE_POST_LABELS_BIND);
21 let result: PostResult<()> = async {
22 require_authenticated(actor)?;
23 let _post = load_post(svc, channel_id, post_id).await?;
24 let _label = load_post_label(svc, channel_id, label_id).await?;
25
26 let db = svc.db.reader();
27 let existing = rel_entity::Entity::find()
28 .filter(rel_entity::Column::PostId.eq(post_id))
29 .filter(rel_entity::Column::LabelId.eq(label_id))
30 .one(&db)
31 .await?;
32 if existing.is_some() {
33 return Err(PostError::Conflict(format!(
34 "label {label_id} already bound to post {post_id}"
35 )));
36 }
37
38 let db = svc.db.writer();
39 let active: rel_entity::ActiveModel = rel_entity::ActiveModel::builder()
40 .set_id(Uuid::now_v7())
41 .set_post_id(post_id)
42 .set_label_id(label_id)
43 .set_created_at(OffsetDateTime::now_utc())
44 .into();
45 active.insert(&db).await?;
46 Ok(())
47 }
48 .await;
49 metrics::record_outcome(metrics::FEATURE_POST_LABELS_BIND, &result);
50 result
51}
Added lib/post/features/post_label/usecase/create.rs lib/post/features/post_label/usecase/create.rs +66 −0 View lib/post/features/post_label/usecase/create.rs
@@ -0,0 +1,66 @@
1use db::conn::sea_orm::*;
2use db::post::post_labels as label_entity;
3use time::OffsetDateTime;
4use uuid::Uuid;
5
6use crate::error::{PostError, PostResult};
7use crate::features::PostService;
8use crate::metrics;
9
10use super::super::{CreatePostLabelOption, PostLabelView};
11use super::helpers::require_authenticated;
12
13pub const MAX_LABEL_NAME_LEN: usize = 64;
14pub const MAX_LABEL_COLOR_LEN: usize = 32;
15
16pub async fn create_post_label(
17 svc: &PostService,
18 actor: Uuid,
19 channel_id: Uuid,
20 input: CreatePostLabelOption,
21) -> PostResult<PostLabelView> {
22 let _timer = metrics::Timer::start(metrics::FEATURE_POST_LABELS_CREATE);
23 let result: PostResult<PostLabelView> = async {
24 require_authenticated(actor)?;
25
26 let name = input.name.trim().to_string();
27 if name.is_empty() || name.len() > MAX_LABEL_NAME_LEN {
28 return Err(PostError::BadRequest(format!(
29 "label name length must be in 1..={MAX_LABEL_NAME_LEN}"
30 )));
31 }
32 let color = input.color.trim().to_string();
33 if color.is_empty() || color.len() > MAX_LABEL_COLOR_LEN {
34 return Err(PostError::BadRequest("invalid label color".into()));
35 }
36
37 let db = svc.db.reader();
38 let existing = label_entity::Entity::find()
39 .filter(label_entity::Column::ChannelId.eq(channel_id))
40 .filter(label_entity::Column::Name.eq(&name))
41 .one(&db)
42 .await?;
43 if existing.is_some() {
44 return Err(PostError::Conflict(format!(
45 "label {name} already exists in channel {channel_id}"
46 )));
47 }
48
49 let db = svc.db.writer();
50 let now = OffsetDateTime::now_utc();
51 let active: label_entity::ActiveModel = label_entity::ActiveModel::builder()
52 .set_id(Uuid::now_v7())
53 .set_channel_id(channel_id)
54 .set_name(name)
55 .set_color(color)
56 .set_is_archived(false)
57 .set_created_at(now)
58 .set_updated_at(None)
59 .into();
60 let saved = active.insert(&db).await?;
61 Ok(PostLabelView::from(saved))
62 }
63 .await;
64 metrics::record_outcome(metrics::FEATURE_POST_LABELS_CREATE, &result);
65 result
66}
Added lib/post/features/post_label/usecase/delete.rs lib/post/features/post_label/usecase/delete.rs +28 −0 View lib/post/features/post_label/usecase/delete.rs
@@ -0,0 +1,28 @@
1use db::conn::sea_orm::*;
2use uuid::Uuid;
3
4use crate::error::PostResult;
5use crate::features::PostService;
6use crate::metrics;
7
8use super::helpers::{load_post_label, require_authenticated};
9
10pub async fn delete_post_label(
11 svc: &PostService,
12 actor: Uuid,
13 channel_id: Uuid,
14 label_id: Uuid,
15) -> PostResult<()> {
16 let _timer = metrics::Timer::start(metrics::FEATURE_POST_LABELS_DELETE);
17 let result: PostResult<()> = async {
18 require_authenticated(actor)?;
19 let cur = load_post_label(svc, channel_id, label_id).await?;
20 let db = svc.db.writer();
21 let active: db::post::post_labels::ActiveModel = cur.into();
22 active.delete(&db).await?;
23 Ok(())
24 }
25 .await;
26 metrics::record_outcome(metrics::FEATURE_POST_LABELS_DELETE, &result);
27 result
28}
Added lib/post/features/post_label/usecase/get.rs lib/post/features/post_label/usecase/get.rs +18 −0 View lib/post/features/post_label/usecase/get.rs
@@ -0,0 +1,18 @@
1use uuid::Uuid;
2
3use crate::error::PostResult;
4use crate::features::PostService;
5
6use super::super::PostLabelView;
7use super::helpers::{load_post_label, require_authenticated};
8
9pub async fn get_post_label(
10 svc: &PostService,
11 actor: Uuid,
12 channel_id: Uuid,
13 label_id: Uuid,
14) -> PostResult<PostLabelView> {
15 require_authenticated(actor)?;
16 let cur = load_post_label(svc, channel_id, label_id).await?;
17 Ok(PostLabelView::from(cur))
18}
Added lib/post/features/post_label/usecase/helpers.rs lib/post/features/post_label/usecase/helpers.rs +27 −0 View lib/post/features/post_label/usecase/helpers.rs
@@ -0,0 +1,27 @@
1use db::conn::sea_orm::*;
2use db::post::post_labels as label_entity;
3use uuid::Uuid;
4
5use crate::error::{PostError, PostResult};
6use crate::features::PostService;
7
8pub fn require_authenticated(actor: Uuid) -> PostResult<()> {
9 if actor.is_nil() {
10 return Err(PostError::Unauthorized("authentication required".into()));
11 }
12 Ok(())
13}
14
15pub async fn load_post_label(
16 svc: &PostService,
17 channel_id: Uuid,
18 label_id: Uuid,
19) -> PostResult<label_entity::Model> {
20 let db = svc.db.reader();
21 let row = label_entity::Entity::find_by_id(label_id)
22 .filter(label_entity::Column::ChannelId.eq(channel_id))
23 .one(&db)
24 .await?
25 .ok_or_else(|| PostError::NotFound(format!("post label {label_id}")))?;
26 Ok(row)
27}
Added lib/post/features/post_label/usecase/list.rs lib/post/features/post_label/usecase/list.rs +58 −0 View lib/post/features/post_label/usecase/list.rs
@@ -0,0 +1,58 @@
1use db::conn::sea_orm::*;
2use db::post::post_labels as label_entity;
3use uuid::Uuid;
4
5use crate::error::{PostError, PostResult};
6use crate::features::PostService;
7use crate::metrics;
8
9use super::super::{PostLabelPage, PostLabelView};
10use super::helpers::require_authenticated;
11
12const MAX_PAGINATION: u64 = 100;
13const DEFAULT_PAGINATION: u64 = 20;
14
15pub async fn list_post_labels(
16 svc: &PostService,
17 actor: Uuid,
18 channel_id: Uuid,
19 q: Option<String>,
20 is_archived: Option<bool>,
21 limit: Option<u64>,
22 offset: Option<u64>,
23) -> PostResult<PostLabelPage> {
24 let _timer = metrics::Timer::start(metrics::FEATURE_POST_LABELS_LIST);
25 let result: PostResult<PostLabelPage> = async {
26 require_authenticated(actor)?;
27
28 let limit = limit.unwrap_or(DEFAULT_PAGINATION);
29 let offset = offset.unwrap_or(0);
30 if limit == 0 || limit > MAX_PAGINATION {
31 return Err(PostError::BadRequest(format!(
32 "limit must be in 1..={MAX_PAGINATION}"
33 )));
34 }
35
36 let db = svc.db.reader();
37 let finder = label_entity::Entity::find()
38 .filter(label_entity::Column::ChannelId.eq(channel_id))
39 .apply_if(q, |f, s| f.filter(label_entity::Column::Name.contains(&s)))
40 .apply_if(is_archived, |f, v| {
41 f.filter(label_entity::Column::IsArchived.eq(v))
42 });
43
44 let total = finder.clone().count(&db).await? as i64;
45 let rows = finder
46 .order_by_asc(label_entity::Column::CreatedAt)
47 .limit(limit)
48 .offset(offset)
49 .all(&db)
50 .await?;
51
52 let items = rows.into_iter().map(PostLabelView::from).collect();
53 Ok(PostLabelPage { items, total })
54 }
55 .await;
56 metrics::record_outcome(metrics::FEATURE_POST_LABELS_LIST, &result);
57 result
58}
Added lib/post/features/post_label/usecase/list_for_post.rs lib/post/features/post_label/usecase/list_for_post.rs +43 −0 View lib/post/features/post_label/usecase/list_for_post.rs
@@ -0,0 +1,43 @@
1use db::conn::sea_orm::*;
2use db::post::post_labels as label_entity;
3use db::post::post_relation_label as rel_entity;
4use uuid::Uuid;
5
6use crate::error::PostResult;
7use crate::features::PostService;
8use crate::metrics;
9
10use crate::features::post::usecase::load_post;
11use super::super::PostLabelView;
12use super::helpers::require_authenticated;
13
14pub async fn list_post_labels_for_post(
15 svc: &PostService,
16 actor: Uuid,
17 channel_id: Uuid,
18 post_id: Uuid,
19) -> PostResult<Vec<PostLabelView>> {
20 let _timer = metrics::Timer::start(metrics::FEATURE_POST_LABELS_LIST_FOR_POST);
21 let result: PostResult<Vec<PostLabelView>> = async {
22 require_authenticated(actor)?;
23 load_post(svc, channel_id, post_id).await?;
24
25 let db = svc.db.reader();
26 let rels = rel_entity::Entity::find()
27 .filter(rel_entity::Column::PostId.eq(post_id))
28 .all(&db)
29 .await?;
30 let label_ids: Vec<Uuid> = rels.into_iter().map(|r| r.label_id).collect();
31 if label_ids.is_empty() {
32 return Ok(Vec::new());
33 }
34 let rows = label_entity::Entity::find()
35 .filter(label_entity::Column::Id.is_in(label_ids))
36 .all(&db)
37 .await?;
38 Ok(rows.into_iter().map(PostLabelView::from).collect())
39 }
40 .await;
41 metrics::record_outcome(metrics::FEATURE_POST_LABELS_LIST_FOR_POST, &result);
42 result
43}
Added lib/post/features/post_label/usecase/mod.rs lib/post/features/post_label/usecase/mod.rs +19 −0 View lib/post/features/post_label/usecase/mod.rs
@@ -0,0 +1,19 @@
1mod bind;
2mod create;
3mod delete;
4mod get;
5mod helpers;
6mod list;
7mod list_for_post;
8mod unbind;
9mod update;
10
11pub use bind::bind_post_label;
12pub use create::create_post_label;
13pub use delete::delete_post_label;
14pub use get::get_post_label;
15pub use helpers::{load_post_label, require_authenticated};
16pub use list::list_post_labels;
17pub use list_for_post::list_post_labels_for_post;
18pub use unbind::unbind_post_label;
19pub use update::update_post_label;
Added lib/post/features/post_label/usecase/unbind.rs lib/post/features/post_label/usecase/unbind.rs +43 −0 View lib/post/features/post_label/usecase/unbind.rs
@@ -0,0 +1,43 @@
1use db::conn::sea_orm::*;
2use db::post::post_relation_label as rel_entity;
3use uuid::Uuid;
4
5use crate::error::{PostError, PostResult};
6use crate::features::PostService;
7use crate::metrics;
8
9use crate::features::post::usecase::load_post;
10use super::helpers::{load_post_label, require_authenticated};
11
12pub async fn unbind_post_label(
13 svc: &PostService,
14 actor: Uuid,
15 channel_id: Uuid,
16 post_id: Uuid,
17 label_id: Uuid,
18) -> PostResult<()> {
19 let _timer = metrics::Timer::start(metrics::FEATURE_POST_LABELS_UNBIND);
20 let result: PostResult<()> = async {
21 require_authenticated(actor)?;
22 let _post = load_post(svc, channel_id, post_id).await?;
23 let _label = load_post_label(svc, channel_id, label_id).await?;
24
25 let db = svc.db.reader();
26 let rel = rel_entity::Entity::find()
27 .filter(rel_entity::Column::PostId.eq(post_id))
28 .filter(rel_entity::Column::LabelId.eq(label_id))
29 .one(&db)
30 .await?
31 .ok_or_else(|| {
32 PostError::NotFound(format!("label {label_id} not bound to post {post_id}"))
33 })?;
34
35 let db = svc.db.writer();
36 let active: rel_entity::ActiveModel = rel.into();
37 active.delete(&db).await?;
38 Ok(())
39 }
40 .await;
41 metrics::record_outcome(metrics::FEATURE_POST_LABELS_UNBIND, &result);
42 result
43}
Added lib/post/features/post_label/usecase/update.rs lib/post/features/post_label/usecase/update.rs +57 −0 View lib/post/features/post_label/usecase/update.rs
@@ -0,0 +1,57 @@
1use db::conn::sea_orm::*;
2use time::OffsetDateTime;
3use uuid::Uuid;
4
5use crate::error::{PostError, PostResult};
6use crate::features::PostService;
7use crate::metrics;
8
9use super::super::{PostLabelView, UpdatePostLabelOption};
10use super::create::{MAX_LABEL_COLOR_LEN, MAX_LABEL_NAME_LEN};
11use super::helpers::{load_post_label, require_authenticated};
12
13pub async fn update_post_label(
14 svc: &PostService,
15 actor: Uuid,
16 channel_id: Uuid,
17 label_id: Uuid,
18 input: UpdatePostLabelOption,
19) -> PostResult<PostLabelView> {
20 let _timer = metrics::Timer::start(metrics::FEATURE_POST_LABELS_UPDATE);
21 let result: PostResult<PostLabelView> = async {
22 require_authenticated(actor)?;
23 let cur = load_post_label(svc, channel_id, label_id).await?;
24
25 if let Some(ref name) = input.name
26 && (name.trim().is_empty() || name.len() > MAX_LABEL_NAME_LEN)
27 {
28 return Err(PostError::BadRequest(format!(
29 "label name length must be in 1..={MAX_LABEL_NAME_LEN}"
30 )));
31 }
32 if let Some(ref color) = input.color
33 && (color.trim().is_empty() || color.len() > MAX_LABEL_COLOR_LEN)
34 {
35 return Err(PostError::BadRequest("invalid label color".into()));
36 }
37
38 let db = svc.db.writer();
39 let mut active: db::post::post_labels::ActiveModel = cur.into();
40 if let Some(name) = input.name {
41 active.name = Set(name.trim().to_string());
42 }
43 if let Some(color) = input.color {
44 active.color = Set(color.trim().to_string());
45 }
46 if let Some(is_archived) = input.is_archived {
47 active.is_archived = Set(is_archived);
48 }
49 active.updated_at = Set(Some(OffsetDateTime::now_utc()));
50
51 let saved = active.update(&db).await?;
52 Ok(PostLabelView::from(saved))
53 }
54 .await;
55 metrics::record_outcome(metrics::FEATURE_POST_LABELS_UPDATE, &result);
56 result
57}
Added lib/post/features/post_label/impls.rs lib/post/features/post_label/impls.rs +89 −0 View lib/post/features/post_label/impls.rs
@@ -0,0 +1,89 @@
1use uuid::Uuid;
2
3use crate::error::PostResult;
4use crate::features::PostService;
5
6use super::usecase;
7use super::{
8 CreatePostLabelOption, PostLabelPage, PostLabelView, UpdatePostLabelOption,
9};
10
11impl PostService {
12 pub async fn create_post_label(
13 &self,
14 actor: Uuid,
15 channel_id: Uuid,
16 input: CreatePostLabelOption,
17 ) -> PostResult<PostLabelView> {
18 usecase::create_post_label(self, actor, channel_id, input).await
19 }
20
21 pub async fn get_post_label(
22 &self,
23 actor: Uuid,
24 channel_id: Uuid,
25 label_id: Uuid,
26 ) -> PostResult<PostLabelView> {
27 usecase::get_post_label(self, actor, channel_id, label_id).await
28 }
29
30 pub async fn update_post_label(
31 &self,
32 actor: Uuid,
33 channel_id: Uuid,
34 label_id: Uuid,
35 input: UpdatePostLabelOption,
36 ) -> PostResult<PostLabelView> {
37 usecase::update_post_label(self, actor, channel_id, label_id, input).await
38 }
39
40 pub async fn delete_post_label(
41 &self,
42 actor: Uuid,
43 channel_id: Uuid,
44 label_id: Uuid,
45 ) -> PostResult<()> {
46 usecase::delete_post_label(self, actor, channel_id, label_id).await
47 }
48
49 pub async fn list_post_labels(
50 &self,
51 actor: Uuid,
52 channel_id: Uuid,
53 q: Option<String>,
54 is_archived: Option<bool>,
55 limit: Option<u64>,
56 offset: Option<u64>,
57 ) -> PostResult<PostLabelPage> {
58 usecase::list_post_labels(self, actor, channel_id, q, is_archived, limit, offset).await
59 }
60
61 pub async fn bind_post_label(
62 &self,
63 actor: Uuid,
64 channel_id: Uuid,
65 post_id: Uuid,
66 label_id: Uuid,
67 ) -> PostResult<()> {
68 usecase::bind_post_label(self, actor, channel_id, post_id, label_id).await
69 }
70
71 pub async fn unbind_post_label(
72 &self,
73 actor: Uuid,
74 channel_id: Uuid,
75 post_id: Uuid,
76 label_id: Uuid,
77 ) -> PostResult<()> {
78 usecase::unbind_post_label(self, actor, channel_id, post_id, label_id).await
79 }
80
81 pub async fn list_post_labels_for_post(
82 &self,
83 actor: Uuid,
84 channel_id: Uuid,
85 post_id: Uuid,
86 ) -> PostResult<Vec<PostLabelView>> {
87 usecase::list_post_labels_for_post(self, actor, channel_id, post_id).await
88 }
89}
Added lib/post/features/post_label/mod.rs lib/post/features/post_label/mod.rs +4 −0 View lib/post/features/post_label/mod.rs
@@ -0,0 +1,4 @@
1pub mod impls;
2pub mod usecase;
3
4pub use export::post::views::*;
Added lib/post/features/post_mention/usecase/create.rs lib/post/features/post_mention/usecase/create.rs +56 −0 View lib/post/features/post_mention/usecase/create.rs
@@ -0,0 +1,56 @@
1use db::conn::sea_orm::*;
2use db::post::post_mentions as mention_entity;
3use db::post::post_mentions::MentionTarget;
4use time::OffsetDateTime;
5use uuid::Uuid;
6
7use crate::error::{PostError, PostResult};
8use crate::features::PostService;
9use crate::metrics;
10
11use crate::features::post::usecase::load_post;
12use super::super::{CreateMentionOption, PostMentionView};
13
14pub async fn create_post_mention(
15 svc: &PostService,
16 actor: Uuid,
17 channel_id: Uuid,
18 post_id: Uuid,
19 input: CreateMentionOption,
20) -> PostResult<PostMentionView> {
21 let _timer = metrics::Timer::start(metrics::FEATURE_POST_MENTIONS_CREATE);
22 let result: PostResult<PostMentionView> = async {
23 if actor.is_nil() {
24 return Err(PostError::Unauthorized(
25 "authentication required".into(),
26 ));
27 }
28 if input.user_id.is_none() && input.role_id.is_none() && !input.is_everyone && !input.is_here
29 {
30 return Err(PostError::BadRequest(
31 "mention requires a user, role, @everyone or @here target".into(),
32 ));
33 }
34
35 load_post(svc, channel_id, post_id).await?;
36
37 let db = svc.db.writer();
38 let id = Uuid::now_v7();
39 let active: mention_entity::ActiveModel = mention_entity::ActiveModel::builder()
40 .set_id(id)
41 .set_target_id(post_id)
42 .set_target(MentionTarget::Post)
43 .set_user_id(input.user_id)
44 .set_role_id(input.role_id)
45 .set_channel_id(None)
46 .set_is_everyone(input.is_everyone)
47 .set_is_here(input.is_here)
48 .set_created_at(OffsetDateTime::now_utc())
49 .into();
50 let saved = active.insert(&db).await?;
51 Ok(PostMentionView::from(saved))
52 }
53 .await;
54 metrics::record_outcome(metrics::FEATURE_POST_MENTIONS_CREATE, &result);
55 result
56}
Added lib/post/features/post_mention/usecase/list.rs lib/post/features/post_mention/usecase/list.rs +55 −0 View lib/post/features/post_mention/usecase/list.rs
@@ -0,0 +1,55 @@
1use db::conn::sea_orm::*;
2use db::post::post_mentions as mention_entity;
3use db::post::post_mentions::MentionTarget;
4use uuid::Uuid;
5
6use crate::error::{PostError, PostResult};
7use crate::features::PostService;
8use crate::metrics;
9
10use crate::features::post::usecase::load_post;
11use super::super::PostMentionView;
12
13const MAX_PAGINATION: u64 = 100;
14const DEFAULT_PAGINATION: u64 = 50;
15
16pub async fn list_post_mentions(
17 svc: &PostService,
18 actor: Uuid,
19 channel_id: Uuid,
20 post_id: Uuid,
21 limit: Option<u64>,
22 offset: Option<u64>,
23) -> PostResult<Vec<PostMentionView>> {
24 let _timer = metrics::Timer::start(metrics::FEATURE_POST_MENTIONS_LIST);
25 let result: PostResult<Vec<PostMentionView>> = async {
26 if actor.is_nil() {
27 return Err(PostError::Unauthorized(
28 "authentication required".into(),
29 ));
30 }
31 let limit = limit.unwrap_or(DEFAULT_PAGINATION);
32 let offset = offset.unwrap_or(0);
33 if limit == 0 || limit > MAX_PAGINATION {
34 return Err(PostError::BadRequest(format!(
35 "limit must be in 1..={MAX_PAGINATION}"
36 )));
37 }
38
39 load_post(svc, channel_id, post_id).await?;
40
41 let db = svc.db.reader();
42 let rows = mention_entity::Entity::find()
43 .filter(mention_entity::Column::TargetId.eq(post_id))
44 .filter(mention_entity::Column::Target.eq(MentionTarget::Post))
45 .order_by_desc(mention_entity::Column::CreatedAt)
46 .limit(limit)
47 .offset(offset)
48 .all(&db)
49 .await?;
50 Ok(rows.into_iter().map(PostMentionView::from).collect())
51 }
52 .await;
53 metrics::record_outcome(metrics::FEATURE_POST_MENTIONS_LIST, &result);
54 result
55}
Added lib/post/features/post_mention/usecase/mod.rs lib/post/features/post_mention/usecase/mod.rs +5 −0 View lib/post/features/post_mention/usecase/mod.rs
@@ -0,0 +1,5 @@
1mod create;
2mod list;
3
4pub use create::create_post_mention;
5pub use list::list_post_mentions;
Added lib/post/features/post_mention/impls.rs lib/post/features/post_mention/impls.rs +30 −0 View lib/post/features/post_mention/impls.rs
@@ -0,0 +1,30 @@
1use uuid::Uuid;
2
3use crate::error::PostResult;
4use crate::features::PostService;
5
6use super::usecase;
7use super::{CreateMentionOption, PostMentionView};
8
9impl PostService {
10 pub async fn create_post_mention(
11 &self,
12 actor: Uuid,
13 channel_id: Uuid,
14 post_id: Uuid,
15 input: CreateMentionOption,
16 ) -> PostResult<PostMentionView> {
17 usecase::create_post_mention(self, actor, channel_id, post_id, input).await
18 }
19
20 pub async fn list_post_mentions(
21 &self,
22 actor: Uuid,
23 channel_id: Uuid,
24 post_id: Uuid,
25 limit: Option<u64>,
26 offset: Option<u64>,
27 ) -> PostResult<Vec<PostMentionView>> {
28 usecase::list_post_mentions(self, actor, channel_id, post_id, limit, offset).await
29 }
30}
Added lib/post/features/post_mention/mod.rs lib/post/features/post_mention/mod.rs +4 −0 View lib/post/features/post_mention/mod.rs
@@ -0,0 +1,4 @@
1pub mod impls;
2pub mod usecase;
3
4pub use export::post::views::*;
Added lib/post/features/post_reaction/usecase/create.rs lib/post/features/post_reaction/usecase/create.rs +71 −0 View lib/post/features/post_reaction/usecase/create.rs
@@ -0,0 +1,71 @@
1use db::conn::sea_orm::*;
2use db::post::post_reactions as reaction_entity;
3use db::post::post_reactions::ReactionTarget;
4use time::OffsetDateTime;
5use uuid::Uuid;
6
7use crate::error::{PostError, PostResult};
8use crate::features::PostService;
9use crate::metrics;
10
11use crate::features::post::usecase::load_post;
12use super::super::{CreatePostReactionOption, PostReactionView};
13
14pub const MAX_EMOJI_LEN: usize = 32;
15
16fn require_authenticated(actor: Uuid) -> PostResult<()> {
17 if actor.is_nil() {
18 return Err(PostError::Unauthorized("authentication required".into()));
19 }
20 Ok(())
21}
22
23pub async fn create_post_reaction(
24 svc: &PostService,
25 actor: Uuid,
26 channel_id: Uuid,
27 post_id: Uuid,
28 input: CreatePostReactionOption,
29) -> PostResult<PostReactionView> {
30 let _timer = metrics::Timer::start(metrics::FEATURE_POST_REACTIONS_CREATE);
31 let result: PostResult<PostReactionView> = async {
32 require_authenticated(actor)?;
33
34 let emoji = input.emoji.trim().to_string();
35 if emoji.is_empty() || emoji.len() > MAX_EMOJI_LEN {
36 return Err(PostError::BadRequest("invalid emoji".into()));
37 }
38
39 load_post(svc, channel_id, post_id).await?;
40
41 let db = svc.db.reader();
42 let existing = reaction_entity::Entity::find()
43 .filter(reaction_entity::Column::TargetId.eq(post_id))
44 .filter(reaction_entity::Column::Target.eq(ReactionTarget::Post))
45 .filter(reaction_entity::Column::UserId.eq(actor))
46 .filter(reaction_entity::Column::Emoji.eq(&emoji))
47 .one(&db)
48 .await?;
49 if existing.is_some() {
50 return Err(PostError::Conflict(format!(
51 "reaction {emoji} already exists from user {actor}"
52 )));
53 }
54
55 let db = svc.db.writer();
56 let id = Uuid::now_v7();
57 let active: reaction_entity::ActiveModel = reaction_entity::ActiveModel::builder()
58 .set_id(id)
59 .set_target_id(post_id)
60 .set_target(ReactionTarget::Post)
61 .set_user_id(actor)
62 .set_emoji(emoji)
63 .set_created_at(OffsetDateTime::now_utc())
64 .into();
65 let saved = active.insert(&db).await?;
66 Ok(PostReactionView::from(saved))
67 }
68 .await;
69 metrics::record_outcome(metrics::FEATURE_POST_REACTIONS_CREATE, &result);
70 result
71}
Added lib/post/features/post_reaction/usecase/delete.rs lib/post/features/post_reaction/usecase/delete.rs +46 −0 View lib/post/features/post_reaction/usecase/delete.rs
@@ -0,0 +1,46 @@
1use db::conn::sea_orm::*;
2use db::post::post_reactions as reaction_entity;
3use uuid::Uuid;
4
5use crate::error::{PostError, PostResult};
6use crate::features::PostService;
7use crate::metrics;
8
9use crate::features::post::usecase::load_post;
10
11pub async fn delete_post_reaction(
12 svc: &PostService,
13 actor: Uuid,
14 channel_id: Uuid,
15 post_id: Uuid,
16 reaction_id: Uuid,
17) -> PostResult<()> {
18 let _timer = metrics::Timer::start(metrics::FEATURE_POST_REACTIONS_DELETE);
19 let result: PostResult<()> = async {
20 if actor.is_nil() {
21 return Err(PostError::Unauthorized(
22 "authentication required".into(),
23 ));
24 }
25 load_post(svc, channel_id, post_id).await?;
26
27 let db = svc.db.reader();
28 let cur = reaction_entity::Entity::find_by_id(reaction_id)
29 .filter(reaction_entity::Column::TargetId.eq(post_id))
30 .one(&db)
31 .await?
32 .ok_or_else(|| PostError::NotFound(format!("reaction {reaction_id}")))?;
33 if cur.user_id != actor {
34 return Err(PostError::Forbidden(
35 "only the reaction owner can delete".into(),
36 ));
37 }
38 let db = svc.db.writer();
39 let active: reaction_entity::ActiveModel = cur.into();
40 active.delete(&db).await?;
41 Ok(())
42 }
43 .await;
44 metrics::record_outcome(metrics::FEATURE_POST_REACTIONS_DELETE, &result);
45 result
46}
Added lib/post/features/post_reaction/usecase/list.rs lib/post/features/post_reaction/usecase/list.rs +55 −0 View lib/post/features/post_reaction/usecase/list.rs
@@ -0,0 +1,55 @@
1use db::conn::sea_orm::*;
2use db::post::post_reactions as reaction_entity;
3use db::post::post_reactions::ReactionTarget;
4use uuid::Uuid;
5
6use crate::error::{PostError, PostResult};
7use crate::features::PostService;
8use crate::metrics;
9
10use crate::features::post::usecase::load_post;
11use super::super::PostReactionView;
12
13const MAX_PAGINATION: u64 = 100;
14const DEFAULT_PAGINATION: u64 = 50;
15
16pub async fn list_post_reactions(
17 svc: &PostService,
18 actor: Uuid,
19 channel_id: Uuid,
20 post_id: Uuid,
21 limit: Option<u64>,
22 offset: Option<u64>,
23) -> PostResult<Vec<PostReactionView>> {
24 let _timer = metrics::Timer::start(metrics::FEATURE_POST_REACTIONS_LIST);
25 let result: PostResult<Vec<PostReactionView>> = async {
26 if actor.is_nil() {
27 return Err(PostError::Unauthorized(
28 "authentication required".into(),
29 ));
30 }
31 let limit = limit.unwrap_or(DEFAULT_PAGINATION);
32 let offset = offset.unwrap_or(0);
33 if limit == 0 || limit > MAX_PAGINATION {
34 return Err(PostError::BadRequest(format!(
35 "limit must be in 1..={MAX_PAGINATION}"
36 )));
37 }
38
39 load_post(svc, channel_id, post_id).await?;
40
41 let db = svc.db.reader();
42 let rows = reaction_entity::Entity::find()
43 .filter(reaction_entity::Column::TargetId.eq(post_id))
44 .filter(reaction_entity::Column::Target.eq(ReactionTarget::Post))
45 .order_by_desc(reaction_entity::Column::CreatedAt)
46 .limit(limit)
47 .offset(offset)
48 .all(&db)
49 .await?;
50 Ok(rows.into_iter().map(PostReactionView::from).collect())
51 }
52 .await;
53 metrics::record_outcome(metrics::FEATURE_POST_REACTIONS_LIST, &result);
54 result
55}
Added lib/post/features/post_reaction/usecase/mod.rs lib/post/features/post_reaction/usecase/mod.rs +7 −0 View lib/post/features/post_reaction/usecase/mod.rs
@@ -0,0 +1,7 @@
1mod create;
2mod delete;
3mod list;
4
5pub use create::create_post_reaction;
6pub use delete::delete_post_reaction;
7pub use list::list_post_reactions;
Added lib/post/features/post_reaction/impls.rs lib/post/features/post_reaction/impls.rs +40 −0 View lib/post/features/post_reaction/impls.rs
@@ -0,0 +1,40 @@
1use uuid::Uuid;
2
3use crate::error::PostResult;
4use crate::features::PostService;
5
6use super::usecase;
7use super::{CreatePostReactionOption, PostReactionView};
8
9impl PostService {
10 pub async fn create_post_reaction(
11 &self,
12 actor: Uuid,
13 channel_id: Uuid,
14 post_id: Uuid,
15 input: CreatePostReactionOption,
16 ) -> PostResult<PostReactionView> {
17 usecase::create_post_reaction(self, actor, channel_id, post_id, input).await
18 }
19
20 pub async fn delete_post_reaction(
21 &self,
22 actor: Uuid,
23 channel_id: Uuid,
24 post_id: Uuid,
25 reaction_id: Uuid,
26 ) -> PostResult<()> {
27 usecase::delete_post_reaction(self, actor, channel_id, post_id, reaction_id).await
28 }
29
30 pub async fn list_post_reactions(
31 &self,
32 actor: Uuid,
33 channel_id: Uuid,
34 post_id: Uuid,
35 limit: Option<u64>,
36 offset: Option<u64>,
37 ) -> PostResult<Vec<PostReactionView>> {
38 usecase::list_post_reactions(self, actor, channel_id, post_id, limit, offset).await
39 }
40}
Added lib/post/features/post_reaction/mod.rs lib/post/features/post_reaction/mod.rs +4 −0 View lib/post/features/post_reaction/mod.rs
@@ -0,0 +1,4 @@
1pub mod impls;
2pub mod usecase;
3
4pub use export::post::views::*;
Added lib/post/features/post_reply/usecase/create.rs lib/post/features/post_reply/usecase/create.rs +89 −0 View lib/post/features/post_reply/usecase/create.rs
@@ -0,0 +1,89 @@
1use db::conn::sea_orm::*;
2use time::OffsetDateTime;
3use uuid::Uuid;
4
5use crate::error::{PostError, PostResult};
6use crate::features::PostService;
7
8use crate::features::post::usecase::load_post;
9use super::helpers::require_authenticated;
10
11/// Ensure a reply's parent reply (when given) belongs to the same post.
12pub async fn ensure_parent_reply(
13 svc: &PostService,
14 post_id: Uuid,
15 parent_reply_id: Uuid,
16) -> PostResult<()> {
17 let db = svc.db.reader();
18 let parent = db::post::post_replies::Entity::find_by_id(parent_reply_id)
19 .filter(db::post::post_replies::Column::PostId.eq(post_id))
20 .one(&db)
21 .await?
22 .ok_or_else(|| PostError::NotFound(format!("reply {parent_reply_id}")))?;
23 if parent.deleted_at.is_some() {
24 return Err(PostError::NotFound(format!("reply {parent_reply_id}")));
25 }
26 Ok(())
27}
28
29pub async fn create_reply(
30 svc: &PostService,
31 actor: Uuid,
32 channel_id: Uuid,
33 post_id: Uuid,
34 input: super::super::CreateReplyOption,
35) -> PostResult<super::super::PostReplyView> {
36 let _timer = crate::metrics::Timer::start(crate::metrics::FEATURE_REPLIES_CREATE);
37 let result: PostResult<super::super::PostReplyView> = async {
38 require_authenticated(actor)?;
39
40 let body = input.body.trim().to_string();
41 if body.is_empty() || body.len() > MAX_REPLY_BODY_LEN {
42 return Err(PostError::BadRequest(format!(
43 "reply body length must be in 1..={MAX_REPLY_BODY_LEN}"
44 )));
45 }
46 if let Some(parent_reply_id) = input.parent_reply_id {
47 ensure_parent_reply(svc, post_id, parent_reply_id).await?;
48 }
49
50 let post = load_post(svc, channel_id, post_id).await?;
51
52 let db = svc.db.writer();
53 let txn = db.begin().await?;
54
55 let now = OffsetDateTime::now_utc();
56 let reply_id = Uuid::now_v7();
57 let active: db::post::post_replies::ActiveModel =
58 db::post::post_replies::ActiveModel::builder()
59 .set_id(reply_id)
60 .set_post_id(post_id)
61 .set_author_id(actor)
62 .set_body(body)
63 .set_parent_reply_id(input.parent_reply_id)
64 .set_is_pinned(false)
65 .set_edited_at(None)
66 .set_created_at(now)
67 .set_updated_at(None)
68 .set_deleted_at(None)
69 .set_deleted_by(None)
70 .into();
71 let saved = active.insert(&txn).await?;
72
73 let reply_count = post.reply_count + 1;
74 let mut post_active: db::post::post::ActiveModel = post.into();
75 post_active.reply_count = Set(reply_count);
76 post_active.last_reply_at = Set(Some(now));
77 post_active.last_reply_by = Set(Some(actor));
78 post_active.updated_at = Set(Some(now));
79 post_active.update(&txn).await?;
80
81 txn.commit().await?;
82 Ok(saved.into())
83 }
84 .await;
85 crate::metrics::record_outcome(crate::metrics::FEATURE_REPLIES_CREATE, &result);
86 result
87}
88
89pub const MAX_REPLY_BODY_LEN: usize = 100_000;
Added lib/post/features/post_reply/usecase/helpers.rs lib/post/features/post_reply/usecase/helpers.rs +10 −0 View lib/post/features/post_reply/usecase/helpers.rs
@@ -0,0 +1,10 @@
1use uuid::Uuid;
2
3use crate::error::{PostError, PostResult};
4
5pub fn require_authenticated(actor: Uuid) -> PostResult<()> {
6 if actor.is_nil() {
7 return Err(PostError::Unauthorized("authentication required".into()));
8 }
9 Ok(())
10}
Added lib/post/features/post_reply/usecase/list.rs lib/post/features/post_reply/usecase/list.rs +57 −0 View lib/post/features/post_reply/usecase/list.rs
@@ -0,0 +1,57 @@
1use db::conn::sea_orm::*;
2use db::post::post_replies as reply_entity;
3use uuid::Uuid;
4
5use crate::error::{PostError, PostResult};
6use crate::features::PostService;
7use crate::metrics;
8
9use crate::features::post::usecase::load_post;
10use super::super::{PostReplyPage, PostReplyView};
11use super::helpers::require_authenticated;
12
13const MAX_PAGINATION: u64 = 100;
14const DEFAULT_PAGINATION: u64 = 20;
15
16pub async fn list_replies(
17 svc: &PostService,
18 actor: Uuid,
19 channel_id: Uuid,
20 post_id: Uuid,
21 limit: Option<u64>,
22 offset: Option<u64>,
23) -> PostResult<PostReplyPage> {
24 let _timer = metrics::Timer::start(metrics::FEATURE_REPLIES_LIST);
25 let result: PostResult<PostReplyPage> = async {
26 require_authenticated(actor)?;
27
28 let limit = limit.unwrap_or(DEFAULT_PAGINATION);
29 let offset = offset.unwrap_or(0);
30 if limit == 0 || limit > MAX_PAGINATION {
31 return Err(PostError::BadRequest(format!(
32 "limit must be in 1..={MAX_PAGINATION}"
33 )));
34 }
35
36 load_post(svc, channel_id, post_id).await?;
37
38 let db = svc.db.reader();
39 let finder = reply_entity::Entity::find()
40 .filter(reply_entity::Column::PostId.eq(post_id))
41 .filter(reply_entity::Column::DeletedAt.is_null());
42
43 let total = finder.clone().count(&db).await? as i64;
44 let rows = finder
45 .order_by_asc(reply_entity::Column::CreatedAt)
46 .limit(limit)
47 .offset(offset)
48 .all(&db)
49 .await?;
50
51 let items = rows.into_iter().map(PostReplyView::from).collect();
52 Ok(PostReplyPage { items, total })
53 }
54 .await;
55 metrics::record_outcome(metrics::FEATURE_REPLIES_LIST, &result);
56 result
57}
Added lib/post/features/post_reply/usecase/mod.rs lib/post/features/post_reply/usecase/mod.rs +7 −0 View lib/post/features/post_reply/usecase/mod.rs
@@ -0,0 +1,7 @@
1mod create;
2mod helpers;
3mod list;
4
5pub use create::create_reply;
6pub use helpers::require_authenticated;
7pub use list::list_replies;
Added lib/post/features/post_reply/impls.rs lib/post/features/post_reply/impls.rs +30 −0 View lib/post/features/post_reply/impls.rs
@@ -0,0 +1,30 @@
1use uuid::Uuid;
2
3use crate::error::PostResult;
4use crate::features::PostService;
5
6use super::usecase;
7use super::{CreateReplyOption, PostReplyPage, PostReplyView};
8
9impl PostService {
10 pub async fn create_reply(
11 &self,
12 actor: Uuid,
13 channel_id: Uuid,
14 post_id: Uuid,
15 input: CreateReplyOption,
16 ) -> PostResult<PostReplyView> {
17 usecase::create_reply(self, actor, channel_id, post_id, input).await
18 }
19
20 pub async fn list_replies(
21 &self,
22 actor: Uuid,
23 channel_id: Uuid,
24 post_id: Uuid,
25 limit: Option<u64>,
26 offset: Option<u64>,
27 ) -> PostResult<PostReplyPage> {
28 usecase::list_replies(self, actor, channel_id, post_id, limit, offset).await
29 }
30}
Added lib/post/features/post_reply/mod.rs lib/post/features/post_reply/mod.rs +4 −0 View lib/post/features/post_reply/mod.rs
@@ -0,0 +1,4 @@
1pub mod impls;
2pub mod usecase;
3
4pub use export::post::views::*;
Added lib/post/features/post_watch/usecase/helpers.rs lib/post/features/post_watch/usecase/helpers.rs +133 −0 View lib/post/features/post_watch/usecase/helpers.rs
@@ -0,0 +1,133 @@
1use db::common::watch_mode::WatchMode;
2use db::conn::sea_orm::*;
3use db::post::post_watch as watch_entity;
4use time::OffsetDateTime;
5use uuid::Uuid;
6
7use crate::error::{PostError, PostResult};
8use crate::features::PostService;
9use crate::metrics;
10
11use crate::features::post::usecase::load_post;
12use super::super::PostWatchView;
13
14pub fn require_authenticated(actor: Uuid) -> PostResult<()> {
15 if actor.is_nil() {
16 return Err(PostError::Unauthorized("authentication required".into()));
17 }
18 Ok(())
19}
20
21fn parse_mode(s: &str) -> PostResult<WatchMode> {
22 Ok(match s {
23 "normal" | "Normal" => WatchMode::Normal,
24 "no_watch" | "NoWatch" => WatchMode::NoWatch,
25 "watch" | "Watch" => WatchMode::Watch,
26 "ignore" | "Ignore" => WatchMode::Ignore,
27 other => {
28 return Err(PostError::BadRequest(format!(
29 "invalid watch mode: {other}"
30 )));
31 }
32 })
33}
34
35pub async fn load_my_watch(
36 svc: &PostService,
37 post_id: Uuid,
38 user_id: Uuid,
39) -> PostResult<watch_entity::Model> {
40 let db = svc.db.reader();
41 let row = watch_entity::Entity::find()
42 .filter(watch_entity::Column::PostId.eq(post_id))
43 .filter(watch_entity::Column::UserId.eq(user_id))
44 .one(&db)
45 .await?
46 .ok_or_else(|| PostError::NotFound("watch record".into()))?;
47 Ok(row)
48}
49
50pub async fn upsert_watch(
51 svc: &PostService,
52 actor: Uuid,
53 channel_id: Uuid,
54 post_id: Uuid,
55 mode_str: &str,
56) -> PostResult<PostWatchView> {
57 let _timer = metrics::Timer::start(metrics::FEATURE_POST_WATCHES_UPSERT);
58 let result: PostResult<PostWatchView> = async {
59 require_authenticated(actor)?;
60 load_post(svc, channel_id, post_id).await?;
61 let mode = parse_mode(mode_str)?;
62
63 let db = svc.db.reader();
64 let existing = watch_entity::Entity::find()
65 .filter(watch_entity::Column::PostId.eq(post_id))
66 .filter(watch_entity::Column::UserId.eq(actor))
67 .one(&db)
68 .await?;
69
70 let now = OffsetDateTime::now_utc();
71 let saved = if let Some(cur) = existing {
72 let db = svc.db.writer();
73 let mut active: watch_entity::ActiveModel = cur.into();
74 active.mode = Set(mode);
75 active.updated_at = Set(Some(now));
76 active.update(&db).await?
77 } else {
78 let db = svc.db.writer();
79 let active: watch_entity::ActiveModel = watch_entity::ActiveModel::builder()
80 .set_id(Uuid::now_v7())
81 .set_post_id(post_id)
82 .set_user_id(actor)
83 .set_mode(mode)
84 .set_created_at(now)
85 .set_updated_at(Some(now))
86 .into();
87 active.insert(&db).await?
88 };
89 Ok(PostWatchView::from(saved))
90 }
91 .await;
92 metrics::record_outcome(metrics::FEATURE_POST_WATCHES_UPSERT, &result);
93 result
94}
95
96pub async fn get_watch(
97 svc: &PostService,
98 actor: Uuid,
99 channel_id: Uuid,
100 post_id: Uuid,
101) -> PostResult<PostWatchView> {
102 let _timer = metrics::Timer::start(metrics::FEATURE_POST_WATCHES_GET);
103 let result: PostResult<PostWatchView> = async {
104 require_authenticated(actor)?;
105 load_post(svc, channel_id, post_id).await?;
106 let cur = load_my_watch(svc, post_id, actor).await?;
107 Ok(PostWatchView::from(cur))
108 }
109 .await;
110 metrics::record_outcome(metrics::FEATURE_POST_WATCHES_GET, &result);
111 result
112}
113
114pub async fn delete_watch(
115 svc: &PostService,
116 actor: Uuid,
117 channel_id: Uuid,
118 post_id: Uuid,
119) -> PostResult<()> {
120 let _timer = metrics::Timer::start(metrics::FEATURE_POST_WATCHES_DELETE);
121 let result: PostResult<()> = async {
122 require_authenticated(actor)?;
123 load_post(svc, channel_id, post_id).await?;
124 let cur = load_my_watch(svc, post_id, actor).await?;
125 let db = svc.db.writer();
126 let active: watch_entity::ActiveModel = cur.into();
127 active.delete(&db).await?;
128 Ok(())
129 }
130 .await;
131 metrics::record_outcome(metrics::FEATURE_POST_WATCHES_DELETE, &result);
132 result
133}
Added lib/post/features/post_watch/usecase/mod.rs lib/post/features/post_watch/usecase/mod.rs +3 −0 View lib/post/features/post_watch/usecase/mod.rs
@@ -0,0 +1,3 @@
1mod helpers;
2
3pub use helpers::{delete_watch, get_watch, upsert_watch};
Added lib/post/features/post_watch/impls.rs lib/post/features/post_watch/impls.rs +37 −0 View lib/post/features/post_watch/impls.rs
@@ -0,0 +1,37 @@
1use uuid::Uuid;
2
3use crate::error::PostResult;
4use crate::features::PostService;
5
6use super::usecase;
7use super::{PostWatchView, UpsertPostWatchOption};
8
9impl PostService {
10 pub async fn upsert_watch(
11 &self,
12 actor: Uuid,
13 channel_id: Uuid,
14 post_id: Uuid,
15 input: UpsertPostWatchOption,
16 ) -> PostResult<PostWatchView> {
17 usecase::upsert_watch(self, actor, channel_id, post_id, &input.mode).await
18 }
19
20 pub async fn get_watch(
21 &self,
22 actor: Uuid,
23 channel_id: Uuid,
24 post_id: Uuid,
25 ) -> PostResult<PostWatchView> {
26 usecase::get_watch(self, actor, channel_id, post_id).await
27 }
28
29 pub async fn delete_watch(
30 &self,
31 actor: Uuid,
32 channel_id: Uuid,
33 post_id: Uuid,
34 ) -> PostResult<()> {
35 usecase::delete_watch(self, actor, channel_id, post_id).await
36 }
37}
Added lib/post/features/post_watch/mod.rs lib/post/features/post_watch/mod.rs +4 −0 View lib/post/features/post_watch/mod.rs
@@ -0,0 +1,4 @@
1pub mod impls;
2pub mod usecase;
3
4pub use export::post::views::*;
Added lib/post/features/posts/usecase/create.rs lib/post/features/posts/usecase/create.rs +91 −0 View lib/post/features/posts/usecase/create.rs
@@ -0,0 +1,91 @@
1use db::conn::sea_orm::*;
2use db::post::posts as posts_entity;
3use space::error::SpaceError;
4use space::features::channels::usecase::ensure_channel_for_resource;
5use time::OffsetDateTime;
6use uuid::Uuid;
7
8use crate::error::{PostError, PostResult};
9use crate::features::PostService;
10use crate::metrics;
11
12use super::super::{CreatePostBoardOption, PostBoardView};
13use super::helpers::require_authenticated;
14
15impl From<SpaceError> for PostError {
16 fn from(e: SpaceError) -> Self {
17 match e {
18 SpaceError::BadRequest(s) => PostError::BadRequest(s),
19 SpaceError::Unauthorized(s) => PostError::Unauthorized(s),
20 SpaceError::Forbidden(s) => PostError::Forbidden(s),
21 SpaceError::NotFound(s) => PostError::NotFound(s),
22 SpaceError::Conflict(s) => PostError::Conflict(s),
23 SpaceError::RateLimited(s) => PostError::RateLimited(s),
24 SpaceError::Internal(s) => PostError::Internal(s),
25 SpaceError::Sqlx(e) => PostError::Sqlx(e),
26 SpaceError::Uuid(e) => PostError::Uuid(e),
27 }
28 }
29}
30
31pub const MAX_BOARD_NAME_LEN: usize = 64;
32
33pub async fn create_post_collection(
34 svc: &PostService,
35 actor: Uuid,
36 space_id: Uuid,
37 input: CreatePostBoardOption,
38) -> PostResult<PostBoardView> {
39 let _timer = metrics::Timer::start(metrics::FEATURE_POST_BOARDS_CREATE);
40 let result: PostResult<PostBoardView> = async {
41 require_authenticated(actor)?;
42
43 let name = input.name.trim().to_string();
44 if name.is_empty() || name.len() > MAX_BOARD_NAME_LEN {
45 return Err(PostError::BadRequest(format!(
46 "collection name length must be in 1..={MAX_BOARD_NAME_LEN}"
47 )));
48 }
49
50 let now = OffsetDateTime::now_utc();
51 let collection_id = Uuid::now_v7();
52
53 let saved: posts_entity::Model = svc
54 .db
55 .writer()
56 .transaction(|txn| {
57 Box::pin(async move {
58 let object_channel = ensure_channel_for_resource(
59 txn,
60 space_id,
61 input.parent_dir,
62 &name,
63 actor,
64 )
65 .await?;
66 let active: posts_entity::ActiveModel =
67 posts_entity::ActiveModel::builder()
68 .set_id(collection_id)
69 .set_channel_id(object_channel.id)
70 .set_name(name)
71 .set_icon(input.icon)
72 .set_description(input.description)
73 .set_created_at(now)
74 .set_updated_at(None)
75 .into();
76 Ok(posts_entity::Entity::insert(active)
77 .exec_with_returning(txn)
78 .await?)
79 })
80 })
81 .await
82 .map_err(|e| match e {
83 sea_orm::TransactionError::Connection(err) => PostError::Sqlx(err),
84 sea_orm::TransactionError::Transaction(err) => err,
85 })?;
86 Ok(PostBoardView::from(saved))
87 }
88 .await;
89 metrics::record_outcome(metrics::FEATURE_POST_BOARDS_CREATE, &result);
90 result
91}
Added lib/post/features/posts/usecase/helpers.rs lib/post/features/posts/usecase/helpers.rs +78 −0 View lib/post/features/posts/usecase/helpers.rs
@@ -0,0 +1,78 @@
1use db::channel::channels as channel_entity;
2use db::conn::sea_orm::*;
3use db::post::posts as posts_entity;
4use time::OffsetDateTime;
5use uuid::Uuid;
6
7use crate::error::{PostError, PostResult};
8use crate::features::PostService;
9
10/// The default name used when bootstrapping a space's first posts board.
11pub const DEFAULT_BOARD_NAME: &str = "Posts";
12
13pub fn require_authenticated(actor: Uuid) -> PostResult<()> {
14 if actor.is_nil() {
15 return Err(PostError::Unauthorized("authentication required".into()));
16 }
17 Ok(())
18}
19
20/// Find the first posts collection of a space (via its channel), if any.
21pub async fn find_board_by_space<C: ConnectionTrait>(
22 db: &C,
23 space_id: Uuid,
24) -> PostResult<Option<posts_entity::Model>> {
25 Ok(posts_entity::Entity::find()
26 .inner_join(channel_entity::Entity)
27 .filter(channel_entity::Column::SpaceId.eq(space_id))
28 .order_by_asc(posts_entity::Column::CreatedAt)
29 .one(db)
30 .await?)
31}
32
33/// Find the first posts collection hosted by a channel, if any.
34pub async fn find_board_by_channel<C: ConnectionTrait>(
35 db: &C,
36 channel_id: Uuid,
37) -> PostResult<Option<posts_entity::Model>> {
38 Ok(posts_entity::Entity::find()
39 .filter(posts_entity::Column::ChannelId.eq(channel_id))
40 .order_by_asc(posts_entity::Column::CreatedAt)
41 .one(db)
42 .await?)
43}
44
45/// Load the default posts collection of a channel.
46pub async fn load_board(svc: &PostService, channel_id: Uuid) -> PostResult<posts_entity::Model> {
47 let db = svc.db.reader();
48 find_board_by_channel(&db, channel_id)
49 .await?
50 .ok_or_else(|| PostError::NotFound(format!("posts board for channel {channel_id}")))
51}
52
53/// Ensure a default posts collection exists for a channel, creating one
54/// with [`DEFAULT_BOARD_NAME`] when missing. Call inside a transaction for
55/// write operations.
56pub async fn ensure_default_collection<C: ConnectionTrait>(
57 db: &C,
58 channel_id: Uuid,
59 created_by: Uuid,
60) -> PostResult<posts_entity::Model> {
61 if let Some(board) = find_board_by_channel(db, channel_id).await? {
62 return Ok(board);
63 }
64 let now = OffsetDateTime::now_utc();
65 let active: posts_entity::ActiveModel = posts_entity::ActiveModel::builder()
66 .set_id(Uuid::now_v7())
67 .set_channel_id(channel_id)
68 .set_name(DEFAULT_BOARD_NAME.to_string())
69 .set_icon(None)
70 .set_description(None)
71 .set_created_at(now)
72 .set_updated_at(None)
73 .into();
74 let _ = created_by;
75 Ok(posts_entity::Entity::insert(active)
76 .exec_with_returning(db)
77 .await?)
78}
Added lib/post/features/posts/usecase/list.rs lib/post/features/posts/usecase/list.rs +100 −0 View lib/post/features/posts/usecase/list.rs
@@ -0,0 +1,100 @@
1use db::conn::sea_orm::*;
2use db::post::post as post_entity;
3use db::post::posts as posts_entity;
4use uuid::Uuid;
5
6use crate::error::{PostError, PostResult};
7use crate::features::PostService;
8use crate::metrics;
9
10use super::super::{
11 ListPostQuery, PostBoardPage, PostBoardView, PostPage, PostStatusView, PostView,
12};
13use super::helpers::{load_board, require_authenticated};
14
15pub const MAX_PAGINATION: u64 = 100;
16pub const DEFAULT_PAGINATION: u64 = 20;
17
18pub async fn list_post_collections(
19 svc: &PostService,
20 actor: Uuid,
21 channel_id: Uuid,
22) -> PostResult<PostBoardPage> {
23 let _timer = metrics::Timer::start(metrics::FEATURE_POST_BOARDS_LIST);
24 let result: PostResult<PostBoardPage> = async {
25 require_authenticated(actor)?;
26
27 let db = svc.db.reader();
28 let rows = posts_entity::Entity::find()
29 .filter(posts_entity::Column::ChannelId.eq(channel_id))
30 .order_by_asc(posts_entity::Column::CreatedAt)
31 .all(&db)
32 .await?;
33 let total = rows.len() as i64;
34 let items = rows.into_iter().map(PostBoardView::from).collect();
35 Ok(PostBoardPage { items, total })
36 }
37 .await;
38 metrics::record_outcome(metrics::FEATURE_POST_BOARDS_LIST, &result);
39 result
40}
41
42pub async fn list_posts(
43 svc: &PostService,
44 actor: Uuid,
45 channel_id: Uuid,
46 q: ListPostQuery,
47) -> PostResult<PostPage> {
48 let _timer = metrics::Timer::start(metrics::FEATURE_POSTS_LIST);
49 let result: PostResult<PostPage> = async {
50 require_authenticated(actor)?;
51
52 let limit = q.limit.unwrap_or(DEFAULT_PAGINATION);
53 let offset = q.offset.unwrap_or(0);
54 if limit == 0 || limit > MAX_PAGINATION {
55 return Err(PostError::BadRequest(format!(
56 "limit must be in 1..={MAX_PAGINATION}"
57 )));
58 }
59
60 let collection = load_board(svc, channel_id).await?;
61 let db = svc.db.reader();
62
63 let finder = post_entity::Entity::find()
64 .filter(post_entity::Column::CollectionId.eq(collection.id))
65 .apply_if(q.status, |f, s| match s {
66 PostStatusView::Open => f.filter(post_entity::Column::Status.eq(
67 post_entity::PostStatus::Open,
68 )),
69 PostStatusView::Closed => f.filter(post_entity::Column::Status.eq(
70 post_entity::PostStatus::Closed,
71 )),
72 PostStatusView::Archived => f.filter(post_entity::Column::Status.eq(
73 post_entity::PostStatus::Archived,
74 )),
75 PostStatusView::Locked => f.filter(post_entity::Column::Status.eq(
76 post_entity::PostStatus::Locked,
77 )),
78 })
79 .apply_if(q.author_id, |f, uid| {
80 f.filter(post_entity::Column::AuthorId.eq(uid))
81 })
82 .apply_if(q.q, |f, s| {
83 f.filter(post_entity::Column::Title.contains(&s))
84 });
85
86 let total = finder.clone().count(&db).await? as i64;
87 let rows = finder
88 .order_by_desc(post_entity::Column::CreatedAt)
89 .limit(limit)
90 .offset(offset)
91 .all(&db)
92 .await?;
93
94 let items = rows.into_iter().map(PostView::from).collect();
95 Ok(PostPage { items, total })
96 }
97 .await;
98 metrics::record_outcome(metrics::FEATURE_POSTS_LIST, &result);
99 result
100}
Added lib/post/features/posts/usecase/mod.rs lib/post/features/posts/usecase/mod.rs +7 −0 View lib/post/features/posts/usecase/mod.rs
@@ -0,0 +1,7 @@
1mod create;
2pub mod helpers;
3mod list;
4
5pub use create::create_post_collection;
6pub use helpers::{ensure_default_collection, load_board, require_authenticated};
7pub use list::{list_post_collections, list_posts};
Added lib/post/features/posts/impls.rs lib/post/features/posts/impls.rs +35 −0 View lib/post/features/posts/impls.rs
@@ -0,0 +1,35 @@
1use uuid::Uuid;
2
3use crate::error::PostResult;
4use crate::features::PostService;
5
6use super::usecase;
7use super::{CreatePostBoardOption, ListPostQuery, PostBoardPage, PostBoardView, PostPage};
8
9impl PostService {
10 pub async fn create_post_collection(
11 &self,
12 actor: Uuid,
13 space_id: Uuid,
14 input: CreatePostBoardOption,
15 ) -> PostResult<PostBoardView> {
16 usecase::create_post_collection(self, actor, space_id, input).await
17 }
18
19 pub async fn list_post_collections(
20 &self,
21 actor: Uuid,
22 channel_id: Uuid,
23 ) -> PostResult<PostBoardPage> {
24 usecase::list_post_collections(self, actor, channel_id).await
25 }
26
27 pub async fn list_posts(
28 &self,
29 actor: Uuid,
30 channel_id: Uuid,
31 q: ListPostQuery,
32 ) -> PostResult<PostPage> {
33 usecase::list_posts(self, actor, channel_id, q).await
34 }
35}
Added lib/post/features/posts/mod.rs lib/post/features/posts/mod.rs +4 −0 View lib/post/features/posts/mod.rs
@@ -0,0 +1,4 @@
1pub mod impls;
2pub mod usecase;
3
4pub use export::post::views::*;
Added lib/post/features/authz.rs lib/post/features/authz.rs +86 −0 View lib/post/features/authz.rs
@@ -0,0 +1,86 @@
1//! Authorization helpers for the posts crate.
2//! `authorize_post` ensures the caller can mutate a post belonging to a
3//! given channel.
4use db::channel::channels as channel_entity;
5use db::conn::sea_orm::*;
6use db::space::space_members as member_entity;
7use db::space::spaces as space_entity;
8use db::user::users as user_entity;
9use uuid::Uuid;
10
11use crate::error::{PostError, PostResult};
12use crate::features::PostService;
13
14pub const MANAGE_POSTS: &str = "manage_posts";
15
16async fn is_site_admin(svc: &PostService, actor: Uuid) -> PostResult<bool> {
17 if actor.is_nil() {
18 return Ok(false);
19 }
20 let db = svc.db.reader();
21 let user = user_entity::Entity::find_by_id(actor)
22 .one(&db)
23 .await?
24 .ok_or_else(|| PostError::Unauthorized(format!("user {actor} not found")))?;
25 Ok(user.is_admin)
26}
27
28async fn is_active_member(
29 db: &DatabaseConnection,
30 space_id: Uuid,
31 user_id: Uuid,
32) -> PostResult<bool> {
33 let Some(member) = member_entity::Entity::find_by_id((space_id, user_id))
34 .one(db)
35 .await?
36 else {
37 return Ok(false);
38 };
39 Ok(member.status == member_entity::MemberStatus::Active)
40}
41
42/// - Site admins: always allowed.
43/// - Channel owner (top-level / space-less channel): allowed.
44pub async fn authorize_post(
45 svc: &PostService,
46 actor: Uuid,
47 channel_id: Uuid,
48) -> PostResult<()> {
49 if actor.is_nil() {
50 return Err(PostError::Unauthorized(
51 "authentication required".to_string(),
52 ));
53 }
54
55 let db = svc.db.reader();
56 let channel = channel_entity::Entity::find_by_id(channel_id)
57 .one(&db)
58 .await?
59 .ok_or_else(|| PostError::NotFound(format!("channel {channel_id}")))?;
60
61 if is_site_admin(svc, actor).await? {
62 return Ok(());
63 }
64
65 if channel.created_by == actor {
66 return Ok(());
67 }
68
69 if let Some(space_id) = channel.space_id {
70 if is_active_member(&db, space_id, actor).await? {
71 return Ok(());
72 }
73 let space_name = space_entity::Entity::find_by_id(space_id)
74 .one(&db)
75 .await?
76 .map(|s| s.lower_name)
77 .unwrap_or_else(|| space_id.to_string());
78 return Err(PostError::Forbidden(format!(
79 "not a member of space {space_name}"
80 )));
81 }
82
83 Err(PostError::Forbidden(format!(
84 "caller cannot mutate channel {channel_id}"
85 )))
86}
Added lib/post/features/lookup.rs lib/post/features/lookup.rs +53 −0 View lib/post/features/lookup.rs
@@ -0,0 +1,53 @@
1use db::channel::channels as channel_entity;
2use db::conn::sea_orm::*;
3use db::post::post as post_entity;
4use db::post::posts as posts_entity;
5use uuid::Uuid;
6
7use crate::error::{PostError, PostResult};
8use crate::features::PostService;
9
10/// Resolve the channel a post physically lives in, via a two-level
11/// traversal: `post.collection_id` → `posts.channel_id`.
12///
13/// Used by single-post handlers after space_name → space_id → active-member
14/// checks to obtain the internal channel id for business joins; the channel
15/// id is never exposed on the wire.
16pub async fn channel_for_post(svc: &PostService, post_id: Uuid) -> PostResult<Uuid> {
17 let db = svc.db.reader();
18 let post = post_entity::Entity::find_by_id(post_id)
19 .one(&db)
20 .await?
21 .ok_or_else(|| PostError::NotFound(format!("post {post_id}")))?;
22 channel_for_post_board_id(svc, post.collection_id).await
23}
24
25/// Resolve the board channel of a space: the channel hosting the space's
26/// first posts collection.
27///
28/// Used by board-level handlers that take `space_name` without a post
29/// number (board / label routes).
30pub async fn channel_for_post_board(svc: &PostService, space_id: Uuid) -> PostResult<Uuid> {
31 let db = svc.db.reader();
32 let board = posts_entity::Entity::find()
33 .inner_join(channel_entity::Entity)
34 .filter(channel_entity::Column::SpaceId.eq(space_id))
35 .order_by_asc(posts_entity::Column::CreatedAt)
36 .one(&db)
37 .await?
38 .ok_or_else(|| PostError::NotFound(format!("posts board for space {space_id}")))?;
39 Ok(board.channel_id)
40}
41
42/// Resolve the channel hosting a specific posts collection.
43async fn channel_for_post_board_id(
44 svc: &PostService,
45 collection_id: Uuid,
46) -> PostResult<Uuid> {
47 let db = svc.db.reader();
48 let board = posts_entity::Entity::find_by_id(collection_id)
49 .one(&db)
50 .await?
51 .ok_or_else(|| PostError::NotFound(format!("posts board {collection_id}")))?;
52 Ok(board.channel_id)
53}
Added lib/post/features/mod.rs lib/post/features/mod.rs +11 −0 View lib/post/features/mod.rs
@@ -0,0 +1,11 @@
1pub use crate::service::PostService;
2
3pub mod authz;
4pub mod lookup;
5pub mod post;
6pub mod post_label;
7pub mod post_mention;
8pub mod post_reaction;
9pub mod post_reply;
10pub mod post_watch;
11pub mod posts;
Added lib/post/handler/middleware/metrics.rs lib/post/handler/middleware/metrics.rs +41 −0 View lib/post/handler/middleware/metrics.rs
@@ -0,0 +1,41 @@
1use axum::extract::{MatchedPath, Request};
2use axum::middleware::Next;
3use axum::response::Response;
4
5pub async fn metrics_layer(req: Request, next: Next) -> Response {
6 crate::metrics::ensure_described();
7
8 let route = req
9 .extensions()
10 .get::<MatchedPath>()
11 .map(|m| m.as_str().to_string())
12 .unwrap_or_else(|| req.uri().path().to_string());
13 let method = req.method().as_str().to_string();
14 let started = std::time::Instant::now();
15
16 let resp = next.run(req).await;
17
18 let class = match resp.status().as_u16() / 100 {
19 2 => "2xx",
20 3 => "3xx",
21 4 => "4xx",
22 5 => "5xx",
23 _ => "other",
24 };
25 metrics::counter!(
26 "posts_http_requests_total",
27 "route" => route.clone(),
28 "method" => method.clone(),
29 "status_class" => class
30 )
31 .increment(1);
32 metrics::histogram!(
33 "posts_http_request_duration_seconds",
34 "route" => route,
35 "method" => method,
36 "status_class" => class
37 )
38 .record(started.elapsed().as_secs_f64());
39
40 resp
41}
Added lib/post/handler/middleware/mod.rs lib/post/handler/middleware/mod.rs +1 −0 View lib/post/handler/middleware/mod.rs
@@ -0,0 +1 @@
1pub mod metrics;
Added lib/post/handler/post/archive.rs lib/post/handler/post/archive.rs +29 −0 View lib/post/handler/post/archive.rs
@@ -0,0 +1,29 @@
1use axum::extract::{Path, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4
5use crate::error::PostResult;
6use crate::features::PostService;
7use crate::features::post::PostView;
8
9#[utoipa::path(
10 post,
11 path = "/posts/{space_name}/{number}/archive",
12 tag = "posts",
13 responses((status = 200, description = "Archive a post", body = AppResponseData<PostView>)),
14 security(("bearer_auth" = []))
15)]
16pub(crate) async fn handler(
17 State(svc): State<PostService>,
18 AuthUser { claims }: AuthUser,
19 Path((space_name, number)): Path<(String, i64)>,
20) -> PostResult<AppResponseData<PostView>> {
21 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
22 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
23 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
24 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
25 .await?;
26 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
27 let view = svc.archive_post(claims.sub, channel_id, post.id).await?;
28 Ok(AppResponseData::ok(view))
29}
Added lib/post/handler/post/close.rs lib/post/handler/post/close.rs +29 −0 View lib/post/handler/post/close.rs
@@ -0,0 +1,29 @@
1use axum::extract::{Path, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4
5use crate::error::PostResult;
6use crate::features::PostService;
7use crate::features::post::PostView;
8
9#[utoipa::path(
10 post,
11 path = "/posts/{space_name}/{number}/close",
12 tag = "posts",
13 responses((status = 200, description = "Close a post", body = AppResponseData<PostView>)),
14 security(("bearer_auth" = []))
15)]
16pub(crate) async fn handler(
17 State(svc): State<PostService>,
18 AuthUser { claims }: AuthUser,
19 Path((space_name, number)): Path<(String, i64)>,
20) -> PostResult<AppResponseData<PostView>> {
21 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
22 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
23 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
24 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
25 .await?;
26 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
27 let view = svc.close_post(claims.sub, channel_id, post.id).await?;
28 Ok(AppResponseData::ok(view))
29}
Added lib/post/handler/post/create.rs lib/post/handler/post/create.rs +29 −0 View lib/post/handler/post/create.rs
@@ -0,0 +1,29 @@
1use axum::extract::{Path, State};
2use export::data::{AppRequest, AppRequestData, AppResponseData};
3use jwt::extractor::AuthUser;
4
5use crate::error::PostResult;
6use crate::features::PostService;
7use crate::features::post::{CreatePostOption, PostView};
8
9#[utoipa::path(
10 post,
11 path = "/posts/{space_name}",
12 tag = "posts",
13 request_body = AppRequestData<CreatePostOption>,
14 responses((status = 201, description = "Create a post (thread)", body = AppResponseData<PostView>)),
15 security(("bearer_auth" = []))
16)]
17pub(crate) async fn handler(
18 State(svc): State<PostService>,
19 AuthUser { claims }: AuthUser,
20 Path(space_name): Path<String>,
21 input: AppRequest<CreatePostOption>,
22) -> PostResult<AppResponseData<PostView>> {
23 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
24 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
25 let view = svc
26 .create_post(claims.sub, space_id, input.into_inner())
27 .await?;
28 Ok(AppResponseData::ok(view).with_code(201))
29}
Added lib/post/handler/post/delete.rs lib/post/handler/post/delete.rs +29 −0 View lib/post/handler/post/delete.rs
@@ -0,0 +1,29 @@
1use axum::extract::{Path, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4use serde_json::Value;
5
6use crate::error::PostResult;
7use crate::features::PostService;
8
9#[utoipa::path(
10 delete,
11 path = "/posts/{space_name}/{number}",
12 tag = "posts",
13 responses((status = 200, description = "Delete a post")),
14 security(("bearer_auth" = []))
15)]
16pub(crate) async fn handler(
17 State(svc): State<PostService>,
18 AuthUser { claims }: AuthUser,
19 Path((space_name, number)): Path<(String, i64)>,
20) -> PostResult<AppResponseData<Value>> {
21 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
22 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
23 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
24 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
25 .await?;
26 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
27 svc.delete_post(claims.sub, channel_id, post.id).await?;
28 Ok(AppResponseData::ok(Value::Null))
29}
Added lib/post/handler/post/get.rs lib/post/handler/post/get.rs +29 −0 View lib/post/handler/post/get.rs
@@ -0,0 +1,29 @@
1use axum::extract::{Path, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4
5use crate::error::PostResult;
6use crate::features::PostService;
7use crate::features::post::PostView;
8
9#[utoipa::path(
10 get,
11 path = "/posts/{space_name}/{number}",
12 tag = "posts",
13 responses((status = 200, description = "Get a post", body = AppResponseData<PostView>)),
14 security(("bearer_auth" = []))
15)]
16pub(crate) async fn handler(
17 State(svc): State<PostService>,
18 AuthUser { claims }: AuthUser,
19 Path((space_name, number)): Path<(String, i64)>,
20) -> PostResult<AppResponseData<PostView>> {
21 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
22 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
23 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
24 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
25 .await?;
26 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
27 let view = svc.get_post(claims.sub, channel_id, post.id).await?;
28 Ok(AppResponseData::ok(view))
29}
Added lib/post/handler/post/mod.rs lib/post/handler/post/mod.rs +7 −0 View lib/post/handler/post/mod.rs
@@ -0,0 +1,7 @@
1pub(crate) mod archive;
2pub(crate) mod close;
3pub(crate) mod create;
4pub(crate) mod delete;
5pub(crate) mod get;
6pub(crate) mod reopen;
7pub(crate) mod update;
Added lib/post/handler/post/reopen.rs lib/post/handler/post/reopen.rs +29 −0 View lib/post/handler/post/reopen.rs
@@ -0,0 +1,29 @@
1use axum::extract::{Path, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4
5use crate::error::PostResult;
6use crate::features::PostService;
7use crate::features::post::PostView;
8
9#[utoipa::path(
10 post,
11 path = "/posts/{space_name}/{number}/reopen",
12 tag = "posts",
13 responses((status = 200, description = "Reopen a post", body = AppResponseData<PostView>)),
14 security(("bearer_auth" = []))
15)]
16pub(crate) async fn handler(
17 State(svc): State<PostService>,
18 AuthUser { claims }: AuthUser,
19 Path((space_name, number)): Path<(String, i64)>,
20) -> PostResult<AppResponseData<PostView>> {
21 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
22 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
23 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
24 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
25 .await?;
26 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
27 let view = svc.reopen_post(claims.sub, channel_id, post.id).await?;
28 Ok(AppResponseData::ok(view))
29}
Added lib/post/handler/post/update.rs lib/post/handler/post/update.rs +33 −0 View lib/post/handler/post/update.rs
@@ -0,0 +1,33 @@
1use axum::extract::{Path, State};
2use export::data::{AppRequest, AppRequestData, AppResponseData};
3use jwt::extractor::AuthUser;
4
5use crate::error::PostResult;
6use crate::features::PostService;
7use crate::features::post::{PostView, UpdatePostOption};
8
9#[utoipa::path(
10 patch,
11 path = "/posts/{space_name}/{number}",
12 tag = "posts",
13 request_body = AppRequestData<UpdatePostOption>,
14 responses((status = 200, description = "Update a post", body = AppResponseData<PostView>)),
15 security(("bearer_auth" = []))
16)]
17pub(crate) async fn handler(
18 State(svc): State<PostService>,
19 AuthUser { claims }: AuthUser,
20 Path((space_name, number)): Path<(String, i64)>,
21 input: AppRequest<UpdatePostOption>,
22) -> PostResult<AppResponseData<PostView>> {
23 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
24 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
25 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
26 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
27 .await?;
28 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
29 let view = svc
30 .update_post(claims.sub, channel_id, post.id, input.into_inner())
31 .await?;
32 Ok(AppResponseData::ok(view))
33}
Added lib/post/handler/post_label/bind.rs lib/post/handler/post_label/bind.rs +31 −0 View lib/post/handler/post_label/bind.rs
@@ -0,0 +1,31 @@
1use axum::extract::{Path, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4use serde_json::Value;
5use uuid::Uuid;
6
7use crate::error::PostResult;
8use crate::features::PostService;
9
10#[utoipa::path(
11 post,
12 path = "/posts/{space_name}/{number}/labels/{label_id}",
13 tag = "posts",
14 responses((status = 200, description = "Bind a label to a post")),
15 security(("bearer_auth" = []))
16)]
17pub(crate) async fn handler(
18 State(svc): State<PostService>,
19 AuthUser { claims }: AuthUser,
20 Path((space_name, number, label_id)): Path<(String, i64, Uuid)>,
21) -> PostResult<AppResponseData<Value>> {
22 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
23 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
24 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
25 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
26 .await?;
27 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
28 svc.bind_post_label(claims.sub, channel_id, post.id, label_id)
29 .await?;
30 Ok(AppResponseData::ok(Value::Null))
31}
Added lib/post/handler/post_label/create.rs lib/post/handler/post_label/create.rs +30 −0 View lib/post/handler/post_label/create.rs
@@ -0,0 +1,30 @@
1use axum::extract::{Path, State};
2use export::data::{AppRequest, AppRequestData, AppResponseData};
3use jwt::extractor::AuthUser;
4
5use crate::error::PostResult;
6use crate::features::PostService;
7use crate::features::post_label::{CreatePostLabelOption, PostLabelView};
8
9#[utoipa::path(
10 post,
11 path = "/posts/{space_name}/labels",
12 tag = "posts",
13 request_body = AppRequestData<CreatePostLabelOption>,
14 responses((status = 201, description = "Create a board label", body = AppResponseData<PostLabelView>)),
15 security(("bearer_auth" = []))
16)]
17pub(crate) async fn handler(
18 State(svc): State<PostService>,
19 AuthUser { claims }: AuthUser,
20 Path(space_name): Path<String>,
21 input: AppRequest<CreatePostLabelOption>,
22) -> PostResult<AppResponseData<PostLabelView>> {
23 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
24 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
25 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
26 let view = svc
27 .create_post_label(claims.sub, channel_id, input.into_inner())
28 .await?;
29 Ok(AppResponseData::ok(view).with_code(201))
30}
Added lib/post/handler/post_label/delete.rs lib/post/handler/post_label/delete.rs +27 −0 View lib/post/handler/post_label/delete.rs
@@ -0,0 +1,27 @@
1use axum::extract::{Path, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4use serde_json::Value;
5use uuid::Uuid;
6
7use crate::error::PostResult;
8use crate::features::PostService;
9
10#[utoipa::path(
11 delete,
12 path = "/posts/{space_name}/labels/{label_id}",
13 tag = "posts",
14 responses((status = 200, description = "Delete a board label")),
15 security(("bearer_auth" = []))
16)]
17pub(crate) async fn handler(
18 State(svc): State<PostService>,
19 AuthUser { claims }: AuthUser,
20 Path((space_name, label_id)): Path<(String, Uuid)>,
21) -> PostResult<AppResponseData<Value>> {
22 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
23 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
24 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
25 svc.delete_post_label(claims.sub, channel_id, label_id).await?;
26 Ok(AppResponseData::ok(Value::Null))
27}
Added lib/post/handler/post_label/get.rs lib/post/handler/post_label/get.rs +27 −0 View lib/post/handler/post_label/get.rs
@@ -0,0 +1,27 @@
1use axum::extract::{Path, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4use uuid::Uuid;
5
6use crate::error::PostResult;
7use crate::features::PostService;
8use crate::features::post_label::PostLabelView;
9
10#[utoipa::path(
11 get,
12 path = "/posts/{space_name}/labels/{label_id}",
13 tag = "posts",
14 responses((status = 200, description = "Get a board label", body = AppResponseData<PostLabelView>)),
15 security(("bearer_auth" = []))
16)]
17pub(crate) async fn handler(
18 State(svc): State<PostService>,
19 AuthUser { claims }: AuthUser,
20 Path((space_name, label_id)): Path<(String, Uuid)>,
21) -> PostResult<AppResponseData<PostLabelView>> {
22 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
23 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
24 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
25 let view = svc.get_post_label(claims.sub, channel_id, label_id).await?;
26 Ok(AppResponseData::ok(view))
27}
Added lib/post/handler/post_label/list.rs lib/post/handler/post_label/list.rs +47 −0 View lib/post/handler/post_label/list.rs
@@ -0,0 +1,47 @@
1use axum::extract::{Path, Query, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4use serde::{Deserialize, Serialize};
5use utoipa::IntoParams;
6
7use crate::error::PostResult;
8use crate::features::PostService;
9use crate::features::post_label::PostLabelPage;
10
11#[derive(Debug, Clone, Serialize, Deserialize, IntoParams)]
12pub(crate) struct ListLabelQuery {
13 pub q: Option<String>,
14 pub is_archived: Option<bool>,
15 pub limit: Option<u64>,
16 pub offset: Option<u64>,
17}
18
19#[utoipa::path(
20 get,
21 path = "/posts/{space_name}/labels",
22 tag = "posts",
23 params(ListLabelQuery),
24 responses((status = 200, description = "List board labels", body = AppResponseData<PostLabelPage>)),
25 security(("bearer_auth" = []))
26)]
27pub(crate) async fn handler(
28 State(svc): State<PostService>,
29 AuthUser { claims }: AuthUser,
30 Path(space_name): Path<String>,
31 Query(q): Query<ListLabelQuery>,
32) -> PostResult<AppResponseData<PostLabelPage>> {
33 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
34 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
35 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
36 let page = svc
37 .list_post_labels(
38 claims.sub,
39 channel_id,
40 q.q,
41 q.is_archived,
42 q.limit,
43 q.offset,
44 )
45 .await?;
46 Ok(AppResponseData::ok(page))
47}
Added lib/post/handler/post_label/list_for_post.rs lib/post/handler/post_label/list_for_post.rs +31 −0 View lib/post/handler/post_label/list_for_post.rs
@@ -0,0 +1,31 @@
1use axum::extract::{Path, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4
5use crate::error::PostResult;
6use crate::features::PostService;
7use crate::features::post_label::PostLabelView;
8
9#[utoipa::path(
10 get,
11 path = "/posts/{space_name}/{number}/labels",
12 tag = "posts",
13 responses((status = 200, description = "List labels bound to a post", body = AppResponseData<Vec<PostLabelView>>)),
14 security(("bearer_auth" = []))
15)]
16pub(crate) async fn handler(
17 State(svc): State<PostService>,
18 AuthUser { claims }: AuthUser,
19 Path((space_name, number)): Path<(String, i64)>,
20) -> PostResult<AppResponseData<Vec<PostLabelView>>> {
21 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
22 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
23 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
24 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
25 .await?;
26 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
27 let views = svc
28 .list_post_labels_for_post(claims.sub, channel_id, post.id)
29 .await?;
30 Ok(AppResponseData::ok(views))
31}
Added lib/post/handler/post_label/mod.rs lib/post/handler/post_label/mod.rs +8 −0 View lib/post/handler/post_label/mod.rs
@@ -0,0 +1,8 @@
1pub(crate) mod bind;
2pub(crate) mod create;
3pub(crate) mod delete;
4pub(crate) mod get;
5pub(crate) mod list;
6pub(crate) mod list_for_post;
7pub(crate) mod unbind;
8pub(crate) mod update;
Added lib/post/handler/post_label/unbind.rs lib/post/handler/post_label/unbind.rs +31 −0 View lib/post/handler/post_label/unbind.rs
@@ -0,0 +1,31 @@
1use axum::extract::{Path, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4use serde_json::Value;
5use uuid::Uuid;
6
7use crate::error::PostResult;
8use crate::features::PostService;
9
10#[utoipa::path(
11 delete,
12 path = "/posts/{space_name}/{number}/labels/{label_id}",
13 tag = "posts",
14 responses((status = 200, description = "Unbind a label from a post")),
15 security(("bearer_auth" = []))
16)]
17pub(crate) async fn handler(
18 State(svc): State<PostService>,
19 AuthUser { claims }: AuthUser,
20 Path((space_name, number, label_id)): Path<(String, i64, Uuid)>,
21) -> PostResult<AppResponseData<Value>> {
22 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
23 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
24 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
25 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
26 .await?;
27 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
28 svc.unbind_post_label(claims.sub, channel_id, post.id, label_id)
29 .await?;
30 Ok(AppResponseData::ok(Value::Null))
31}
Added lib/post/handler/post_label/update.rs lib/post/handler/post_label/update.rs +31 −0 View lib/post/handler/post_label/update.rs
@@ -0,0 +1,31 @@
1use axum::extract::{Path, State};
2use export::data::{AppRequest, AppRequestData, AppResponseData};
3use jwt::extractor::AuthUser;
4use uuid::Uuid;
5
6use crate::error::PostResult;
7use crate::features::PostService;
8use crate::features::post_label::{PostLabelView, UpdatePostLabelOption};
9
10#[utoipa::path(
11 patch,
12 path = "/posts/{space_name}/labels/{label_id}",
13 tag = "posts",
14 request_body = AppRequestData<UpdatePostLabelOption>,
15 responses((status = 200, description = "Update a board label", body = AppResponseData<PostLabelView>)),
16 security(("bearer_auth" = []))
17)]
18pub(crate) async fn handler(
19 State(svc): State<PostService>,
20 AuthUser { claims }: AuthUser,
21 Path((space_name, label_id)): Path<(String, Uuid)>,
22 input: AppRequest<UpdatePostLabelOption>,
23) -> PostResult<AppResponseData<PostLabelView>> {
24 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
25 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
26 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
27 let view = svc
28 .update_post_label(claims.sub, channel_id, label_id, input.into_inner())
29 .await?;
30 Ok(AppResponseData::ok(view))
31}
Added lib/post/handler/post_mention/create.rs lib/post/handler/post_mention/create.rs +33 −0 View lib/post/handler/post_mention/create.rs
@@ -0,0 +1,33 @@
1use axum::extract::{Path, State};
2use export::data::{AppRequest, AppRequestData, AppResponseData};
3use jwt::extractor::AuthUser;
4
5use crate::error::PostResult;
6use crate::features::PostService;
7use crate::features::post_mention::{CreateMentionOption, PostMentionView};
8
9#[utoipa::path(
10 post,
11 path = "/posts/{space_name}/{number}/mentions",
12 tag = "posts",
13 request_body = AppRequestData<CreateMentionOption>,
14 responses((status = 201, description = "Mention a user/role in a post", body = AppResponseData<PostMentionView>)),
15 security(("bearer_auth" = []))
16)]
17pub(crate) async fn handler(
18 State(svc): State<PostService>,
19 AuthUser { claims }: AuthUser,
20 Path((space_name, number)): Path<(String, i64)>,
21 input: AppRequest<CreateMentionOption>,
22) -> PostResult<AppResponseData<PostMentionView>> {
23 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
24 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
25 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
26 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
27 .await?;
28 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
29 let view = svc
30 .create_post_mention(claims.sub, channel_id, post.id, input.into_inner())
31 .await?;
32 Ok(AppResponseData::ok(view).with_code(201))
33}
Added lib/post/handler/post_mention/list.rs lib/post/handler/post_mention/list.rs +41 −0 View lib/post/handler/post_mention/list.rs
@@ -0,0 +1,41 @@
1use axum::extract::{Path, Query, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4use serde::{Deserialize, Serialize};
5use utoipa::IntoParams;
6
7use crate::error::PostResult;
8use crate::features::PostService;
9use crate::features::post_mention::PostMentionView;
10
11#[derive(Debug, Clone, Serialize, Deserialize, IntoParams)]
12pub(crate) struct ListMentionQuery {
13 pub limit: Option<u64>,
14 pub offset: Option<u64>,
15}
16
17#[utoipa::path(
18 get,
19 path = "/posts/{space_name}/{number}/mentions",
20 tag = "posts",
21 params(ListMentionQuery),
22 responses((status = 200, description = "List mentions", body = AppResponseData<Vec<PostMentionView>>)),
23 security(("bearer_auth" = []))
24)]
25pub(crate) async fn handler(
26 State(svc): State<PostService>,
27 AuthUser { claims }: AuthUser,
28 Path((space_name, number)): Path<(String, i64)>,
29 Query(q): Query<ListMentionQuery>,
30) -> PostResult<AppResponseData<Vec<PostMentionView>>> {
31 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
32 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
33 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
34 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
35 .await?;
36 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
37 let views = svc
38 .list_post_mentions(claims.sub, channel_id, post.id, q.limit, q.offset)
39 .await?;
40 Ok(AppResponseData::ok(views))
41}
Added lib/post/handler/post_mention/mod.rs lib/post/handler/post_mention/mod.rs +2 −0 View lib/post/handler/post_mention/mod.rs
@@ -0,0 +1,2 @@
1pub(crate) mod create;
2pub(crate) mod list;
Added lib/post/handler/post_reaction/create.rs lib/post/handler/post_reaction/create.rs +33 −0 View lib/post/handler/post_reaction/create.rs
@@ -0,0 +1,33 @@
1use axum::extract::{Path, State};
2use export::data::{AppRequest, AppRequestData, AppResponseData};
3use jwt::extractor::AuthUser;
4
5use crate::error::PostResult;
6use crate::features::PostService;
7use crate::features::post_reaction::{CreatePostReactionOption, PostReactionView};
8
9#[utoipa::path(
10 post,
11 path = "/posts/{space_name}/{number}/reactions",
12 tag = "posts",
13 request_body = AppRequestData<CreatePostReactionOption>,
14 responses((status = 201, description = "React to a post", body = AppResponseData<PostReactionView>)),
15 security(("bearer_auth" = []))
16)]
17pub(crate) async fn handler(
18 State(svc): State<PostService>,
19 AuthUser { claims }: AuthUser,
20 Path((space_name, number)): Path<(String, i64)>,
21 input: AppRequest<CreatePostReactionOption>,
22) -> PostResult<AppResponseData<PostReactionView>> {
23 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
24 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
25 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
26 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
27 .await?;
28 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
29 let view = svc
30 .create_post_reaction(claims.sub, channel_id, post.id, input.into_inner())
31 .await?;
32 Ok(AppResponseData::ok(view).with_code(201))
33}
Added lib/post/handler/post_reaction/delete.rs lib/post/handler/post_reaction/delete.rs +31 −0 View lib/post/handler/post_reaction/delete.rs
@@ -0,0 +1,31 @@
1use axum::extract::{Path, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4use serde_json::Value;
5use uuid::Uuid;
6
7use crate::error::PostResult;
8use crate::features::PostService;
9
10#[utoipa::path(
11 delete,
12 path = "/posts/{space_name}/{number}/reactions/{reaction_id}",
13 tag = "posts",
14 responses((status = 200, description = "Remove a reaction")),
15 security(("bearer_auth" = []))
16)]
17pub(crate) async fn handler(
18 State(svc): State<PostService>,
19 AuthUser { claims }: AuthUser,
20 Path((space_name, number, reaction_id)): Path<(String, i64, Uuid)>,
21) -> PostResult<AppResponseData<Value>> {
22 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
23 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
24 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
25 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
26 .await?;
27 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
28 svc.delete_post_reaction(claims.sub, channel_id, post.id, reaction_id)
29 .await?;
30 Ok(AppResponseData::ok(Value::Null))
31}
Added lib/post/handler/post_reaction/list.rs lib/post/handler/post_reaction/list.rs +41 −0 View lib/post/handler/post_reaction/list.rs
@@ -0,0 +1,41 @@
1use axum::extract::{Path, Query, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4use serde::{Deserialize, Serialize};
5use utoipa::IntoParams;
6
7use crate::error::PostResult;
8use crate::features::PostService;
9use crate::features::post_reaction::PostReactionView;
10
11#[derive(Debug, Clone, Serialize, Deserialize, IntoParams)]
12pub(crate) struct ListReactionQuery {
13 pub limit: Option<u64>,
14 pub offset: Option<u64>,
15}
16
17#[utoipa::path(
18 get,
19 path = "/posts/{space_name}/{number}/reactions",
20 tag = "posts",
21 params(ListReactionQuery),
22 responses((status = 200, description = "List reactions", body = AppResponseData<Vec<PostReactionView>>)),
23 security(("bearer_auth" = []))
24)]
25pub(crate) async fn handler(
26 State(svc): State<PostService>,
27 AuthUser { claims }: AuthUser,
28 Path((space_name, number)): Path<(String, i64)>,
29 Query(q): Query<ListReactionQuery>,
30) -> PostResult<AppResponseData<Vec<PostReactionView>>> {
31 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
32 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
33 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
34 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
35 .await?;
36 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
37 let views = svc
38 .list_post_reactions(claims.sub, channel_id, post.id, q.limit, q.offset)
39 .await?;
40 Ok(AppResponseData::ok(views))
41}
Added lib/post/handler/post_reaction/mod.rs lib/post/handler/post_reaction/mod.rs +3 −0 View lib/post/handler/post_reaction/mod.rs
@@ -0,0 +1,3 @@
1pub(crate) mod create;
2pub(crate) mod delete;
3pub(crate) mod list;
Added lib/post/handler/post_reply/create.rs lib/post/handler/post_reply/create.rs +33 −0 View lib/post/handler/post_reply/create.rs
@@ -0,0 +1,33 @@
1use axum::extract::{Path, State};
2use export::data::{AppRequest, AppRequestData, AppResponseData};
3use jwt::extractor::AuthUser;
4
5use crate::error::PostResult;
6use crate::features::PostService;
7use crate::features::post_reply::{CreateReplyOption, PostReplyView};
8
9#[utoipa::path(
10 post,
11 path = "/posts/{space_name}/{number}/replies",
12 tag = "posts",
13 request_body = AppRequestData<CreateReplyOption>,
14 responses((status = 201, description = "Create a reply", body = AppResponseData<PostReplyView>)),
15 security(("bearer_auth" = []))
16)]
17pub(crate) async fn handler(
18 State(svc): State<PostService>,
19 AuthUser { claims }: AuthUser,
20 Path((space_name, number)): Path<(String, i64)>,
21 input: AppRequest<CreateReplyOption>,
22) -> PostResult<AppResponseData<PostReplyView>> {
23 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
24 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
25 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
26 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
27 .await?;
28 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
29 let view = svc
30 .create_reply(claims.sub, channel_id, post.id, input.into_inner())
31 .await?;
32 Ok(AppResponseData::ok(view).with_code(201))
33}
Added lib/post/handler/post_reply/list.rs lib/post/handler/post_reply/list.rs +41 −0 View lib/post/handler/post_reply/list.rs
@@ -0,0 +1,41 @@
1use axum::extract::{Path, Query, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4use serde::{Deserialize, Serialize};
5use utoipa::IntoParams;
6
7use crate::error::PostResult;
8use crate::features::PostService;
9use crate::features::post_reply::PostReplyPage;
10
11#[derive(Debug, Clone, Serialize, Deserialize, IntoParams)]
12pub(crate) struct ListReplyQuery {
13 pub limit: Option<u64>,
14 pub offset: Option<u64>,
15}
16
17#[utoipa::path(
18 get,
19 path = "/posts/{space_name}/{number}/replies",
20 tag = "posts",
21 params(ListReplyQuery),
22 responses((status = 200, description = "List replies", body = AppResponseData<PostReplyPage>)),
23 security(("bearer_auth" = []))
24)]
25pub(crate) async fn handler(
26 State(svc): State<PostService>,
27 AuthUser { claims }: AuthUser,
28 Path((space_name, number)): Path<(String, i64)>,
29 Query(q): Query<ListReplyQuery>,
30) -> PostResult<AppResponseData<PostReplyPage>> {
31 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
32 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
33 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
34 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
35 .await?;
36 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
37 let page = svc
38 .list_replies(claims.sub, channel_id, post.id, q.limit, q.offset)
39 .await?;
40 Ok(AppResponseData::ok(page))
41}
Added lib/post/handler/post_reply/mod.rs lib/post/handler/post_reply/mod.rs +2 −0 View lib/post/handler/post_reply/mod.rs
@@ -0,0 +1,2 @@
1pub(crate) mod create;
2pub(crate) mod list;
Added lib/post/handler/post_watch/delete.rs lib/post/handler/post_watch/delete.rs +29 −0 View lib/post/handler/post_watch/delete.rs
@@ -0,0 +1,29 @@
1use axum::extract::{Path, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4use serde_json::Value;
5
6use crate::error::PostResult;
7use crate::features::PostService;
8
9#[utoipa::path(
10 delete,
11 path = "/posts/{space_name}/{number}/watch",
12 tag = "posts",
13 responses((status = 200, description = "Delete my watch state")),
14 security(("bearer_auth" = []))
15)]
16pub(crate) async fn handler(
17 State(svc): State<PostService>,
18 AuthUser { claims }: AuthUser,
19 Path((space_name, number)): Path<(String, i64)>,
20) -> PostResult<AppResponseData<Value>> {
21 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
22 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
23 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
24 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
25 .await?;
26 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
27 svc.delete_watch(claims.sub, channel_id, post.id).await?;
28 Ok(AppResponseData::ok(Value::Null))
29}
Added lib/post/handler/post_watch/get.rs lib/post/handler/post_watch/get.rs +29 −0 View lib/post/handler/post_watch/get.rs
@@ -0,0 +1,29 @@
1use axum::extract::{Path, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4
5use crate::error::PostResult;
6use crate::features::PostService;
7use crate::features::post_watch::PostWatchView;
8
9#[utoipa::path(
10 get,
11 path = "/posts/{space_name}/{number}/watch",
12 tag = "posts",
13 responses((status = 200, description = "Get my watch state", body = AppResponseData<PostWatchView>)),
14 security(("bearer_auth" = []))
15)]
16pub(crate) async fn handler(
17 State(svc): State<PostService>,
18 AuthUser { claims }: AuthUser,
19 Path((space_name, number)): Path<(String, i64)>,
20) -> PostResult<AppResponseData<PostWatchView>> {
21 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
22 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
23 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
24 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
25 .await?;
26 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
27 let view = svc.get_watch(claims.sub, channel_id, post.id).await?;
28 Ok(AppResponseData::ok(view))
29}
Added lib/post/handler/post_watch/mod.rs lib/post/handler/post_watch/mod.rs +3 −0 View lib/post/handler/post_watch/mod.rs
@@ -0,0 +1,3 @@
1pub(crate) mod delete;
2pub(crate) mod get;
3pub(crate) mod upsert;
Added lib/post/handler/post_watch/upsert.rs lib/post/handler/post_watch/upsert.rs +33 −0 View lib/post/handler/post_watch/upsert.rs
@@ -0,0 +1,33 @@
1use axum::extract::{Path, State};
2use export::data::{AppRequest, AppRequestData, AppResponseData};
3use jwt::extractor::AuthUser;
4
5use crate::error::PostResult;
6use crate::features::PostService;
7use crate::features::post_watch::{PostWatchView, UpsertPostWatchOption};
8
9#[utoipa::path(
10 put,
11 path = "/posts/{space_name}/{number}/watch",
12 tag = "posts",
13 request_body = AppRequestData<UpsertPostWatchOption>,
14 responses((status = 200, description = "Upsert watch state", body = AppResponseData<PostWatchView>)),
15 security(("bearer_auth" = []))
16)]
17pub(crate) async fn handler(
18 State(svc): State<PostService>,
19 AuthUser { claims }: AuthUser,
20 Path((space_name, number)): Path<(String, i64)>,
21 input: AppRequest<UpsertPostWatchOption>,
22) -> PostResult<AppResponseData<PostWatchView>> {
23 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
24 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
25 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
26 let post = crate::features::post::usecase::resolve_post_by_number(&svc, channel_id, number)
27 .await?;
28 let _channel_id = crate::features::lookup::channel_for_post(&svc, post.id).await?;
29 let view = svc
30 .upsert_watch(claims.sub, channel_id, post.id, input.into_inner())
31 .await?;
32 Ok(AppResponseData::ok(view))
33}
Added lib/post/handler/posts/create.rs lib/post/handler/posts/create.rs +29 −0 View lib/post/handler/posts/create.rs
@@ -0,0 +1,29 @@
1use axum::extract::{Path, State};
2use export::data::{AppRequest, AppRequestData, AppResponseData};
3use jwt::extractor::AuthUser;
4
5use crate::error::PostResult;
6use crate::features::PostService;
7use crate::features::posts::{CreatePostBoardOption, PostBoardView};
8
9#[utoipa::path(
10 post,
11 path = "/posts/{space_name}/boards",
12 tag = "posts",
13 request_body = AppRequestData<CreatePostBoardOption>,
14 responses((status = 201, description = "Create a posts board (collection)", body = AppResponseData<PostBoardView>)),
15 security(("bearer_auth" = []))
16)]
17pub(crate) async fn handler(
18 State(svc): State<PostService>,
19 AuthUser { claims }: AuthUser,
20 Path(space_name): Path<String>,
21 input: AppRequest<CreatePostBoardOption>,
22) -> PostResult<AppResponseData<PostBoardView>> {
23 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
24 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
25 let view = svc
26 .create_post_collection(claims.sub, space_id, input.into_inner())
27 .await?;
28 Ok(AppResponseData::ok(view).with_code(201))
29}
Added lib/post/handler/posts/list.rs lib/post/handler/posts/list.rs +55 −0 View lib/post/handler/posts/list.rs
@@ -0,0 +1,55 @@
1use axum::extract::{Path, Query, State};
2use export::data::AppResponseData;
3use jwt::extractor::AuthUser;
4use serde::Serialize;
5use serde_json::Value;
6
7use crate::error::PostResult;
8use crate::features::PostService;
9use crate::features::post::ListPostQuery;
10
11#[derive(Serialize)]
12#[serde(untagged)]
13enum GetBoardResponse {
14 Board(crate::features::posts::PostBoardPage),
15 PostList {
16 items: Vec<crate::features::post::PostView>,
17 total: i64,
18 },
19}
20
21#[utoipa::path(
22 get,
23 path = "/posts/{space_name}",
24 tag = "posts",
25 responses((status = 200, description = "Posts board view OR post list (when query.status/q/author_id is set)")),
26 security(("bearer_auth" = []))
27)]
28pub(crate) async fn handler(
29 State(svc): State<PostService>,
30 AuthUser { claims }: AuthUser,
31 Path(space_name): Path<String>,
32 Query(q): Query<ListPostQuery>,
33) -> PostResult<AppResponseData<Value>> {
34 let space_id = space::features::lookup::lookup_space_by_name(&svc, &space_name).await?;
35 space::features::authz::require_active_member(&svc, claims.sub, space_id).await?;
36 let channel_id = crate::features::lookup::channel_for_post_board(&svc, space_id).await?;
37 let wants_post_list = q.status.is_some() || q.q.is_some() || q.author_id.is_some();
38 if wants_post_list {
39 let page = svc.list_posts(claims.sub, channel_id, q).await?;
40 let resp = GetBoardResponse::PostList {
41 items: page.items,
42 total: page.total,
43 };
44 Ok(AppResponseData::ok(
45 serde_json::to_value(resp).unwrap_or(Value::Null),
46 ))
47 } else {
48 let board = svc.list_post_collections(claims.sub, channel_id).await?;
49 let resp = GetBoardResponse::Board(board);
50 let _ = claims;
51 Ok(AppResponseData::ok(
52 serde_json::to_value(resp).unwrap_or(Value::Null),
53 ))
54 }
55}
Added lib/post/handler/posts/mod.rs lib/post/handler/posts/mod.rs +2 −0 View lib/post/handler/posts/mod.rs
@@ -0,0 +1,2 @@
1pub(crate) mod create;
2pub(crate) mod list;
Added lib/post/handler/mod.rs lib/post/handler/mod.rs +13 −0 View lib/post/handler/mod.rs
@@ -0,0 +1,13 @@
1pub mod middleware;
2pub mod openapi;
3pub mod post;
4pub mod post_label;
5pub mod post_mention;
6pub mod post_reaction;
7pub mod post_reply;
8pub mod post_watch;
9pub mod posts;
10pub mod routes;
11
12pub use openapi::PostsApiDoc;
13pub use routes::router;
Added lib/post/handler/openapi.rs lib/post/handler/openapi.rs +90 −0 View lib/post/handler/openapi.rs
@@ -0,0 +1,90 @@
1use utoipa::OpenApi;
2
3use crate::features::post;
4use crate::features::post_label;
5use crate::features::post_mention;
6use crate::features::post_reaction;
7use crate::features::post_reply;
8use crate::features::post_watch;
9use crate::features::posts;
10
11#[derive(OpenApi)]
12#[openapi(
13 info(
14 title = "lib/post",
15 version = env!("CARGO_PKG_VERSION"),
16 description = "Post discussion service (board / post / reply / reaction / mention / watch / label)",
17 ),
18 paths(
19 crate::handler::posts::create::handler,
20 crate::handler::posts::list::handler,
21
22 crate::handler::post::create::handler,
23 crate::handler::post::get::handler,
24 crate::handler::post::update::handler,
25 crate::handler::post::delete::handler,
26 crate::handler::post::close::handler,
27 crate::handler::post::reopen::handler,
28 crate::handler::post::archive::handler,
29
30 crate::handler::post_reply::create::handler,
31 crate::handler::post_reply::list::handler,
32
33 crate::handler::post_reaction::create::handler,
34 crate::handler::post_reaction::list::handler,
35 crate::handler::post_reaction::delete::handler,
36
37 crate::handler::post_mention::create::handler,
38 crate::handler::post_mention::list::handler,
39
40 crate::handler::post_watch::get::handler,
41 crate::handler::post_watch::upsert::handler,
42 crate::handler::post_watch::delete::handler,
43
44 crate::handler::post_label::create::handler,
45 crate::handler::post_label::list::handler,
46 crate::handler::post_label::get::handler,
47 crate::handler::post_label::update::handler,
48 crate::handler::post_label::delete::handler,
49 crate::handler::post_label::list_for_post::handler,
50 crate::handler::post_label::bind::handler,
51 crate::handler::post_label::unbind::handler,
52 ),
53 components(schemas(
54 posts::PostBoardView,
55 posts::PostBoardPage,
56 posts::CreatePostBoardOption,
57
58 post::PostView,
59 post::PostPage,
60 post::PostStatusView,
61 post::CreatePostOption,
62 post::UpdatePostOption,
63 post::ListPostQuery,
64
65 post_reply::PostReplyView,
66 post_reply::PostReplyPage,
67 post_reply::CreateReplyOption,
68
69 post_reaction::PostReactionView,
70 post_reaction::PostTargetView,
71 post_reaction::CreatePostReactionOption,
72
73 post_mention::PostMentionView,
74 post_mention::CreateMentionOption,
75
76 post_watch::PostWatchView,
77 post_watch::UpsertPostWatchOption,
78
79 post_label::PostLabelView,
80 post_label::PostLabelPage,
81 post_label::CreatePostLabelOption,
82 post_label::UpdatePostLabelOption,
83 )),
84 tags((name = "posts", description = "Post discussion (lib/post)"))
85)]
86pub struct PostsApiDoc;
87
88pub fn build_openapi() -> utoipa::openapi::OpenApi {
89 <PostsApiDoc as utoipa::OpenApi>::openapi()
90}
Added lib/post/handler/routes.rs lib/post/handler/routes.rs +87 −0 View lib/post/handler/routes.rs
@@ -0,0 +1,87 @@
1use axum::Router;
2use axum::middleware::from_fn_with_state;
3use axum::routing::{delete, get, post};
4
5use crate::features::PostService;
6use jwt::inject_jwt_ctx;
7use rate_limit::ratelimit;
8
9pub fn router(svc: PostService) -> Router {
10 let protected: Router<PostService> = Router::new()
11 .route("/posts/{space_name}", get(super::posts::list::handler))
12 .route("/posts/{space_name}", post(super::post::create::handler))
13 .route(
14 "/posts/{space_name}/boards",
15 post(super::posts::create::handler),
16 )
17 .route(
18 "/posts/{space_name}/labels",
19 get(super::post_label::list::handler).post(super::post_label::create::handler),
20 )
21 .route(
22 "/posts/{space_name}/labels/{label_id}",
23 get(super::post_label::get::handler)
24 .patch(super::post_label::update::handler)
25 .delete(super::post_label::delete::handler),
26 )
27 .route(
28 "/posts/{space_name}/{number}",
29 get(super::post::get::handler)
30 .patch(super::post::update::handler)
31 .delete(super::post::delete::handler),
32 )
33 .route(
34 "/posts/{space_name}/{number}/close",
35 post(super::post::close::handler),
36 )
37 .route(
38 "/posts/{space_name}/{number}/reopen",
39 post(super::post::reopen::handler),
40 )
41 .route(
42 "/posts/{space_name}/{number}/archive",
43 post(super::post::archive::handler),
44 )
45 .route(
46 "/posts/{space_name}/{number}/replies",
47 get(super::post_reply::list::handler).post(super::post_reply::create::handler),
48 )
49 .route(
50 "/posts/{space_name}/{number}/reactions",
51 get(super::post_reaction::list::handler).post(super::post_reaction::create::handler),
52 )
53 .route(
54 "/posts/{space_name}/{number}/reactions/{reaction_id}",
55 delete(super::post_reaction::delete::handler),
56 )
57 .route(
58 "/posts/{space_name}/{number}/mentions",
59 get(super::post_mention::list::handler).post(super::post_mention::create::handler),
60 )
61 .route(
62 "/posts/{space_name}/{number}/watch",
63 get(super::post_watch::get::handler)
64 .put(super::post_watch::upsert::handler)
65 .delete(super::post_watch::delete::handler),
66 )
67 .route(
68 "/posts/{space_name}/{number}/labels",
69 get(super::post_label::list_for_post::handler),
70 )
71 .route(
72 "/posts/{space_name}/{number}/labels/{label_id}",
73 post(super::post_label::bind::handler).delete(super::post_label::unbind::handler),
74 )
75 .layer(from_fn_with_state(
76 svc.clone(),
77 inject_jwt_ctx::<PostService>,
78 ));
79
80 Router::new()
81 .merge(protected)
82 .layer(from_fn_with_state(svc.clone(), ratelimit::<PostService>))
83 .layer(axum::middleware::from_fn(
84 crate::handler::middleware::metrics::metrics_layer,
85 ))
86 .with_state(svc)
87}
Added lib/post/tests/posts/get.rs lib/post/tests/posts/get.rs +6 −0 View lib/post/tests/posts/get.rs
@@ -0,0 +1,6 @@
1use super::{SPACE_NAME, expect_unauthorized};
2
3#[tokio::test]
4async fn get_post_requires_auth() {
5 expect_unauthorized(&format!("/posts/{SPACE_NAME}/1"), "GET").await;
6}
Added lib/post/tests/posts/main.rs lib/post/tests/posts/main.rs +83 −0 View lib/post/tests/posts/main.rs
@@ -0,0 +1,83 @@
1//! HTTP integration tests for the posts endpoints.
2//!
3//! Each endpoint is exercised at the axum HTTP layer. Unauthenticated
4//! requests must be rejected with `401 Unauthorized` before any business
5//! logic runs (the acceptance criterion: 401/403 instead of a panic).
6//!
7//! The router requires a live Redis for `PostService` construction; when
8//! Redis is unavailable the endpoint tests skip themselves.
9
10mod get;
11mod openapi;
12
13use std::sync::Arc;
14
15use axum::Router;
16use axum::body::Body;
17use cache::RedisCache;
18use config::cache::AppRedisSettings;
19use config::jwt::JwtSettings;
20use db::conn::Db;
21use db::conn::sea_orm::Database;
22use http::{Request, StatusCode};
23use jwt::JwtState;
24use jwt::keys::SigningKeyCache;
25use post::PostService;
26use post::handler::router as posts_router;
27use tokio::sync::RwLock;
28use tower::util::ServiceExt;
29
30/// A syntactically valid space name used in test URIs.
31pub(crate) const SPACE_NAME: &str = "test-space";
32
33/// Build the posts router, or `None` when Redis is not reachable
34/// (the tests then skip rather than fail).
35async fn try_router() -> Option<Router> {
36 let mut cfg = AppRedisSettings::default();
37 cfg.connection_timeout_ms = Some(300);
38 cfg.response_timeout_ms = Some(300);
39 let kv = match RedisCache::new(&cfg).await {
40 Ok(kv) => Arc::new(kv),
41 Err(e) => {
42 eprintln!("SKIP: redis unavailable, skipping posts http test: {e}");
43 return None;
44 }
45 };
46 let jwt = JwtState::new(
47 Database::connect("sqlite::memory:").await.unwrap(),
48 JwtSettings::default(),
49 Arc::new(RwLock::new(SigningKeyCache::new())),
50 );
51 let mut local = config::storage::LocalStorageSettings::default();
52 local.set_root_dir(std::env::temp_dir().join("posts-401-test"));
53 let mut settings = config::storage::StorageSettings::default();
54 settings.set_local(local);
55 let storage: Arc<dyn storage::StorageRepository> =
56 Arc::new(storage::local::LocalStorage::from_config(&settings).unwrap());
57 let svc = PostService::new(
58 Db::from_connection(Database::connect("sqlite::memory:").await.unwrap()),
59 kv,
60 jwt,
61 storage,
62 );
63 Some(posts_router(svc))
64}
65
66/// Send an unauthenticated request and assert the endpoint is reachable and
67/// rejects the caller with 401 (no panic, no 500).
68pub(crate) async fn expect_unauthorized(uri: &str, method: &'static str) {
69 let Some(app) = try_router().await else {
70 return;
71 };
72 let request = Request::builder()
73 .method(method)
74 .uri(uri)
75 .body(Body::empty())
76 .unwrap();
77 let response = app.oneshot(request).await.unwrap();
78 assert_eq!(
79 response.status(),
80 StatusCode::UNAUTHORIZED,
81 "expected 401 for {method} {uri}"
82 );
83}
Added lib/post/tests/posts/openapi.rs lib/post/tests/posts/openapi.rs +59 −0 View lib/post/tests/posts/openapi.rs
@@ -0,0 +1,59 @@
1//! Always-runnable reflection test: the merged OpenAPI document must expose
2//! one operation per posts handler (no infra required).
3
4use serde_json::Value;
5
6#[test]
7fn openapi_doc_exposes_post_operations() {
8 let doc = post::handler::openapi::build_openapi();
9 let spec: Value = serde_json::from_str(&doc.to_json().unwrap()).unwrap();
10 let paths = spec["paths"].as_object().expect("paths object");
11
12 let mut operations = 0usize;
13 let mut detail = String::new();
14 for (key, item) in paths {
15 if key.contains("/posts") {
16 detail.push_str(&format!("{key}: {}\n", item.as_object().unwrap().len()));
17 operations += item.as_object().unwrap().len();
18 }
19 }
20
21 assert!(
22 operations >= 15,
23 "expected >= 15 posts operations, got {operations}:\n{detail}"
24 );
25}
26
27#[test]
28fn openapi_doc_has_post_schemas() {
29 let doc = post::handler::openapi::build_openapi();
30 let spec: Value = serde_json::from_str(&doc.to_json().unwrap()).unwrap();
31 let schemas = spec["components"]["schemas"]
32 .as_object()
33 .expect("schemas object");
34
35 for name in [
36 "PostView",
37 "PostPage",
38 "PostStatusView",
39 "CreatePostOption",
40 "UpdatePostOption",
41 "ListPostQuery",
42 "PostBoardView",
43 "PostBoardPage",
44 "CreatePostBoardOption",
45 "PostReplyView",
46 "PostReplyPage",
47 "CreateReplyOption",
48 "PostReactionView",
49 "PostMentionView",
50 "PostWatchView",
51 "UpsertPostWatchOption",
52 "PostLabelView",
53 "PostLabelPage",
54 "CreatePostLabelOption",
55 "UpdatePostLabelOption",
56 ] {
57 assert!(schemas.contains_key(name), "missing schema {name}");
58 }
59}
Added lib/post/Cargo.toml lib/post/Cargo.toml +46 −0 View lib/post/Cargo.toml
@@ -0,0 +1,46 @@
1[package]
2name = "post"
3version.workspace = true
4edition.workspace = true
5authors.workspace = true
6categories.workspace = true
7keywords.workspace = true
8repository.workspace = true
9homepage.workspace = true
10
11[lib]
12path = "lib.rs"
13name = "post"
14
15[dependencies]
16export.workspace = true
17config.workspace = true
18db.workspace = true
19cache.workspace = true
20jwt.workspace = true
21rate_limit.workspace = true
22space.workspace = true
23storage.workspace = true
24
25tokio.workspace = true
26sea-orm = { workspace = true }
27serde.workspace = true
28serde_json.workspace = true
29thiserror.workspace = true
30time.workspace = true
31uuid.workspace = true
32tracing.workspace = true
33log.workspace = true
34utoipa.workspace = true
35metrics.workspace = true
36async-trait.workspace = true
37futures.workspace = true
38validator.workspace = true
39async-graphql.workspace = true
40axum.workspace = true
41axum-extra.workspace = true
42bytes.workspace = true
43object_store = { workspace = true }
44[dev-dependencies]
45http.workspace = true
46tower = "0.5"
Added lib/post/error.rs lib/post/error.rs +107 −0 View lib/post/error.rs
@@ -0,0 +1,107 @@
1use axum::http::StatusCode;
2use axum::response::{IntoResponse, Response};
3use export::data::{AppResponseData, NoData};
4use thiserror::Error;
5
6pub type PostResult<T> = Result<T, PostError>;
7
8#[derive(Debug, Error)]
9pub enum PostError {
10 #[error("bad request: {0}")]
11 BadRequest(String),
12 #[error("unauthorized: {0}")]
13 Unauthorized(String),
14 #[error("forbidden: {0}")]
15 Forbidden(String),
16 #[error("not found: {0}")]
17 NotFound(String),
18 #[error("conflict: {0}")]
19 Conflict(String),
20 #[error("unprocessable: {0}")]
21 Unprocessable(String),
22 #[error("rate limited: {0}")]
23 RateLimited(String),
24 #[error("internal: {0}")]
25 Internal(String),
26
27 #[error("database error: {0}")]
28 Sqlx(#[from] db::conn::SqlxError),
29 #[error("uuid: {0}")]
30 Uuid(#[from] uuid::Error),
31}
32
33impl From<axum::extract::rejection::JsonRejection> for PostError {
34 fn from(re: axum::extract::rejection::JsonRejection) -> Self {
35 PostError::BadRequest(re.body_text())
36 }
37}
38
39impl From<axum::extract::rejection::PathRejection> for PostError {
40 fn from(re: axum::extract::rejection::PathRejection) -> Self {
41 PostError::BadRequest(re.body_text())
42 }
43}
44
45impl From<axum::extract::rejection::QueryRejection> for PostError {
46 fn from(re: axum::extract::rejection::QueryRejection) -> Self {
47 PostError::BadRequest(re.body_text())
48 }
49}
50
51impl PostError {
52 fn status(&self) -> StatusCode {
53 match self {
54 PostError::BadRequest(_) => StatusCode::BAD_REQUEST,
55 PostError::Unauthorized(_) => StatusCode::UNAUTHORIZED,
56 PostError::Forbidden(_) => StatusCode::FORBIDDEN,
57 PostError::NotFound(_) => StatusCode::NOT_FOUND,
58 PostError::Conflict(_) => StatusCode::CONFLICT,
59 PostError::Unprocessable(_) => StatusCode::UNPROCESSABLE_ENTITY,
60 PostError::RateLimited(_) => StatusCode::TOO_MANY_REQUESTS,
61 PostError::Internal(_) | PostError::Sqlx(_) | PostError::Uuid(_) => {
62 StatusCode::INTERNAL_SERVER_ERROR
63 }
64 }
65 }
66
67 fn is_user_facing(&self) -> bool {
68 matches!(
69 self,
70 PostError::BadRequest(_)
71 | PostError::Unauthorized(_)
72 | PostError::Forbidden(_)
73 | PostError::NotFound(_)
74 | PostError::Conflict(_)
75 | PostError::Unprocessable(_)
76 | PostError::RateLimited(_)
77 )
78 }
79
80 pub fn error_kind(&self) -> &'static str {
81 match self {
82 PostError::BadRequest(_) => "bad_request",
83 PostError::Unauthorized(_) => "unauthorized",
84 PostError::Forbidden(_) => "forbidden",
85 PostError::NotFound(_) => "not_found",
86 PostError::Conflict(_) => "conflict",
87 PostError::Unprocessable(_) => "unprocessable",
88 PostError::RateLimited(_) => "rate_limited",
89 PostError::Internal(_) => "internal_other",
90 PostError::Sqlx(_) => "internal_db",
91 PostError::Uuid(_) => "internal_uuid",
92 }
93 }
94}
95
96impl IntoResponse for PostError {
97 fn into_response(self) -> Response {
98 let status = self.status();
99 let msg = if self.is_user_facing() {
100 self.to_string()
101 } else {
102 tracing::error!(error = %self, "post internal error");
103 "internal error".to_string()
104 };
105 AppResponseData::<NoData>::err_plain(status.as_u16() as i32, msg).into_response()
106 }
107}
Added lib/post/lib.rs lib/post/lib.rs +10 −0 View lib/post/lib.rs
@@ -0,0 +1,10 @@
1pub mod error;
2pub mod features;
3pub mod handler;
4pub mod metrics;
5pub mod service;
6
7pub use error::{PostError, PostResult};
8pub use features::PostService;
9pub use handler::PostsApiDoc;
10pub use handler::router as posts_router;
Added lib/post/metrics.rs lib/post/metrics.rs +159 −0 View lib/post/metrics.rs
@@ -0,0 +1,159 @@
1use std::time::Instant;
2
3use metrics::{counter, describe_counter, describe_histogram, histogram};
4
5use crate::error::PostError;
6
7pub const FEATURE_POST_BOARDS_CREATE: &str = "post_boards_create";
8pub const FEATURE_POST_BOARDS_LIST: &str = "post_boards_list";
9
10pub const FEATURE_POSTS_CREATE: &str = "posts_create";
11pub const FEATURE_POSTS_GET: &str = "posts_get";
12pub const FEATURE_POSTS_UPDATE: &str = "posts_update";
13pub const FEATURE_POSTS_DELETE: &str = "posts_delete";
14pub const FEATURE_POSTS_LIST: &str = "posts_list";
15pub const FEATURE_POSTS_CLOSE: &str = "posts_close";
16pub const FEATURE_POSTS_REOPEN: &str = "posts_reopen";
17pub const FEATURE_POSTS_ARCHIVE: &str = "posts_archive";
18
19pub const FEATURE_REPLIES_CREATE: &str = "replies_create";
20pub const FEATURE_REPLIES_LIST: &str = "replies_list";
21
22pub const FEATURE_POST_REACTIONS_CREATE: &str = "post_reactions_create";
23pub const FEATURE_POST_REACTIONS_DELETE: &str = "post_reactions_delete";
24pub const FEATURE_POST_REACTIONS_LIST: &str = "post_reactions_list";
25
26pub const FEATURE_POST_MENTIONS_CREATE: &str = "post_mentions_create";
27pub const FEATURE_POST_MENTIONS_LIST: &str = "post_mentions_list";
28
29pub const FEATURE_POST_WATCHES_UPSERT: &str = "post_watches_upsert";
30pub const FEATURE_POST_WATCHES_GET: &str = "post_watches_get";
31pub const FEATURE_POST_WATCHES_DELETE: &str = "post_watches_delete";
32
33pub const FEATURE_POST_LABELS_CREATE: &str = "post_labels_create";
34pub const FEATURE_POST_LABELS_GET: &str = "post_labels_get";
35pub const FEATURE_POST_LABELS_UPDATE: &str = "post_labels_update";
36pub const FEATURE_POST_LABELS_DELETE: &str = "post_labels_delete";
37pub const FEATURE_POST_LABELS_LIST: &str = "post_labels_list";
38pub const FEATURE_POST_LABELS_BIND: &str = "post_labels_bind";
39pub const FEATURE_POST_LABELS_UNBIND: &str = "post_labels_unbind";
40pub const FEATURE_POST_LABELS_LIST_FOR_POST: &str = "post_labels_list_for_post";
41
42pub const OUTCOME_SUCCESS: &str = "success";
43
44static DESCRIBE_ONCE: std::sync::Once = std::sync::Once::new();
45
46pub fn ensure_described() {
47 DESCRIBE_ONCE.call_once(describe_all);
48}
49
50fn describe_all() {
51 describe_counter!(
52 "posts_http_requests_total",
53 "Total HTTP requests handled by the posts service"
54 );
55 describe_histogram!(
56 "posts_http_request_duration_seconds",
57 metrics::Unit::Seconds,
58 "Posts HTTP request latency"
59 );
60 describe_counter!(
61 "posts_usecase_invocations_total",
62 "Total usecase invocations labeled by feature and outcome"
63 );
64 describe_counter!(
65 "posts_usecase_errors_total",
66 "Total usecase errors labeled by feature and error_kind"
67 );
68 describe_histogram!(
69 "posts_usecase_duration_seconds",
70 metrics::Unit::Seconds,
71 "Usecase execution latency"
72 );
73}
74
75pub struct Timer {
76 pub feature: &'static str,
77 pub start: Instant,
78}
79
80impl Timer {
81 pub fn start(feature: &'static str) -> Self {
82 ensure_described();
83 Self {
84 feature,
85 start: Instant::now(),
86 }
87 }
88}
89
90impl Drop for Timer {
91 fn drop(&mut self) {
92 let elapsed = self.start.elapsed().as_secs_f64();
93 histogram!(
94 "posts_usecase_duration_seconds",
95 "feature" => self.feature.to_string()
96 )
97 .record(elapsed);
98 }
99}
100
101pub fn record_outcome<T>(feature: &'static str, result: &Result<T, PostError>) {
102 match result {
103 Ok(_) => {
104 counter!(
105 "posts_usecase_invocations_total",
106 "feature" => feature.to_string(),
107 "outcome" => OUTCOME_SUCCESS
108 )
109 .increment(1);
110 }
111 Err(e) => {
112 let kind = e.error_kind();
113 counter!(
114 "posts_usecase_invocations_total",
115 "feature" => feature.to_string(),
116 "outcome" => kind
117 )
118 .increment(1);
119 counter!(
120 "posts_usecase_errors_total",
121 "feature" => feature.to_string(),
122 "outcome" => kind
123 )
124 .increment(1);
125 }
126 }
127}
128
129#[derive(Debug, Clone, Copy)]
130pub enum PostCreateOutcome {
131 Success,
132 BadTitle,
133 BadBody,
134 BoardNotFound,
135 Forbidden,
136 Other,
137}
138
139impl PostCreateOutcome {
140 pub fn as_label(self) -> &'static str {
141 match self {
142 PostCreateOutcome::Success => "success",
143 PostCreateOutcome::BadTitle => "bad_title",
144 PostCreateOutcome::BadBody => "bad_body",
145 PostCreateOutcome::BoardNotFound => "board_not_found",
146 PostCreateOutcome::Forbidden => "forbidden",
147 PostCreateOutcome::Other => "other",
148 }
149 }
150}
151
152pub fn record_post_create(outcome: PostCreateOutcome) {
153 counter!(
154 "posts_usecase_invocations_total",
155 "feature" => FEATURE_POSTS_CREATE,
156 "outcome" => outcome.as_label()
157 )
158 .increment(1);
159}
Added lib/post/service.rs lib/post/service.rs +53 −0 View lib/post/service.rs
@@ -0,0 +1,53 @@
1use std::sync::Arc;
2
3use cache::redis::RedisCache;
4use db::conn::Db;
5use jwt::JwtState;
6use storage::StorageRepository;
7
8impl space::SpaceDb for PostService {
9 fn db(&self) -> &db::conn::Db {
10 &self.db
11 }
12}
13
14#[derive(Clone)]
15pub struct PostService {
16 pub db: Db,
17 pub kv: Arc<RedisCache>,
18 pub jwt: JwtState,
19 pub storage: Arc<dyn StorageRepository>,
20}
21
22impl PostService {
23 pub fn new(
24 db: Db,
25 kv: Arc<RedisCache>,
26 jwt: JwtState,
27 storage: Arc<dyn StorageRepository>,
28 ) -> Self {
29 Self { db, kv, jwt, storage }
30 }
31}
32
33impl jwt::HasJwtState for PostService {
34 fn jwt_state(&self) -> &JwtState {
35 &self.jwt
36 }
37
38 fn access_blacklist(&self) -> Option<Arc<rate_limit::AccessTokenBlacklist>> {
39 Some(Arc::new(rate_limit::AccessTokenBlacklist::new(
40 self.kv.clone(),
41 )))
42 }
43}
44
45impl rate_limit::RateLimitProvider for PostService {
46 fn rate_limit_kv(&self) -> Arc<RedisCache> {
47 self.kv.clone()
48 }
49
50 fn rate_limit_settings(&self) -> Arc<config::rate_limit::RateLimitConfig> {
51 Arc::new(config::rate_limit::RateLimitConfig::default())
52 }
53}
Modified lib/webapi/Cargo.toml lib/webapi/Cargo.toml +1 −0 View lib/webapi/Cargo.toml
@@ -28,6 +28,7 @@
2828export = { workspace = true }
2929issues = { workspace = true }
3030jwt = { workspace = true }
31post = { workspace = true }
3132project = { workspace = true }
3233payment = { workspace = true }
3334queue = { workspace = true }
Modified lib/webapi/openapi.rs lib/webapi/openapi.rs +1 −0 View lib/webapi/openapi.rs
@@ -20,6 +20,7 @@
2020 WebapiApiDoc,
2121 auth::handler::AuthApiDoc,
2222 issues::IssuesApiDoc,
23 post::PostsApiDoc,
2324 project::ProjectApiDoc,
2425 repo::handler::openapi::ApiDoc,
2526 space::SpaceApiDoc,
Modified lib/webapi/router.rs lib/webapi/router.rs +1 −0 View lib/webapi/router.rs
@@ -13,6 +13,7 @@
1313 .route("/health/ready", get(health::readiness))
1414 .merge(auth::auth_router(services.auth))
1515 .merge(issues::issues_router(services.issues))
16 .merge(post::posts_router(services.post))
1617 .merge(project::project_router(services.project))
1718 .merge(repo::repo_router(services.repo))
1819 .merge(space::space_router(services.space))
Modified lib/webapi/services.rs lib/webapi/services.rs +4 −0 View lib/webapi/services.rs
@@ -11,6 +11,7 @@
1111use jwt::JwtState;
1212use jwt::keys::SigningKeyCache;
1313use mcp::McpService;
14use post::service::PostService;
1415use project::service::ProjectService;
1516use queue::{Queue, QueueBuilder};
1617use repo::service::RepoService;
@@ -50,6 +51,7 @@
5051 pub storage: Arc<dyn StorageRepository>,
5152 pub auth: AuthService,
5253 pub issues: IssueService,
54 pub post: PostService,
5355 pub project: ProjectService,
5456 pub repo: RepoService,
5557 pub space: SpaceService,
@@ -111,6 +113,7 @@
111113
112114 let issues = IssueService::new(db.clone(), kv.clone(), jwt.clone(), storage.clone())
113115 .with_config(Arc::new(cfg.issues.clone()));
116 let post = PostService::new(db.clone(), kv.clone(), jwt.clone(), storage.clone());
114117 let project = ProjectService::new(db.clone(), kv.clone(), jwt.clone())
115118 .with_config(Arc::new(cfg.project.clone()));
116119 let repo = RepoService::new(db.clone(), kv.clone(), jwt.clone())
@@ -141,6 +144,7 @@
141144 storage,
142145 auth,
143146 issues,
147 post,
144148 project,
145149 repo,
146150 space,
Modified Cargo.lock Cargo.lock +36 −0 View Cargo.lock
@@ -5803,6 +5803,41 @@
58035803]
58045804
58055805[[package]]
5806name = "post"
5807version = "1.94.0"
5808dependencies = [
5809 "async-graphql",
5810 "async-trait",
5811 "axum",
5812 "axum-extra",
5813 "bytes",
5814 "cache",
5815 "config 1.94.0",
5816 "db",
5817 "export",
5818 "futures",
5819 "http",
5820 "jwt",
5821 "log",
5822 "metrics",
5823 "object_store",
5824 "rate_limit",
5825 "sea-orm",
5826 "serde",
5827 "serde_json",
5828 "space",
5829 "storage",
5830 "thiserror 2.0.19",
5831 "time",
5832 "tokio",
5833 "tower",
5834 "tracing",
5835 "utoipa",
5836 "uuid",
5837 "validator",
5838]
5839
5840[[package]]
58065841name = "potential_utf"
58075842version = "0.1.5"
58085843source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -8832,6 +8867,7 @@
88328867 "mcp",
88338868 "once_cell",
88348869 "payment",
8870 "post",
88358871 "project",
88368872 "queue",
88378873 "rate_limit",
Modified Cargo.toml Cargo.toml +2 −0 View Cargo.toml
@@ -29,6 +29,7 @@
2929 "lib/obs",
3030 "lib/mcp",
3131 "lib/payment",
32 "lib/post",
3233 "lib/project",
3334 "lib/queue",
3435 "lib/rate_limit",
@@ -69,6 +70,7 @@
6970email = { path = "lib/email" }
7071export = { path = "lib/export" }
7172issues = { path = "lib/issues" }
73post = { path = "lib/post" }
7274jwt = { path = "lib/jwt" }
7375user = { path = "lib/user" }
7476space = { path = "lib/space" }
Modified openapi.json openapi.json +1 −1 View openapi.json
@@ -1 +1 @@
1{"openapi":"3.1.0","info":{"title":"Untitled API","description":"Unified HTTP API for the untitled platform","license":{"name":""},"version":"1.94.0"},"paths":{"/api/v1/auth/agreements":{"get":{"tags":["auth"],"operationId":"handler","responses":{"200":{"description":"List of agreement documents (terms, privacy).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_AgreementDoc"}}}}}}},"/api/v1/auth/agreements/accept":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AcceptAgreementCmd"}}},"required":true},"responses":{"200":{"description":"Agreement acceptance recorded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_AcceptAgreementResp"}}}},"400":{"description":"Unknown agreement key or version mismatch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"Missing or invalid access token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"User not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/auth/email/reclaim":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ReclaimCmd"}}},"required":true},"responses":{"200":{"description":"A Signup verification code was issued to the mailbox if the account is inactive; otherwise a constant-shaped no-op is returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReclaimResp"}}}},"400":{"description":"Validation / PoW failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/email/resend":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ResendCodeCmd"}}},"required":true},"responses":{"200":{"description":"New code issued (or silently no-op if the email is unknown).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ResendCodeResp"}}}},"400":{"description":"Validation / PoW failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/email/verify":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_VerifyCodeCmd"}}},"required":true},"responses":{"200":{"description":"Code verified; the verification-code row id is returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_VerifyCodeResult"}}}},"400":{"description":"Invalid code, missing temp_key cookie, or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_LoginCmd"}}},"required":true},"responses":{"200":{"description":"Authenticated. Returns access/refresh tokens and a public user view.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LoginResp"}}}},"400":{"description":"Validation / PoW failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"Invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"Account forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_LogoutCmd"}}},"required":true},"responses":{"200":{"description":"Refresh token revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LogoutResp"}}}},"401":{"description":"Invalid or expired refresh token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/me":{"get":{"tags":["auth"],"operationId":"handler","responses":{"200":{"description":"Authenticated user profile (full view, including privileged fields).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UserMe"}}}},"401":{"description":"Missing or invalid access token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"User not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/auth/oauth/authorize":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AuthorizeCmd"}}},"required":true},"responses":{"200":{"description":"Authorization URL. The state-cookie carries the OAuth state value for the callback.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_AuthorizationUrlResp"}}}},"400":{"description":"Validation / PoW failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"Unknown provider.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/oauth/callback":{"get":{"tags":["auth"],"operationId":"handler","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OAuthProvider"}},{"name":"code","in":"path","required":true,"schema":{"type":"string"}},{"name":"state","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OAuth login completed. Returns token pair and the resolved user_id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_OAuthLoginResp"}}}},"400":{"description":"Missing state cookie or invalid state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"OAuth flow rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/oauth/providers":{"get":{"tags":["auth"],"operationId":"handler","responses":{"200":{"description":"List of enabled OAuth providers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_OAuthProviderInfo"}}}}}}},"/api/v1/auth/password/forgot":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ForgotPasswordCmd"}}},"required":true},"responses":{"200":{"description":"Request accepted. The response shape is constant whether or not the email is known; the temp_key cookie carries the token for the subsequent reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ForgotPasswordResp"}}}},"400":{"description":"Validation / PoW failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/password/reset":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ResetPasswordCmd"}}},"required":true},"responses":{"200":{"description":"Password updated; all sessions revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ResetPasswordResp"}}}},"400":{"description":"Missing temp_key cookie, weak password, or invalid token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/pow/challenge":{"get":{"tags":["auth"],"operationId":"handler","responses":{"200":{"description":"A fresh PoW challenge bound to this client.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PowChallengeResp"}}}},"400":{"description":"PoW not configured.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/refresh":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_RefreshCmd"}}},"required":true},"responses":{"200":{"description":"Rotated token pair.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RefreshResp"}}}},"401":{"description":"Invalid or expired refresh token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/register":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_RegisterCmd"}}},"required":true},"responses":{"200":{"description":"Account created (possibly pending email verification).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RegisterResp"}}}},"400":{"description":"Validation / PoW failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"Email or username already taken.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/health/live":{"get":{"tags":["system"],"operationId":"liveness","responses":{"200":{"description":"Process is alive","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthStatus"}}}}}}},"/api/v1/health/ready":{"get":{"tags":["system"],"operationId":"readiness","responses":{"200":{"description":"Service is ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthStatus"}}}}}}},"/api/v1/issues":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"q","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List issue boards (collections)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_CollectionView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateCollectionOption"}}},"required":true},"responses":{"201":{"description":"Create an issue board (collection)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CollectionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"Default issue board OR issue list (when query.state/q/author_id/milestone_id is set)"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateIssueOption"}}},"required":true},"responses":{"201":{"description":"Create an issue in this channel's board","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_IssueView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete default issue board"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateCollectionOption"}}},"required":true},"responses":{"200":{"description":"Update default issue board","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CollectionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/attachments/{owner_type}/{owner_id}":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List attachments"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UploadAttachmentInput"}}},"required":true},"responses":{"201":{"description":"Upload attachment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_AttachmentView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/attachments/{owner_type}/{owner_id}/{att_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete attachment"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/labels":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"q","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"is_archived","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List labels"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateLabelOption"}}},"required":true},"responses":{"201":{"description":"Create label","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LabelView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/labels/{label_id}":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"Get label","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LabelView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete label"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateLabelOption"}}},"required":true},"responses":{"200":{"description":"Update label","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LabelView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/milestones":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"is_closed","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"q","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List milestones"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateMilestoneOption"}}},"required":true},"responses":{"201":{"description":"Create milestone","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MilestoneView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/milestones/{milestone_id}":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"Get milestone","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MilestoneView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete milestone"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateMilestoneOption"}}},"required":true},"responses":{"200":{"description":"Update milestone","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MilestoneView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/pins":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"List pinned issues"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreatePinOption"}}},"required":true},"responses":{"201":{"description":"Pin issue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PinView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/pins/{pin_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Unpin issue"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"Get issue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_IssueView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete issue"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateIssueOption"}}},"required":true},"responses":{"200":{"description":"Update issue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_IssueView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/close":{"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CloseIssueOption"}}},"required":true},"responses":{"200":{"description":"Open/close issue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_IssueView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/comments":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"parent_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List comments"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateCommentOption"}}},"required":true},"responses":{"201":{"description":"Create comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommentView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/comments/{comment_id}":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"Get comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommentView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete comment"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateCommentOption"}}},"required":true},"responses":{"200":{"description":"Update comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommentView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/comments/{comment_id}/reactions":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"List comment reactions"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateReactionOption"}}},"required":true},"responses":{"201":{"description":"React to comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReactionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/content_history":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"comment_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List content history"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/dependencies":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"List dependencies"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateDependencyOption"}}},"required":true},"responses":{"201":{"description":"Create dependency","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DependencyView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/dependencies/{dep_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete dependency"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/events":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List issue events"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/labels":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"List labels for issue"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/labels/{label_id}":{"post":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Bind label to issue"}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Unbind label from issue"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/members":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List members"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateMemberOption"}}},"required":true},"responses":{"201":{"description":"Create member","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MemberView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/members/{member_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete member"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/reactions":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"List issue reactions"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateReactionOption"}}},"required":true},"responses":{"201":{"description":"React to issue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReactionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/reactions/{reaction_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete reaction"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/repo_relations":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"List repo relations"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateRepoRelOption"}}},"required":true},"responses":{"201":{"description":"Link repo to issue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoRelView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/repo_relations/{rel_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Unlink repo from issue"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/stopwatch":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"Get my stopwatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_StopwatchView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","responses":{"201":{"description":"Start stopwatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_StopwatchView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Stop stopwatch"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/tracked_time":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List tracked time"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/users":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"List issue users"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/users/{uid}":{"patch":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateIssueUserOption"}}},"required":true},"responses":{"200":{"description":"Update issue user","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_IssueUserView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/watch":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"Get my watch state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_WatchView"}}}}},"security":[{"bearer_auth":[]}]},"put":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpsertWatchOption"}}},"required":true},"responses":{"200":{"description":"Upsert watch state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_WatchView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete watch state"}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"List projects","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ProjectPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateProjectCmd"}}},"required":true},"responses":{"201":{"description":"Create a project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ProjectView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"Get a project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ProjectView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["project"],"operationId":"handler","responses":{"204":{"description":"Delete a project"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateProjectCmd"}}},"required":true},"responses":{"200":{"description":"Update a project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ProjectView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/activities":{"get":{"tags":["project"],"operationId":"handler","parameters":[{"name":"verb","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"page","in":"path","required":true,"schema":{"type":"integer","format":"int64","minimum":0}},{"name":"per_page","in":"path","required":true,"schema":{"type":"integer","format":"int64","minimum":0}}],"responses":{"200":{"description":"List activities","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ActivityPage"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/documents":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"List documents","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DocumentPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateDocumentCmd"}}},"required":true},"responses":{"201":{"description":"Create a document","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DocumentView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/documents/{doc_id}":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"Get a document","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DocumentView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["project"],"operationId":"handler","responses":{"204":{"description":"Delete a document"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateDocumentCmd"}}},"required":true},"responses":{"200":{"description":"Update a document","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DocumentView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/favorites":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"List favorites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_FavoritePage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AddFavoriteCmd"}}},"required":true},"responses":{"201":{"description":"Add a favorite","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_FavoriteView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/favorites/{favorite_id}":{"delete":{"tags":["project"],"operationId":"handler","responses":{"204":{"description":"Remove a favorite"}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/links":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"List links","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LinkPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AddLinkCmd"}}},"required":true},"responses":{"201":{"description":"Add a link","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LinkView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/links/{link_id}":{"delete":{"tags":["project"],"operationId":"handler","responses":{"204":{"description":"Remove a link"}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/members":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"List members","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MemberPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AddMemberCmd"}}},"required":true},"responses":{"201":{"description":"Add a member","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MemberView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/members/{user_id}":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"Get a member","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MemberView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["project"],"operationId":"handler","responses":{"204":{"description":"Remove a member"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateMemberCmd"}}},"required":true},"responses":{"200":{"description":"Update a member","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MemberView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/views":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"List views","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ViewPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateViewCmd"}}},"required":true},"responses":{"201":{"description":"Create a view","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ViewView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/views/{view_id}":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"Get a view","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ViewView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["project"],"operationId":"handler","responses":{"204":{"description":"Delete a view"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateViewCmd"}}},"required":true},"responses":{"200":{"description":"Update a view","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ViewView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"owner_user_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"is_private","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"is_archived","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"q","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List repositories","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateRepoOption"}}},"required":true},"responses":{"201":{"description":"Create a repository","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/search":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"q","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"topic","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"include_desc","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"uid","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"priority_owner_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"team_id","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64"}},{"name":"starred_by","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"private","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"is_private","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"template","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"archived","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"mode","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"exclusive","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"sort","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"order","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"Search repositories","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SearchResults"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a repository","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Delete a repository"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateRepoOption"}}},"required":true},"responses":{"200":{"description":"Update a repository","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/archive":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ArchiveRepoOption"}}},"required":true},"responses":{"200":{"description":"Archive / unarchive a repository","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/archive/{archive_format}/{ref_name}":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"format","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"ref_name","in":"path","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Download an archive"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/assignees/{assignee}":{"get":{"tags":["repo"],"operationId":"check_handler","responses":{"204":{"description":"User is a valid assignee"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/avatar":{"post":{"tags":["repo"],"operationId":"post_handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateAvatarOption"}}},"required":true},"responses":{"204":{"description":"Update repo avatar"}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"delete_handler","responses":{"204":{"description":"Delete repo avatar"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/branch_protections":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List branch protections","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchProtectionPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateBranchProtectionOption"}}},"required":true},"responses":{"201":{"description":"Create a branch protection","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchProtectionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/branch_protections/priority":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateBranchProtectionPriorities"}}},"required":true},"responses":{"204":{"description":"Update branch protection priorities"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/branch_protections/{policy_id}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a branch protection","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchProtectionView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Delete a branch protection"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_EditBranchProtectionOption"}}},"required":true},"responses":{"200":{"description":"Edit a branch protection","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchProtectionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/branches":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"keyword","in":"path","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"List branches","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateBranchOption"}}},"required":true},"responses":{"201":{"description":"Create a branch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/branches/{branch_name}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a branch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchView"}}}}},"security":[{"bearer_auth":[]}]},"put":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateBranchOption"}}},"required":true},"responses":{"200":{"description":"Update a branch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Delete a branch"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/branches/{branch_name}/rename":{"patch":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_RenameBranchOption"}}},"required":true},"responses":{"200":{"description":"Rename a branch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/collaborators":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List collaborators","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CollaboratorPage"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/collaborators/{user_id}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"User is a collaborator"}},"security":[{"bearer_auth":[]}]},"put":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AddCollaboratorOption"}}},"required":true},"responses":{"204":{"description":"Add or update a collaborator"}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Remove a collaborator"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/collaborators/{user_id}/permission":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get collaborator permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoCollaboratorPermission"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/commits":{"get":{"tags":["repo"],"operationId":"list_handler","parameters":[{"name":"sha","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"path","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"since","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"until","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"stat","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"verification","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"files","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"not","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List commits","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommitsResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/commits/{ref}/status":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get combined status by ref","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CombinedStatusView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/commits/{ref}/statuses":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"sort","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"state","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List commit statuses by ref","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommitStatusPage"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/compare/{base}...{head}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Compare two refs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CompareView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/contents":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"List contents at root","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ContentsListResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/contents-ext":{"get":{"tags":["repo"],"operationId":"list_handler","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"List contents (ext form)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentsExtResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/contents-ext/{path:path}":{"get":{"tags":["repo"],"operationId":"get_handler","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Get contents (ext form)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentsExtResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/contents/change":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ChangeFilesOptions"}}},"required":true},"responses":{"200":{"description":"Multi-file change","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ContentsListResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/contents/{path}":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Get a file or directory","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ContentsResponse"}}}}},"security":[{"bearer_auth":[]}]},"put":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateFileOption"}}},"required":true},"responses":{"200":{"description":"Update a file","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ContentsResponse"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateFileOption"}}},"required":true},"responses":{"201":{"description":"Create a file","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ContentsResponse"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_DeleteFileOption"}}},"required":true},"responses":{"204":{"description":"Delete a file"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/diffpatch":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ApplyDiffPatchFileOptions"}}},"required":true},"responses":{"200":{"description":"Apply a diff patch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ContentsResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/editorconfig/{filename:path}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get EditorConfig","content":{"text/plain":{}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/file-contents":{"get":{"tags":["repo"],"operationId":"get_handler","responses":{"200":{"description":"Batch read files","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_FilesResponse"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"post_handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_Vec_String"}}},"required":true},"responses":{"200":{"description":"Batch read files","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_FileDeleteResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/forks":{"get":{"tags":["repo"],"operationId":"list_handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List forks","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ForksResponse"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ForkRepoOption"}}},"required":true},"responses":{"201":{"description":"Fork a repository","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/generate":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_GenerateRepoOption"}}},"required":true},"responses":{"201":{"description":"Generate a repository from template","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/blobs/{sha}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a blob","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BlobView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/commits/diff/{sha}":{"get":{"tags":["repo"],"operationId":"diff_handler","responses":{"200":{"description":"Get commit diff or patch","content":{"text/plain":{}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/commits/{sha}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a commit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommitView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/commits/{sha}.{diff_type}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get commit diff or patch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommitDiffPayload"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/notes/{sha}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a note","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_NoteView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/refs":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"List git refs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_GitRef"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/refs/{filter}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Filter git refs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_GitRef"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/tags/{sha}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get an annotated tag","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommitView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/trees/{sha}":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"recursive","in":"path","required":true,"schema":{"type":["boolean","null"]}}],"responses":{"200":{"description":"Get a tree","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TreeView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/issue_config":{"get":{"tags":["repo"],"operationId":"get_handler","responses":{"200":{"description":"Get issue config","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_IssueConfig"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/issue_config/validate":{"get":{"tags":["repo"],"operationId":"validate_handler","responses":{"200":{"description":"Validate issue config","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_IssueConfigValidation"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/issue_templates":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"List issue templates","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_IssueTemplate"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/keys":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"fingerprint","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List deploy keys","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DeployKeyPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateDeployKeyOption"}}},"required":true},"responses":{"201":{"description":"Create a deploy key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DeployKeyView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/keys/{key_id}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a deploy key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DeployKeyView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Delete a deploy key"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/languages":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get repo language stats","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LanguagesResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/licenses":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"List detected licenses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LicensesResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/media/{filepath:path}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get media (raw or LFS pointer)","content":{"application/octet-stream":{}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/merge-upstream":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_MergeUpstreamRequest"}}},"required":true},"responses":{"200":{"description":"Merge upstream","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MergeUpstreamResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/new_pin_allowed":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Whether new issue pins are allowed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_NewPinAllowedResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"state","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"keyword","in":"path","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"List pull requests","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreatePullRequestOption"}}},"required":true},"responses":{"201":{"description":"Create a pull request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a pull request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestView"}}}}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdatePullRequestOption"}}},"required":true},"responses":{"200":{"description":"Update a pull request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}/close":{"post":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Close a pull request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}/comments":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"List pull request comments","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_PullRequestCommentView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreatePullRequestCommentOption"}}},"required":true},"responses":{"201":{"description":"Create a pull request comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestCommentView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}/events":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"List pull request events","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_PullRequestEventView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}/lock":{"post":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Lock a pull request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}/merge":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_MergePullRequestOption"}}},"required":true},"responses":{"200":{"description":"Merge a pull request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MergeView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}/reopen":{"post":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Reopen a pull request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}/reviews":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"List pull request reviews","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_PullRequestReviewView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_SubmitPullRequestReviewOption"}}},"required":true},"responses":{"201":{"description":"Submit a pull request review","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestReviewView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}/unlock":{"post":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Unlock a pull request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/raw/{filepath:path}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get raw file content","content":{"application/octet-stream":{}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/releases":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"draft","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"prerelease","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List releases","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReleasePage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateReleaseOption"}}},"required":true},"responses":{"201":{"description":"Create a release","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReleaseView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/releases/latest":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get the latest release","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReleaseView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/releases/tags/{tag}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a release by tag","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReleaseView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Delete a release by tag"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/releases/{release_id}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a release","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReleaseView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Delete a release"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_EditReleaseOption"}}},"required":true},"responses":{"200":{"description":"Edit a release","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReleaseView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/releases/{release_id}/assets":{"get":{"tags":["repo"],"operationId":"list_handler","responses":{"200":{"description":"List release attachments","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReleaseAttachmentListResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/releases/{release_id}/assets/{attachment_id}":{"get":{"tags":["repo"],"operationId":"get_handler","responses":{"200":{"description":"Get a release attachment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReleaseAttachmentView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/rename":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_RenameRepoOption"}}},"required":true},"responses":{"200":{"description":"Rename a repository","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/reviewers":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"List reviewers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_UserMini"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/signing-key.gpg":{"get":{"tags":["repo"],"operationId":"gpg_handler","responses":{"200":{"description":"GPG signing key","content":{"text/plain":{}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/signing-key.pub":{"get":{"tags":["repo"],"operationId":"ssh_handler","responses":{"200":{"description":"SSH signing key","content":{"text/plain":{}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/stargazers":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List stargazers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_UserMini"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/statuses/{sha}":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"sort","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"state","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List commit statuses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommitStatusPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateStatusOption"}}},"required":true},"responses":{"201":{"description":"Create a commit status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommitStatusView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/subscribers":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List subscribers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SubscriberPage"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/subscription":{"get":{"tags":["repo"],"operationId":"get_handler","responses":{"200":{"description":"Get current user's subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Subscription"}}}}},"security":[{"bearer_auth":[]}]},"put":{"tags":["repo"],"operationId":"put_handler","responses":{"204":{"description":"Watch the repo"}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"delete_handler","responses":{"204":{"description":"Unwatch the repo"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/sync":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get repo metadata sync status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SyncStatus"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/sync/run":{"post":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Trigger a metadata sync","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SyncResult"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/tag_protections":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List tag protections","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TagProtectionPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateTagProtectionOption"}}},"required":true},"responses":{"201":{"description":"Create a tag protection","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TagProtectionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/tag_protections/{policy_id}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a tag protection","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TagProtectionView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Delete a tag protection"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_EditTagProtectionOption"}}},"required":true},"responses":{"200":{"description":"Edit a tag protection","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TagProtectionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/tags":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List tags","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TagPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateTagOption"}}},"required":true},"responses":{"201":{"description":"Create a tag","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TagView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/tags/{tag_name}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a tag","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TagView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Delete a tag"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/topics":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"List repo topics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TopicList"}}}}},"security":[{"bearer_auth":[]}]},"put":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_RepoTopicOptions"}}},"required":true},"responses":{"204":{"description":"Replace repo topics"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/topics/{topic}":{"put":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Add a topic"}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Remove a topic"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/transfer":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_TransferRepoOption"}}},"required":true},"responses":{"200":{"description":"Transfer a repository","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repositories/{id}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a repository by id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoSummary"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces":{"get":{"tags":["space"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List spaces owned by the caller","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpacePage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateSpaceCmd"}}},"required":true},"responses":{"200":{"description":"Create a new space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/invites/accept":{"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AcceptInviteCmd"}}},"required":true},"responses":{"200":{"description":"Accept an invite"}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}":{"get":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Get a space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceView"}}}}}},"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Delete a space"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateSpaceCmd"}}},"required":true},"responses":{"200":{"description":"Update a space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/bans":{"get":{"tags":["space"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List bans in a space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceBanPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateBanCmd"}}},"required":true},"responses":{"200":{"description":"Ban a user from a space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceBanView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/bans/{uid}":{"get":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Get a ban","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceBanView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Unban a user from a space"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateBanCmd"}}},"required":true},"responses":{"200":{"description":"Update a ban","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceBanView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/channels":{"get":{"tags":["space"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List channels in a space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ChannelPage"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/channels/{cid}":{"get":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Get a channel","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ChannelView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/channels/{cid}/overwrites/roles":{"get":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"List role overwrites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_RoleOverwriteView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_SetRoleOverwriteCmd"}}},"required":true},"responses":{"200":{"description":"Set a role overwrite","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RoleOverwriteView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/channels/{cid}/overwrites/roles/{rid}":{"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Remove a role overwrite"}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/channels/{cid}/overwrites/users":{"get":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"List user overwrites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_UserOverwriteView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_SetUserOverwriteCmd"}}},"required":true},"responses":{"200":{"description":"Set a user overwrite","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UserOverwriteView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/channels/{cid}/overwrites/users/{uid}":{"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Remove a user overwrite"}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/invites":{"get":{"tags":["space"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List invites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceInvitePage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateInviteCmd"}}},"required":true},"responses":{"200":{"description":"Create an invite","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceInviteView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/invites/{iid}":{"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Revoke an invite","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceInviteView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/members":{"get":{"tags":["space"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List members of a space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceMemberPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AddMemberCmd"}}},"required":true},"responses":{"200":{"description":"Add a member to a space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceMemberView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/members/{uid}":{"get":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Get a space member","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceMemberView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Remove a member from a space"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateMemberCmd"}}},"required":true},"responses":{"200":{"description":"Update a space member","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceMemberView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/members/{uid}/roles":{"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AssignRoleCmd"}}},"required":true},"responses":{"200":{"description":"Assign a role to a member"}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/members/{uid}/roles/{rid}":{"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Unassign a role from a member"}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/roles":{"get":{"tags":["space"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List roles in a space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RolePage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateRoleCmd"}}},"required":true},"responses":{"200":{"description":"Create a role","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RoleView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/roles/{rid}":{"get":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Get a role","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RoleView"}}}}}},"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Delete a role"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateRoleCmd"}}},"required":true},"responses":{"200":{"description":"Update a role","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RoleView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/topics/search":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"q","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"Search topics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TopicSearchResult"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/admin/deletions":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"List pending and scheduled deletion requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_DeletionRequestView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/admin/deletions/{id}/complete":{"post":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"Deletion request id.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Deletion completed; sessions revoked."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/admin/suspensions":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"include_revoked","in":"query","description":"Include revoked suspensions (default false).","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"All suspensions (admin view).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_SuspensionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/admin/suspensions/{id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"Suspension id.","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_RevokeSuspensionCmd"}}},"required":true},"responses":{"204":{"description":"Suspension revoked."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/admin/users/{uid}/profile":{"patch":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateProfileCmd"}}},"required":true},"responses":{"200":{"description":"Admin-updated profile.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UserMe"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/admin/users/{uid}/suspensions":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"include_revoked","in":"query","description":"Include revoked suspensions (default false).","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Suspensions for the given user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_SuspensionView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_SuspendCmd"}}},"required":true},"responses":{"200":{"description":"Suspension created (also sets users.is_restricted = true).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SuspensionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Authenticated user profile (privileged view).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UserMe"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/access-keys":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"List access keys for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_AccessKeyView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateAccessKeyCmd"}}},"required":true},"responses":{"200":{"description":"Access key created (token returned only once).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CreateAccessKeyResp"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/access-keys/{id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"Access key identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Access key deleted."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/avatar":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Current avatar metadata (200 with empty body if none).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Option_AvatarView"}}}}},"security":[{"bearer_auth":[]}]},"put":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UploadAvatarCmd"}}},"required":true},"responses":{"200":{"description":"Avatar uploaded and bound to caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_AvatarView"}}}},"400":{"description":"Invalid content_type or base64 payload."}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["user"],"operationId":"handler","responses":{"204":{"description":"Avatar removed."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/blocks":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"limit","in":"query","description":"Maximum items (default 20).","required":false,"schema":{"type":"integer","minimum":0}},{"name":"cursor","in":"query","description":"Pagination cursor (id).","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Page of blocked users.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_BlockedSummary"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/blocks/{uid}":{"post":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Block succeeded (idempotent; also unfollows both directions)."},"404":{"description":"Target user not found."}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Unblock succeeded."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/deletion":{"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_RequestDeletionCmd"}}},"required":true},"responses":{"200":{"description":"Deletion request created or returned (idempotent).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DeletionRequestView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["user"],"operationId":"handler","responses":{"204":{"description":"Active deletion request cancelled."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/deletion/confirm":{"post":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Deletion request scheduled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DeletionRequestView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/devices":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"List devices registered to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_DeviceView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/devices/{id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"Device identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Device removed."}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"Device identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateDeviceCmd"}}},"required":true},"responses":{"200":{"description":"Device updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DeviceView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/email-change":{"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_RequestChangeBody"}}},"required":true},"responses":{"200":{"description":"Email change ticket created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_EmailChangeTicketView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/email-change/confirm":{"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ConfirmEmailChangeCmd"}}},"required":true},"responses":{"200":{"description":"Ticket status advanced.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_EmailChangeTicketView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/email-change/{ticket_id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"ticket_id","in":"path","description":"Ticket identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Ticket cancelled."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/emails":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"List active emails for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_EmailView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AddEmailCmd"}}},"required":true},"responses":{"200":{"description":"Email added (unverified).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_AddEmailResp"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/emails/{email_id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"email_id","in":"path","description":"Email identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Email soft-deleted."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/emails/{email_id}/primary":{"patch":{"tags":["user"],"operationId":"handler","parameters":[{"name":"email_id","in":"path","description":"Email identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Primary email changed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SetPrimaryEmailResp"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/memes":{"get":{"tags":["user"],"operationId":"list_handler","parameters":[{"name":"limit","in":"query","description":"Maximum items (default 20).","required":false,"schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"List the caller's favorite memes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_MemeView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["user"],"operationId":"create_handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpsertMemeCmd"}}},"required":true},"responses":{"200":{"description":"Meme created or updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MemeView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/memes/{id}":{"delete":{"tags":["user"],"operationId":"delete_handler","parameters":[{"name":"id","in":"path","description":"Meme identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Meme deleted."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/messages/saved":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Saved messages for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_SavedMessageView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_SaveMessageCmd"}}},"required":true},"responses":{"200":{"description":"Message saved (idempotent).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SavedMessageView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/messages/saved/{message_id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"message_id","in":"path","description":"Message identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Message removed from saved list."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/messages/scheduled":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Scheduled messages for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_ScheduledMessageView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/messages/scheduled/{id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"Scheduled message identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Scheduled message cancelled."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/notifications":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"unread_only","in":"query","description":"Only return unread notifications.","required":false,"schema":{"type":"boolean"}},{"name":"notification_type","in":"query","description":"Filter by notification type.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum items (default 20).","required":false,"schema":{"type":"integer","minimum":0}},{"name":"cursor","in":"query","description":"Pagination cursor (id).","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Notifications for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_NotificationView"}}}}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_MarkReadCmd"}}},"required":true},"responses":{"200":{"description":"Notifications marked as read.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MarkReadResp"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/notifications/mark-all-read":{"post":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"All notifications marked as read.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MarkAllReadResp"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/notifications/unread-count":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Number of unread notifications for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UnreadCountResp"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/preferences":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"User preferences (auto-created if missing).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UserPreferences"}}}}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdatePreferencesCmd"}}},"required":true},"responses":{"200":{"description":"Updated preferences.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UserPreferences"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/profile":{"patch":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateProfileCmd"}}},"required":true},"responses":{"200":{"description":"Updated self profile.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UserMe"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/push-subscriptions":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"List push subscriptions for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_PushSubscriptionView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpsertPushCmd"}}},"required":true},"responses":{"200":{"description":"Push subscription upserted (endpoint-keyed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PushSubscriptionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/push-subscriptions/{id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"Push subscription id.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Push subscription deleted."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/recent-mentions":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"limit","in":"query","description":"Maximum items (default 20).","required":false,"schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"Recent mentions for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_RecentMentionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/recovery-codes":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"List recovery codes for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_RecoveryCodeView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/recovery-codes/regenerate":{"post":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Recovery codes regenerated (plaintext returned once).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RegenerateRecoveryResp"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/reports":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Reports submitted by the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_ReportView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/sessions":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"app_id","in":"query","description":"Filter by app id.","required":false,"schema":{"type":"string"}},{"name":"include_revoked","in":"query","description":"Include revoked sessions (default false).","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"List active sessions for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_SessionView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"All sessions revoked for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RevokeAllResp"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/sessions/{id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"Session identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Session revoked."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/ssh-keys":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"List SSH keys for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_SshKeyView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AddSshKeyCmd"}}},"required":true},"responses":{"200":{"description":"SSH key added.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SshKeyView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/ssh-keys/{id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"SSH key identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"SSH key deleted."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/suspensions":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Active suspensions affecting the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_SuspensionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/reports":{"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_SubmitReportCmd"}}},"required":true},"responses":{"200":{"description":"Report submitted (status = Open).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReportView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/users/{uid}":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"User identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Public view of the user (visibility-filtered).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UserPublic"}}}},"404":{"description":"User not found."}}}},"/api/v1/user/users/{uid}/follow":{"post":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Follow succeeded (idempotent)."},"404":{"description":"Target user not found."}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Unfollow succeeded."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/users/{uid}/followers":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","description":"Maximum items (default 20).","required":false,"schema":{"type":"integer","minimum":0}},{"name":"cursor","in":"query","description":"Pagination cursor (id).","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Page of followers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_FollowerSummary"}}}}}}},"/api/v1/user/users/{uid}/following":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","description":"Maximum items (default 20).","required":false,"schema":{"type":"integer","minimum":0}},{"name":"cursor","in":"query","description":"Pagination cursor (id).","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Page of accounts the user follows.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_FollowerSummary"}}}}}}},"/api/v1/user/users/{uid}/profile-detail":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"User identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Extended profile record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ProfileView"}}}},"404":{"description":"Profile not found."}}}}},"components":{"schemas":{"AcceptAgreementCmd":{"type":"object","required":["user_id","agreement_key","agreement_version"],"properties":{"agreement_key":{"type":"string"},"agreement_version":{"type":"string"},"user_id":{"type":"string"}}},"AcceptAgreementResp":{"type":"object","required":["recorded"],"properties":{"recorded":{"type":"boolean"}}},"AcceptInviteCmd":{"type":"object","required":["accept_code"],"properties":{"accept_code":{"type":"string"}}},"AccessKeyScope":{"type":"string","enum":["read","write","repo","admin","all"]},"AccessKeyView":{"type":"object","required":["id","name","token_last_eight","scope","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"scope":{"$ref":"#/components/schemas/AccessKeyScope"},"token_last_eight":{"type":"string"},"updated_at":{"type":"string"}}},"ActivityPage":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ActivityView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"ActivityView":{"type":"object","required":["id","project_id","actor_id","verb","target_kind","created_at"],"properties":{"actor_id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time"},"id":{"type":"string","format":"uuid"},"payload":{},"project_id":{"type":"string","format":"uuid"},"target_id":{"type":["string","null"],"format":"uuid"},"target_kind":{"type":"string"},"verb":{"type":"string"}}},"AddCollaboratorOption":{"type":"object","required":["permission"],"properties":{"permission":{"type":"string"}}},"AddEmailCmd":{"type":"object","required":["email"],"properties":{"email":{"type":"string"}}},"AddEmailResp":{"type":"object","required":["email_id"],"properties":{"email_id":{"type":"string","format":"uuid"}}},"AddFavoriteCmd":{"type":"object","properties":{"folder":{"type":["string","null"]}}},"AddLinkCmd":{"type":"object","required":["related_project_id","kind"],"properties":{"kind":{"$ref":"#/components/schemas/LinkKind"},"related_project_id":{"type":"string","format":"uuid"}}},"AddMemberCmd":{"type":"object","required":["user_id"],"properties":{"role":{"$ref":"#/components/schemas/MemberRole"},"user_id":{"type":"string","format":"uuid"}}},"AddSshKeyCmd":{"type":"object","required":["name","content"],"properties":{"content":{"type":"string"},"key_type":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SshKeyType"}]},"name":{"type":"string"}}},"AgreementDoc":{"type":"object","required":["key","version","updated_at","title","content_md"],"properties":{"content_md":{"type":"string"},"key":{"type":"string"},"title":{"type":"string"},"updated_at":{"type":"string"},"version":{"type":"string"}}},"AppRequestData_AcceptAgreementCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["user_id","agreement_key","agreement_version"],"properties":{"agreement_key":{"type":"string"},"agreement_version":{"type":"string"},"user_id":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_AcceptInviteCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["accept_code"],"properties":{"accept_code":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_AddCollaboratorOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["permission"],"properties":{"permission":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_AddEmailCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["email"],"properties":{"email":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_AddFavoriteCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"folder":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_AddLinkCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["related_project_id","kind"],"properties":{"kind":{"$ref":"#/components/schemas/LinkKind"},"related_project_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_AddMemberCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["user_id"],"properties":{"role":{"$ref":"#/components/schemas/MemberRole"},"user_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_AddSshKeyCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name","content"],"properties":{"content":{"type":"string"},"key_type":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SshKeyType"}]},"name":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_ApplyDiffPatchFileOptions":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["content"],"properties":{"content":{"type":"string"},"sha":{"type":["string","null"]}}}]},"request_id":{"type":"string"}}},"AppRequestData_ArchiveRepoOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["archived"],"properties":{"archived":{"type":"boolean"}}},"request_id":{"type":"string"}}},"AppRequestData_AssignRoleCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["role_id"],"properties":{"role_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_AuthorizeCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["provider","code_verifier"],"properties":{"app_id":{"type":["string","null"]},"code_verifier":{"type":"string"},"provider":{"$ref":"#/components/schemas/OAuthProvider"}}},"request_id":{"type":"string"}}},"AppRequestData_ChangeFilesOptions":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["files"],"properties":{"files":{"type":"array","items":{"$ref":"#/components/schemas/ChangeFileEntry"}}}}]},"request_id":{"type":"string"}}},"AppRequestData_CloseIssueOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["closed"],"properties":{"closed":{"type":"boolean"}}},"request_id":{"type":"string"}}},"AppRequestData_ConfirmEmailChangeCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["ticket_id"],"properties":{"ticket_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateAccessKeyCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name","scope"],"properties":{"name":{"type":"string"},"scope":{"$ref":"#/components/schemas/AccessKeyScope"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateBanCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["user_id"],"properties":{"allow_agent_join":{"type":["boolean","null"]},"allow_comment_any":{"type":["boolean","null"]},"allow_push_repo":{"type":["boolean","null"]},"allow_speak":{"type":["boolean","null"]},"expires_at":{"type":["string","null"]},"reason":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateBranchOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["new_branch_name"],"properties":{"new_branch_name":{"type":"string"},"old_branch_name":{"type":["string","null"]},"old_ref_name":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_CreateBranchProtectionOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["branch_name"],"properties":{"approvals_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"approvals_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"block_admin_merge_override":{"type":["boolean","null"]},"block_on_change_requested_reviews":{"type":["boolean","null"]},"block_on_outdated_branch":{"type":["boolean","null"]},"block_on_rejected_reviews":{"type":["boolean","null"]},"branch_name":{"type":"string"},"branch_pattern":{"type":["string","null"]},"bypass_allowlist_teams":{"type":["array","null"],"items":{"type":"string"}},"bypass_allowlist_usernames":{"type":["array","null"],"items":{"type":"string"}},"dismiss_stale_approvals":{"type":["boolean","null"]},"enable_approvals_whitelist":{"type":["boolean","null"]},"enable_bypass_allowlist":{"type":["boolean","null"]},"enable_force_push":{"type":["boolean","null"]},"enable_force_push_allowlist":{"type":["boolean","null"]},"enable_merge_whitelist":{"type":["boolean","null"]},"enable_push":{"type":["boolean","null"]},"enable_push_whitelist":{"type":["boolean","null"]},"force_push_allowlist_deploy_keys":{"type":["boolean","null"]},"force_push_allowlist_teams":{"type":["array","null"],"items":{"type":"string"}},"force_push_allowlist_usernames":{"type":["array","null"],"items":{"type":"string"}},"ignore_stale_approvals":{"type":["boolean","null"]},"merge_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"merge_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"priority":{"type":["integer","null"],"format":"int64"},"protected_file_patterns":{"type":["string","null"]},"push_whitelist_deploy_keys":{"type":["boolean","null"]},"push_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"push_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"require_signed_commits":{"type":["boolean","null"]},"required_approvals":{"type":["integer","null"],"format":"int32"},"rule_name":{"type":["string","null"]},"unprotected_file_patterns":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_CreateCollectionOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["space_id","name"],"properties":{"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"name":{"type":"string"},"parent_dir":{"type":["string","null"],"format":"uuid"},"space_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateCommentOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["content"],"properties":{"content":{"type":"string"},"parent_id":{"type":["string","null"],"format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateDependencyOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["dependency_id"],"properties":{"dependency_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateDeployKeyOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["title","key"],"properties":{"key":{"type":"string"},"read_only":{"type":["boolean","null"]},"title":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateDocumentCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["title","slug"],"properties":{"content":{"type":"string"},"icon":{"type":["string","null"]},"parent_id":{"type":["string","null"],"format":"uuid"},"slug":{"type":"string"},"title":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateFileOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["content"],"properties":{"content":{"type":"string"}}}]},"request_id":{"type":"string"}}},"AppRequestData_CreateInviteCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["role_ids"],"properties":{"email":{"type":["string","null"]},"expires_at":{"type":["string","null"]},"role_ids":{"type":"array","items":{"type":"string","format":"uuid"}},"user_id":{"type":["string","null"],"format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateIssueOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["title","body"],"properties":{"body":{"type":"string"},"description":{"type":["string","null"]},"milestone_id":{"type":["string","null"],"format":"uuid"},"title":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateLabelOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name","color"],"properties":{"color":{"type":"string"},"description":{"type":["string","null"]},"exclusive":{"type":["boolean","null"]},"exclusive_order":{"type":["integer","null"],"format":"int32"},"name":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateMemberOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["user_id","kind"],"properties":{"kind":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateMilestoneOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name"],"properties":{"description":{"type":["string","null"]},"due_at":{"type":["string","null"]},"name":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreatePinOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["issue_id","pin_order"],"properties":{"issue_id":{"type":"string","format":"uuid"},"pin_order":{"type":"integer","format":"int32"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateProjectCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["space_id","name"],"properties":{"color":{"type":["string","null"]},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"lead_id":{"type":["string","null"],"format":"uuid"},"name":{"type":"string"},"parent_dir":{"type":["string","null"],"format":"uuid"},"space_id":{"type":"string","format":"uuid"},"target_date":{"type":["string","null"],"format":"date"}}},"request_id":{"type":"string"}}},"AppRequestData_CreatePullRequestCommentOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["body"],"properties":{"body":{"type":"string"},"commit_sha":{"type":["string","null"]},"line":{"type":["integer","null"],"format":"int32"},"path":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_CreatePullRequestOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["title","head","base"],"properties":{"base":{"type":"string"},"body":{"type":["string","null"]},"head":{"type":"string"},"title":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateReactionOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["emoji"],"properties":{"emoji":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateReleaseOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["tag_name","title"],"properties":{"content":{"type":["string","null"]},"is_draft":{"type":["boolean","null"]},"is_prerelease":{"type":["boolean","null"]},"tag_message":{"type":["string","null"]},"tag_name":{"type":"string"},"target":{"type":["string","null"]},"title":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateRepoOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["space_id","name"],"properties":{"auto_init":{"type":["boolean","null"]},"default_branch":{"type":["string","null"]},"description":{"type":["string","null"]},"enable_lfs":{"type":["boolean","null"]},"gitignores":{"type":["string","null"]},"is_private":{"type":["boolean","null"]},"issue_labels":{"type":["string","null"]},"license_name":{"type":["string","null"]},"name":{"type":"string"},"object_format":{"type":["string","null"]},"parent_dir":{"type":["string","null"],"format":"uuid"},"readme":{"type":["string","null"]},"space_id":{"type":"string","format":"uuid"},"template":{"type":["boolean","null"]},"website":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_CreateRepoRelOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["repo_id"],"properties":{"repo_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateRoleCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name","permissions"],"properties":{"color":{"type":["string","null"]},"icon_hash":{"type":["string","null"]},"name":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}},"position":{"type":["integer","null"],"format":"int64"},"unicode_emoji":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_CreateSpaceCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name"],"properties":{"allow_invite":{"type":"boolean"},"allow_join":{"type":"boolean"},"allow_join_level":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SpaceAllowJoinLevel"}]},"avatar_url":{"type":["string","null"]},"description":{"type":["string","null"]},"member_must_enable_2fa":{"type":"boolean"},"name":{"type":"string"},"public":{"type":"boolean"},"welcome_message":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_CreateStatusOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["state","context"],"properties":{"context":{"type":"string"},"description":{"type":["string","null"]},"state":{"type":"string"},"target_url":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_CreateTagOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["tag_name"],"properties":{"message":{"type":["string","null"]},"tag_name":{"type":"string"},"target":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_CreateTagProtectionOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name_pattern"],"properties":{"name_pattern":{"type":"string"},"whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"whitelist_usernames":{"type":["array","null"],"items":{"type":"string","format":"uuid"}}}},"request_id":{"type":"string"}}},"AppRequestData_CreateViewCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name"],"properties":{"description":{"type":["string","null"]},"filter":{},"group_by":{"type":["string","null"]},"is_shared":{"type":"boolean"},"layout":{"type":"string"},"name":{"type":"string"},"sort_by":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_DeleteFileOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["sha"],"properties":{"sha":{"type":"string"}}}]},"request_id":{"type":"string"}}},"AppRequestData_EditBranchProtectionOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"approvals_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"approvals_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"block_admin_merge_override":{"type":["boolean","null"]},"block_on_change_requested_reviews":{"type":["boolean","null"]},"block_on_outdated_branch":{"type":["boolean","null"]},"block_on_rejected_reviews":{"type":["boolean","null"]},"branch_pattern":{"type":["string","null"]},"bypass_allowlist_teams":{"type":["array","null"],"items":{"type":"string"}},"bypass_allowlist_usernames":{"type":["array","null"],"items":{"type":"string"}},"dismiss_stale_approvals":{"type":["boolean","null"]},"enable_approvals_whitelist":{"type":["boolean","null"]},"enable_bypass_allowlist":{"type":["boolean","null"]},"enable_force_push":{"type":["boolean","null"]},"enable_force_push_allowlist":{"type":["boolean","null"]},"enable_merge_whitelist":{"type":["boolean","null"]},"enable_push":{"type":["boolean","null"]},"enable_push_whitelist":{"type":["boolean","null"]},"force_push_allowlist_deploy_keys":{"type":["boolean","null"]},"force_push_allowlist_teams":{"type":["array","null"],"items":{"type":"string"}},"force_push_allowlist_usernames":{"type":["array","null"],"items":{"type":"string"}},"ignore_stale_approvals":{"type":["boolean","null"]},"merge_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"merge_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"priority":{"type":["integer","null"],"format":"int64"},"protected_file_patterns":{"type":["string","null"]},"push_whitelist_deploy_keys":{"type":["boolean","null"]},"push_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"push_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"require_signed_commits":{"type":["boolean","null"]},"required_approvals":{"type":["integer","null"],"format":"int32"},"unprotected_file_patterns":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_EditReleaseOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"content":{"type":["string","null"]},"is_draft":{"type":["boolean","null"]},"is_prerelease":{"type":["boolean","null"]},"tag_name":{"type":["string","null"]},"target":{"type":["string","null"]},"title":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_EditTagProtectionOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"name_pattern":{"type":["string","null"]},"whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"whitelist_usernames":{"type":["array","null"],"items":{"type":"string","format":"uuid"}}}},"request_id":{"type":"string"}}},"AppRequestData_ForgotPasswordCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["email","pow"],"properties":{"email":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"}}},"request_id":{"type":"string"}}},"AppRequestData_ForkRepoOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["to_channel_id"],"properties":{"description":{"type":["string","null"]},"name":{"type":["string","null"]},"to_channel_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_GenerateRepoOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["to_channel_id","name"],"properties":{"description":{"type":["string","null"]},"is_private":{"type":["boolean","null"]},"name":{"type":"string"},"to_channel_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_LoginCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["identifier","password","pow"],"properties":{"app_id":{"type":["string","null"]},"identifier":{"type":"string"},"password":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"}}},"request_id":{"type":"string"}}},"AppRequestData_LogoutCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["refresh_token"],"properties":{"refresh_token":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_MarkReadCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["notification_ids"],"properties":{"notification_ids":{"type":"array","items":{"type":"string","format":"uuid"}}}},"request_id":{"type":"string"}}},"AppRequestData_MergePullRequestOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["style"],"properties":{"commit_message":{"type":["string","null"]},"commit_title":{"type":["string","null"]},"delete_branch_after_merge":{"type":"boolean"},"style":{"$ref":"#/components/schemas/MergeStyle"}}},"request_id":{"type":"string"}}},"AppRequestData_MergeUpstreamRequest":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["branch"],"properties":{"branch":{"type":"string"},"ff_only":{"type":["boolean","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_ReclaimCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["email","pow"],"properties":{"email":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"}}},"request_id":{"type":"string"}}},"AppRequestData_RefreshCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["refresh_token"],"properties":{"app_id":{"type":["string","null"]},"refresh_token":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_RegisterCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["email","password","pow"],"properties":{"accept_agreements":{"type":"array","items":{"type":"string"}},"email":{"type":"string"},"password":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"},"username":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_RenameBranchOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["new_name"],"properties":{"new_name":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_RenameRepoOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["new_name"],"properties":{"new_name":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_RepoTopicOptions":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["topics"],"properties":{"topics":{"type":"array","items":{"type":"string"}}}},"request_id":{"type":"string"}}},"AppRequestData_RequestChangeBody":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["new_email"],"properties":{"new_email":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_RequestDeletionCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"reason":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_ResendCodeCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["email","pow","purpose"],"properties":{"email":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"},"purpose":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_ResetPasswordCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["email","token","new_password","temp_key_value"],"properties":{"email":{"type":"string"},"new_password":{"type":"string"},"temp_key_value":{"type":"string"},"token":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_RevokeSuspensionCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"reason":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_SaveMessageCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["channel_id","message_id"],"properties":{"channel_id":{"type":"string","format":"uuid"},"message_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_SetRoleOverwriteCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["role_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"deny_mask":{"type":"integer","format":"int64"},"role_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_SetUserOverwriteCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["user_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"deny_mask":{"type":"integer","format":"int64"},"user_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_SubmitPullRequestReviewOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["state"],"properties":{"commit_sha":{"type":["string","null"]},"content":{"type":["string","null"]},"state":{"$ref":"#/components/schemas/ReviewState"}}},"request_id":{"type":"string"}}},"AppRequestData_SubmitReportCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["reported_uid","reason"],"properties":{"evidence":{"type":["string","null"]},"reason":{"type":"string"},"reported_uid":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_SuspendCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["suspension_type"],"properties":{"ends_at":{"type":["string","null"]},"reason":{"type":["string","null"]},"suspension_type":{"$ref":"#/components/schemas/SuspensionType"}}},"request_id":{"type":"string"}}},"AppRequestData_TransferRepoOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["new_channel_id"],"properties":{"new_channel_id":{"type":"string","format":"uuid"},"new_name":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateAvatarOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["image"],"properties":{"image":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateBanCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"allow_agent_join":{"type":["boolean","null"]},"allow_comment_any":{"type":["boolean","null"]},"allow_push_repo":{"type":["boolean","null"]},"allow_speak":{"type":["boolean","null"]},"expires_at":{"type":["string","null"]},"reason":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateBranchOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["new_commit_id"],"properties":{"force":{"type":["boolean","null"]},"new_commit_id":{"type":"string"},"old_commit_id":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateBranchProtectionPriorities":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["ids"],"properties":{"ids":{"type":"array","items":{"type":"string","format":"uuid"}}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateCollectionOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"name":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateCommentOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["content"],"properties":{"content":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateDeviceCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"device_name":{"type":["string","null"]},"is_trusted":{"type":["boolean","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateDocumentCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"content":{"type":["string","null"]},"icon":{"type":["string","null"]},"parent_id":{"type":["string","null"],"format":"uuid"},"slug":{"type":["string","null"]},"title":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateFileOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["content"],"properties":{"content":{"type":"string"},"from_path":{"type":["string","null"]},"sha":{"type":["string","null"]}}}]},"request_id":{"type":"string"}}},"AppRequestData_UpdateIssueOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"body":{"type":["string","null"]},"description":{"type":["string","null"]},"milestone_id":{"type":["string","null"],"format":"uuid"},"title":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateIssueUserOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"is_mentioned":{"type":["boolean","null"]},"is_read":{"type":["boolean","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateLabelOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"color":{"type":["string","null"]},"description":{"type":["string","null"]},"exclusive":{"type":["boolean","null"]},"exclusive_order":{"type":["integer","null"],"format":"int32"},"is_archived":{"type":["boolean","null"]},"name":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateMemberCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["role"],"properties":{"role":{"$ref":"#/components/schemas/MemberRole"}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateMilestoneOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"description":{"type":["string","null"]},"due_at":{"type":["string","null"]},"is_closed":{"type":["boolean","null"]},"name":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdatePreferencesCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"allow_dms_from":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Audience"}]},"allow_mentions_from":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Audience"}]},"diff_view_style":{"type":["string","null"]},"email_digest":{"type":["boolean","null"]},"email_flags":{"type":["integer","null"],"format":"int32"},"in_app_flags":{"type":["integer","null"],"format":"int32"},"mute_until":{"type":["string","null"]},"push_flags":{"type":["integer","null"],"format":"int32"},"show_online_status":{"type":["boolean","null"]},"theme_mode":{"type":["string","null"]},"theme_token":{"type":["string","null"]},"theme_version":{"type":["integer","null"],"format":"int64"}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateProfileCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"avatar":{"type":["string","null"]},"display_name":{"type":["string","null"]},"language":{"type":["string","null"]},"locale":{"type":["string","null"]},"profile":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/UpdateProfileFields"}]},"timezone":{"type":["string","null"]},"visibility":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProfileVisibility"}]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateProjectCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"color":{"type":["string","null"]},"description":{"type":["string","null"]},"health":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProjectHealth"}]},"icon":{"type":["string","null"]},"lead_id":{"type":["string","null"],"format":"uuid"},"name":{"type":["string","null"]},"sort_order":{"type":["integer","null"],"format":"int32"},"state":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProjectState"}]},"target_date":{"type":["string","null"],"format":"date"}}},"request_id":{"type":"string"}}},"AppRequestData_UpdatePullRequestOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"base":{"type":["string","null"]},"body":{"type":["string","null"]},"head":{"type":["string","null"]},"title":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateRepoOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"allow_fast_forward_only_merge":{"type":["boolean","null"]},"allow_manual_merge":{"type":["boolean","null"]},"allow_merge_commits":{"type":["boolean","null"]},"allow_merge_update":{"type":["boolean","null"]},"allow_rebase":{"type":["boolean","null"]},"allow_rebase_explicit":{"type":["boolean","null"]},"allow_rebase_update":{"type":["boolean","null"]},"allow_squash_merge":{"type":["boolean","null"]},"archived":{"type":["boolean","null"]},"autodetect_manual_merge":{"type":["boolean","null"]},"default_allow_maintainer_edit":{"type":["boolean","null"]},"default_branch":{"type":["string","null"]},"default_delete_branch_after_merge":{"type":["boolean","null"]},"default_merge_style":{"type":["string","null"]},"default_update_style":{"type":["string","null"]},"description":{"type":["string","null"]},"enable_lfs":{"type":["boolean","null"]},"external_tracker":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExternalTracker"}]},"external_wiki":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExternalWiki"}]},"has_actions":{"type":["boolean","null"]},"has_code":{"type":["boolean","null"]},"has_issues":{"type":["boolean","null"]},"has_packages":{"type":["boolean","null"]},"has_projects":{"type":["boolean","null"]},"has_pull_requests":{"type":["boolean","null"]},"has_releases":{"type":["boolean","null"]},"has_wiki":{"type":["boolean","null"]},"ignore_whitespace_conflicts":{"type":["boolean","null"]},"internal_tracker":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/InternalTracker"}]},"is_private":{"type":["boolean","null"]},"license_name":{"type":["string","null"]},"name":{"type":["string","null"]},"projects_mode":{"type":["string","null"]},"template":{"type":["boolean","null"]},"website":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateRoleCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"color":{"type":["string","null"]},"icon_hash":{"type":["string","null"]},"name":{"type":["string","null"]},"permissions":{"type":["array","null"],"items":{"type":"string"}},"position":{"type":["integer","null"],"format":"int64"},"unicode_emoji":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateSpaceCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"allow_invite":{"type":["boolean","null"]},"allow_join":{"type":["boolean","null"]},"allow_join_level":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SpaceAllowJoinLevel"}]},"avatar_url":{"type":["string","null"]},"description":{"type":["string","null"]},"member_must_enable_2fa":{"type":["boolean","null"]},"name":{"type":["string","null"]},"public":{"type":["boolean","null"]},"welcome_message":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateViewCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"description":{"type":["string","null"]},"filter":{},"group_by":{"type":["string","null"]},"is_shared":{"type":["boolean","null"]},"layout":{"type":["string","null"]},"name":{"type":["string","null"]},"sort_by":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UploadAttachmentInput":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["filename","content_type","data"],"properties":{"content_type":{"type":"string"},"data":{"type":"array","items":{"type":"integer","format":"int32","minimum":0}},"filename":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_UploadAvatarCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["content_type","data_base64"],"properties":{"content_type":{"type":"string"},"data_base64":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_UpsertMemeCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name","content_type","url","size"],"properties":{"content_type":{"type":"string"},"height":{"type":["integer","null"],"format":"int32"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"},"url":{"type":"string"},"width":{"type":["integer","null"],"format":"int32"}}},"request_id":{"type":"string"}}},"AppRequestData_UpsertPushCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["endpoint","p256dh_key","auth_key","platform"],"properties":{"auth_key":{"type":"string"},"endpoint":{"type":"string"},"p256dh_key":{"type":"string"},"platform":{"$ref":"#/components/schemas/PushPlatform"},"user_agent":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpsertWatchOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["mode"],"properties":{"mode":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_Vec_String":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"array","items":{"type":"string"}},"request_id":{"type":"string"}}},"AppRequestData_VerifyCodeCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["email","purpose","code","temp_key_value"],"properties":{"code":{"type":"string"},"email":{"type":"string"},"purpose":{"type":"string"},"temp_key_value":{"type":"string"},"user_id":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppResponseData_AcceptAgreementResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["recorded"],"properties":{"recorded":{"type":"boolean"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ActivityPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ActivityView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_AddEmailResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["email_id"],"properties":{"email_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_AttachmentView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","owner_type","owner_id","filename","content_type","size","url","created_at"],"properties":{"content_type":{"type":"string"},"created_at":{"type":"string"},"filename":{"type":"string"},"id":{"type":"string","format":"uuid"},"owner_id":{"type":"string","format":"uuid"},"owner_type":{"type":"string"},"size":{"type":"integer","format":"int64"},"uploaded_by":{"type":["string","null"],"format":"uuid"},"url":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_AuthorizationUrlResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["url","temp_key"],"properties":{"temp_key":{"$ref":"#/components/schemas/TempKey"},"url":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_AvatarView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["uid","url","format","bytes","updated_at"],"properties":{"bytes":{"type":"integer","format":"int64","minimum":0},"format":{"$ref":"#/components/schemas/AvatarFormat"},"uid":{"type":"string","format":"uuid"},"updated_at":{"type":"string"},"url":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_BlobView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sha","size","encoding","content"],"properties":{"content":{"type":"string"},"encoding":{"type":"string"},"sha":{"type":"string"},"size":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_BranchPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BranchView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_BranchProtectionPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BranchProtectionView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_BranchProtectionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","repo_id","branch_name","rule_name","priority","enable_push","enable_push_whitelist","push_whitelist_usernames","push_whitelist_teams","push_whitelist_deploy_keys","enable_force_push","enable_force_push_allowlist","force_push_allowlist_usernames","force_push_allowlist_teams","force_push_allowlist_deploy_keys","enable_merge_whitelist","merge_whitelist_usernames","merge_whitelist_teams","enable_bypass_allowlist","bypass_allowlist_usernames","bypass_allowlist_teams","enable_approvals_whitelist","approvals_whitelist_usernames","approvals_whitelist_teams","required_approvals","block_on_rejected_reviews","block_on_change_requested_reviews","block_on_outdated_branch","dismiss_stale_approvals","ignore_stale_approvals","require_signed_commits","block_admin_merge_override","protected_file_patterns","unprotected_file_patterns","created_at","updated_at"],"properties":{"approvals_whitelist_teams":{"type":"array","items":{"type":"string"}},"approvals_whitelist_usernames":{"type":"array","items":{"type":"string"}},"block_admin_merge_override":{"type":"boolean"},"block_on_change_requested_reviews":{"type":"boolean"},"block_on_outdated_branch":{"type":"boolean"},"block_on_rejected_reviews":{"type":"boolean"},"branch_name":{"type":"string"},"branch_pattern":{"type":["string","null"]},"bypass_allowlist_teams":{"type":"array","items":{"type":"string"}},"bypass_allowlist_usernames":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"dismiss_stale_approvals":{"type":"boolean"},"enable_approvals_whitelist":{"type":"boolean"},"enable_bypass_allowlist":{"type":"boolean"},"enable_force_push":{"type":"boolean"},"enable_force_push_allowlist":{"type":"boolean"},"enable_merge_whitelist":{"type":"boolean"},"enable_push":{"type":"boolean"},"enable_push_whitelist":{"type":"boolean"},"force_push_allowlist_deploy_keys":{"type":"boolean"},"force_push_allowlist_teams":{"type":"array","items":{"type":"string"}},"force_push_allowlist_usernames":{"type":"array","items":{"type":"string"}},"id":{"type":"string","format":"uuid"},"ignore_stale_approvals":{"type":"boolean"},"merge_whitelist_teams":{"type":"array","items":{"type":"string"}},"merge_whitelist_usernames":{"type":"array","items":{"type":"string"}},"priority":{"type":"integer","format":"int64"},"protected_file_patterns":{"type":"string"},"push_whitelist_deploy_keys":{"type":"boolean"},"push_whitelist_teams":{"type":"array","items":{"type":"string"}},"push_whitelist_usernames":{"type":"array","items":{"type":"string"}},"repo_id":{"type":"string","format":"uuid"},"require_signed_commits":{"type":"boolean"},"required_approvals":{"type":"integer","format":"int32"},"rule_name":{"type":"string"},"unprotected_file_patterns":{"type":"string"},"updated_at":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_BranchView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","repo_id","name","commit_sha","is_protected","protected","required_approvals","enable_status_check","status_check_contexts","user_can_push","user_can_merge","effective_branch_protection_name","is_deleted","created_at","updated_at"],"properties":{"commit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CommitMeta"}]},"commit_sha":{"type":"string"},"created_at":{"type":"string"},"deleted_at":{"type":["string","null"]},"effective_branch_protection_name":{"type":"string"},"enable_status_check":{"type":"boolean"},"id":{"type":"string","format":"uuid"},"is_deleted":{"type":"boolean"},"is_protected":{"type":"boolean"},"name":{"type":"string"},"protected":{"type":"boolean"},"repo_id":{"type":"string","format":"uuid"},"required_approvals":{"type":"integer","format":"int64"},"status_check_contexts":{"type":"array","items":{"type":"string"}},"updated_at":{"type":"string"},"user_can_merge":{"type":"boolean"},"user_can_push":{"type":"boolean"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ChannelPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ChannelView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ChannelView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","name","kind","position","is_archived","created_at","updated_at","created_by"],"properties":{"archived_at":{"type":["string","null"]},"archived_by":{"type":["string","null"],"format":"uuid"},"color":{"type":["string","null"]},"created_at":{"type":"string"},"created_by":{"type":"string","format":"uuid"},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_archived":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"parent_id":{"type":["string","null"],"format":"uuid"},"position":{"type":"integer","format":"int32"},"purpose":{"type":["string","null"]},"space_id":{"type":["string","null"],"format":"uuid"},"topic":{"type":["string","null"]},"updated_at":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CollaboratorPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CollaboratorView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CollectionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","channel_id","name","nums_open_issue","nums_closed_issue","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"nums_closed_issue":{"type":"integer","format":"int64"},"nums_open_issue":{"type":"integer","format":"int64"},"updated_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CombinedStatusView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sha","state","statuses","total_count"],"properties":{"sha":{"type":"string"},"state":{"type":"string"},"statuses":{"type":"array","items":{"$ref":"#/components/schemas/CommitStatusView"}},"total_count":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CommentView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","poster_id","content","created_at"],"properties":{"content":{"type":"string"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":["string","null"],"format":"uuid"},"parent_id":{"type":["string","null"],"format":"uuid"},"poster_id":{"type":"string","format":"uuid"},"updated_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CommitStatusPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CommitStatusView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CommitStatusView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","repo_id","sha","state","context","url","creator","created_at"],"properties":{"context":{"type":"string"},"created_at":{"type":"string"},"creator":{"$ref":"#/components/schemas/CommitUserSummary"},"description":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"repo_id":{"type":"string","format":"uuid"},"sha":{"type":"string"},"state":{"type":"string"},"target_url":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"url":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CommitView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sha","message","parent_shas","tree_sha"],"properties":{"author_email":{"type":["string","null"]},"author_name":{"type":["string","null"]},"authored_at":{"type":["string","null"]},"committed_at":{"type":["string","null"]},"committer_email":{"type":["string","null"]},"committer_name":{"type":["string","null"]},"message":{"type":"string"},"parent_shas":{"type":"array","items":{"type":"string"}},"sha":{"type":"string"},"tree_sha":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CommitsResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CommitSummary"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CompareView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["base","head","total_commits","ahead_by","behind_by","files"],"properties":{"ahead_by":{"type":"integer","format":"int64"},"base":{"type":"string"},"behind_by":{"type":"integer","format":"int64"},"files":{"type":"array","items":{"$ref":"#/components/schemas/CompareFileDiff"}},"head":{"type":"string"},"merge_base":{"type":["string","null"]},"total_commits":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ContentsListResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ContentsResponse"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ContentsResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["name","path","sha","type","size"],"properties":{"content":{"type":["string","null"]},"download_url":{"type":["string","null"]},"encoding":{"type":["string","null"]},"git_url":{"type":["string","null"]},"html_url":{"type":["string","null"]},"last_author_date":{"type":["string","null"]},"last_commit_message":{"type":["string","null"]},"last_commit_sha":{"type":["string","null"]},"last_committer_date":{"type":["string","null"]},"lfs_oid":{"type":["string","null"]},"lfs_size":{"type":["integer","null"],"format":"int64"},"links":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/FileLinksResponse"}]},"name":{"type":"string"},"path":{"type":"string"},"sha":{"type":"string"},"size":{"type":"integer","format":"int64"},"submodule_git_url":{"type":["string","null"]},"target":{"type":["string","null"]},"type":{"type":"string"},"url":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CreateAccessKeyResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["key","token"],"properties":{"key":{"$ref":"#/components/schemas/AccessKeyView"},"token":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_DeletionRequestView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","user_id","status","created_at","updated_at"],"properties":{"cancelled_at":{"type":["string","null"]},"completed_at":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"reason":{"type":["string","null"]},"scheduled_for":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/DeletionStatus"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_DependencyView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","issue_id","dependency_id","created_at"],"properties":{"created_at":{"type":"string"},"dependency_id":{"type":"string","format":"uuid"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_DeployKeyPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DeployKeyView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_DeployKeyView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","key_id","repo_id","title","key_type","fingerprint","content","url","read_only","created_at"],"properties":{"content":{"type":"string"},"created_at":{"type":"string"},"fingerprint":{"type":"string"},"id":{"type":"string","format":"uuid"},"key_id":{"type":"integer","format":"int64"},"key_type":{"type":"string"},"last_used_at":{"type":["string","null"]},"read_only":{"type":"boolean"},"repo_id":{"type":"string","format":"uuid"},"title":{"type":"string"},"url":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_DeviceView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","is_trusted","first_seen_at","last_seen_at","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"device_name":{"type":["string","null"]},"device_type":{"type":["string","null"]},"first_seen_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_trusted":{"type":"boolean"},"last_seen_at":{"type":"string"},"os":{"type":["string","null"]},"updated_at":{"type":"string"},"user_agent":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_DocumentPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DocumentView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_DocumentView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","project_id","creator_id","title","slug","content","created_at"],"properties":{"content":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"creator_id":{"type":"string","format":"uuid"},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"last_editor_id":{"type":["string","null"],"format":"uuid"},"parent_id":{"type":["string","null"],"format":"uuid"},"project_id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"title":{"type":"string"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_EmailChangeTicketView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","new_email","status","expires_at","created_at"],"properties":{"created_at":{"type":"string"},"expires_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"new_email":{"type":"string"},"status":{"$ref":"#/components/schemas/EmailChangeTicketStatus"},"used_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_FavoritePage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/FavoriteView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_FavoriteView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","project_id","user_id","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"folder":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"project_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_FileDeleteResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","properties":{"commit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CommitSummary"}]},"content":{}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_FilesResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["files"],"properties":{"commit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CommitSummary"}]},"files":{"type":"array","items":{"$ref":"#/components/schemas/ContentsResponse"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ForgotPasswordResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sent","temp_key"],"properties":{"sent":{"type":"boolean"},"temp_key":{"$ref":"#/components/schemas/TempKey"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ForksResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ForkView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_IssueConfig":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["blank_issues_enabled"],"properties":{"blank_issues_enabled":{"type":"boolean"},"contact_links":{}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_IssueConfigValidation":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["valid"],"properties":{"message":{"type":["string","null"]},"valid":{"type":"boolean"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_IssueUserView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","user_id","issue_id","is_read","is_mentioned","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_mentioned":{"type":"boolean"},"is_read":{"type":"boolean"},"issue_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_IssueView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","collection_id","autoincrement_id","author_id","title","body","state","created_at"],"properties":{"author_id":{"type":"string","format":"uuid"},"autoincrement_id":{"type":"integer","format":"int32"},"body":{"type":"string"},"closed_at":{"type":["string","null"]},"collection_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"milestone_id":{"type":["string","null"],"format":"uuid"},"state":{"$ref":"#/components/schemas/IssueState"},"title":{"type":"string"},"updated_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_LabelView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","channel_id","name","exclusive","exclusive_order","color","is_archived","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"color":{"type":"string"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"exclusive":{"type":"boolean"},"exclusive_order":{"type":"integer","format":"int32"},"id":{"type":"string","format":"uuid"},"is_archived":{"type":"boolean"},"name":{"type":"string"},"updated_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_LanguagesResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["languages"],"properties":{"languages":{"type":"object","additionalProperties":{"type":"integer","format":"int64"},"propertyNames":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_LicensesResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["licenses"],"properties":{"licenses":{"type":"array","items":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_LinkPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/LinkView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_LinkView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","project_id","related_project_id","kind","created_by","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"created_by":{"type":"string","format":"uuid"},"id":{"type":"string","format":"uuid"},"kind":{"$ref":"#/components/schemas/LinkKind"},"project_id":{"type":"string","format":"uuid"},"related_project_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_LoginResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["access_token","refresh_token","token_type","expires_in","user"],"properties":{"access_token":{"type":"string"},"expires_in":{"type":"integer","format":"int64"},"refresh_token":{"type":"string"},"token_type":{"type":"string"},"user":{"$ref":"#/components/schemas/UserPublic"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_LogoutResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["revoked"],"properties":{"revoked":{"type":"boolean"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_MarkAllReadResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["marked"],"properties":{"marked":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_MarkReadResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["marked"],"properties":{"marked":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_MemberPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/MemberView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_MemberView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","issue_id","user_id","kind","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"},"kind":{"type":"string"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_MemeView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","name","content_type","url","size","created_at"],"properties":{"content_type":{"type":"string"},"created_at":{"type":"string"},"height":{"type":["integer","null"],"format":"int32"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"},"url":{"type":"string"},"width":{"type":["integer","null"],"format":"int32"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_MergeUpstreamResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["merge_type"],"properties":{"merge_type":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_MergeView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sha","merged"],"properties":{"merged":{"type":"boolean"},"message":{"type":["string","null"]},"sha":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_MilestoneView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","collection_id","name","is_closed","num_issues","num_closed_issues","created_at"],"properties":{"collection_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"due_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_closed":{"type":"boolean"},"name":{"type":"string"},"num_closed_issues":{"type":"integer","format":"int32"},"num_issues":{"type":"integer","format":"int32"},"updated_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_NewPinAllowedResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["allowed"],"properties":{"allowed":{"type":"boolean"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_NoteView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sha","message"],"properties":{"message":{"type":"string"},"sha":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_OAuthLoginResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["access_token","refresh_token","token_type","expires_in","user_id","auto_registered"],"properties":{"access_token":{"type":"string"},"auto_registered":{"type":"boolean"},"expires_in":{"type":"integer","format":"int64"},"refresh_token":{"type":"string"},"token_type":{"type":"string"},"user_id":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Option_AvatarView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"oneOf":[{"type":"null"},{"type":"object","required":["uid","url","format","bytes","updated_at"],"properties":{"bytes":{"type":"integer","format":"int64","minimum":0},"format":{"$ref":"#/components/schemas/AvatarFormat"},"uid":{"type":"string","format":"uuid"},"updated_at":{"type":"string"},"url":{"type":"string"}}}]},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PinView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","collection_id","pin_order","created_at"],"properties":{"collection_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":["string","null"],"format":"uuid"},"pin_order":{"type":"integer","format":"int32"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PowChallengeResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["challenge","ttl_seconds"],"properties":{"challenge":{"type":"string"},"ttl_seconds":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ProfileView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["user_id","show_email","show_location","show_real_name","show_activity","updated_at"],"properties":{"accent_color":{"type":["string","null"]},"banner_color":{"type":["integer","null"],"format":"int32"},"banner_url":{"type":["string","null"]},"bio":{"type":["string","null"]},"company":{"type":["string","null"]},"date_of_birth":{"type":["string","null"],"format":"date"},"location":{"type":["string","null"]},"pronouns":{"type":["string","null"]},"pronouns_privacy":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProfileVisibility"}]},"real_name":{"type":["string","null"]},"show_activity":{"type":"boolean"},"show_email":{"type":"boolean"},"show_location":{"type":"boolean"},"show_real_name":{"type":"boolean"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"},"website":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ProjectPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ProjectView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ProjectView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","space_id","creator_id","name","state","health","sort_order","starred","created_at"],"properties":{"cancelled_at":{"type":["string","null"],"format":"date-time"},"color":{"type":["string","null"]},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"creator_id":{"type":"string","format":"uuid"},"description":{"type":["string","null"]},"health":{"$ref":"#/components/schemas/ProjectHealth"},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"lead_id":{"type":["string","null"],"format":"uuid"},"name":{"type":"string"},"sort_order":{"type":"integer","format":"int32"},"space_id":{"type":"string","format":"uuid"},"starred":{"type":"integer","format":"int32"},"started_at":{"type":["string","null"],"format":"date-time"},"state":{"$ref":"#/components/schemas/ProjectState"},"target_date":{"type":["string","null"],"format":"date"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PullRequestCommentView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","pull_request_id","user_id","body","created_at"],"properties":{"body":{"type":"string"},"commit_sha":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"line":{"type":["integer","null"],"format":"int32"},"path":{"type":["string","null"]},"pull_request_id":{"type":"string","format":"uuid"},"review_id":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PullRequestPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PullRequestView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PullRequestReviewView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","pull_request_id","user_id","official","state","created_at"],"properties":{"commit_sha":{"type":["string","null"]},"content":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"official":{"type":"boolean"},"pull_request_id":{"type":"string","format":"uuid"},"state":{"$ref":"#/components/schemas/ReviewState"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PullRequestView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","repo_id","number","title","head_branch","base_branch","author_id","state","is_locked","has_merged","created_at","comments_count","reviews_count"],"properties":{"author_id":{"type":"string","format":"uuid"},"base_branch":{"type":"string"},"base_sha":{"type":["string","null"]},"body":{"type":["string","null"]},"closed_at":{"type":["string","null"]},"comments_count":{"type":"integer","format":"int64"},"created_at":{"type":"string"},"has_merged":{"type":"boolean"},"head_branch":{"type":"string"},"head_sha":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_locked":{"type":"boolean"},"mergeable":{"type":["boolean","null"]},"mergeable_state":{"type":["string","null"]},"merged_at":{"type":["string","null"]},"merged_commit_sha":{"type":["string","null"]},"merger_id":{"type":["string","null"]},"number":{"type":"integer","format":"int64"},"repo_id":{"type":"string","format":"uuid"},"reviews_count":{"type":"integer","format":"int64"},"state":{"$ref":"#/components/schemas/PrState"},"title":{"type":"string"},"updated_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PushSubscriptionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","platform","endpoint","created_at"],"properties":{"created_at":{"type":"string"},"endpoint":{"type":"string"},"id":{"type":"string","format":"uuid"},"platform":{"$ref":"#/components/schemas/PushPlatform"},"user_agent":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ReactionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","scope","target_id","user_id","emoji","created_at"],"properties":{"created_at":{"type":"string"},"emoji":{"type":"string"},"id":{"type":"string","format":"uuid"},"scope":{"$ref":"#/components/schemas/ReactionScope"},"target_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ReclaimResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sent","temp_key"],"properties":{"sent":{"type":"boolean"},"temp_key":{"$ref":"#/components/schemas/TempKey"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RefreshResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["access_token","refresh_token","token_type","expires_in"],"properties":{"access_token":{"type":"string"},"expires_in":{"type":"integer","format":"int64"},"refresh_token":{"type":"string"},"token_type":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RegenerateRecoveryResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["codes"],"properties":{"codes":{"type":"array","items":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RegisterResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["uid","pending","temp_key","purpose"],"properties":{"pending":{"type":"boolean"},"purpose":{"type":"string"},"temp_key":{"$ref":"#/components/schemas/TempKey"},"uid":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ReleaseAttachmentListResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ReleaseAttachmentView"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ReleaseAttachmentView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","name","size","download_url","created_at"],"properties":{"created_at":{"type":"string"},"download_url":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ReleasePage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ReleaseView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ReleaseView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","repo_id","tag_name","target","title","sha","num_commits","is_draft","is_prerelease","is_tag","url","html_url","tarball_url","zipball_url","upload_url","publisher","attachments","created_at","updated_at"],"properties":{"attachments":{"type":"array","items":{"$ref":"#/components/schemas/ReleaseAttachment"}},"content":{"type":["string","null"]},"created_at":{"type":"string"},"html_url":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_draft":{"type":"boolean"},"is_prerelease":{"type":"boolean"},"is_tag":{"type":"boolean"},"num_commits":{"type":"integer","format":"int32"},"publisher":{"$ref":"#/components/schemas/UserSummary"},"repo_id":{"type":"string","format":"uuid"},"sha":{"type":"string"},"tag_name":{"type":"string"},"tarball_url":{"type":"string"},"target":{"type":"string"},"title":{"type":"string"},"updated_at":{"type":"string"},"upload_url":{"type":"string"},"url":{"type":"string"},"zipball_url":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RepoCollaboratorPermission":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["permission","role","user"],"properties":{"permission":{"type":"string"},"role":{"type":"string"},"user":{"$ref":"#/components/schemas/UserSummary"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RepoPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/RepoView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RepoRelView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","issue_id","repo_id","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"},"repo_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RepoSummary":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","name","full_name","empty","private","fork","template","mirror","size","stars_count","forks_count","watchers_count","open_issues_count"],"properties":{"description":{"type":["string","null"]},"empty":{"type":"boolean"},"fork":{"type":"boolean"},"forks_count":{"type":"integer","format":"int32"},"full_name":{"type":"string"},"id":{"type":"string","format":"uuid"},"mirror":{"type":"boolean"},"name":{"type":"string"},"open_issues_count":{"type":"integer","format":"int32"},"private":{"type":"boolean"},"size":{"type":"integer","format":"int64"},"stars_count":{"type":"integer","format":"int32"},"template":{"type":"boolean"},"watchers_count":{"type":"integer","format":"int32"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RepoView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","channel_id","space_id","name","lower_name","full_name","default_branch","enable_lfs","is_private","is_archived","is_fork","is_template","is_mirror","empty","size","git_size","lfs_size","nums_watch","nums_star","nums_pr","nums_commits","nums_branches","nums_tags","allow_rebase","allow_rebase_explicit","allow_squash_merge","allow_merge_commits","allow_fast_forward_only_merge","allow_rebase_update","allow_merge_update","allow_manual_merge","autodetect_manual_merge","default_delete_branch_after_merge","default_allow_maintainer_edit","ignore_whitespace_conflicts","object_format","has_code","has_issues","has_wiki","has_pull_requests","has_projects","has_releases","has_packages","has_actions","projects_mode","languages","licenses","topics","html_url","url","link","ssh_url","clone_url","created_at","updated_at"],"properties":{"allow_fast_forward_only_merge":{"type":"boolean"},"allow_manual_merge":{"type":"boolean"},"allow_merge_commits":{"type":"boolean"},"allow_merge_update":{"type":"boolean"},"allow_rebase":{"type":"boolean"},"allow_rebase_explicit":{"type":"boolean"},"allow_rebase_update":{"type":"boolean"},"allow_squash_merge":{"type":"boolean"},"archived_at":{"type":["string","null"]},"autodetect_manual_merge":{"type":"boolean"},"avatar_url":{"type":["string","null"]},"channel":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ChannelSummary"}]},"channel_id":{"type":"string","format":"uuid"},"clone_url":{"type":"string"},"created_at":{"type":"string"},"default_allow_maintainer_edit":{"type":"boolean"},"default_branch":{"type":"string"},"default_delete_branch_after_merge":{"type":"boolean"},"description":{"type":["string","null"]},"empty":{"type":"boolean"},"enable_lfs":{"type":"boolean"},"full_name":{"type":"string"},"git_size":{"type":"integer","format":"int64"},"has_actions":{"type":"boolean"},"has_code":{"type":"boolean"},"has_issues":{"type":"boolean"},"has_packages":{"type":"boolean"},"has_projects":{"type":"boolean"},"has_pull_requests":{"type":"boolean"},"has_releases":{"type":"boolean"},"has_wiki":{"type":"boolean"},"html_url":{"type":"string"},"id":{"type":"string","format":"uuid"},"ignore_whitespace_conflicts":{"type":"boolean"},"is_archived":{"type":"boolean"},"is_fork":{"type":"boolean"},"is_mirror":{"type":"boolean"},"is_private":{"type":"boolean"},"is_template":{"type":"boolean"},"languages":{"type":"array","items":{"type":"string"}},"last_pushed_at":{"type":["string","null"]},"lfs_size":{"type":"integer","format":"int64"},"license_name":{"type":["string","null"]},"licenses":{"type":"array","items":{"type":"string"}},"link":{"type":"string"},"lower_name":{"type":"string"},"name":{"type":"string"},"nums_branches":{"type":"integer","format":"int32"},"nums_commits":{"type":"integer","format":"int32"},"nums_pr":{"type":"integer","format":"int32"},"nums_star":{"type":"integer","format":"int32"},"nums_tags":{"type":"integer","format":"int32"},"nums_watch":{"type":"integer","format":"int32"},"object_format":{"type":"string"},"parent":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/RepoView"}]},"primary_language":{"type":["string","null"]},"projects_mode":{"type":"string"},"size":{"type":"integer","format":"int64"},"space":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SpaceSummary"}]},"space_id":{"type":"string","format":"uuid"},"ssh_url":{"type":"string"},"storage_limit_size":{"type":["integer","null"],"format":"int64"},"topics":{"type":"array","items":{"type":"string"}},"updated_at":{"type":"string"},"url":{"type":"string"},"website":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ReportView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","reported_uid","reason","status","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"evidence":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"reason":{"type":"string"},"reported_uid":{"type":"string","format":"uuid"},"reporter_uid":{"type":["string","null"],"format":"uuid"},"resolution_note":{"type":["string","null"]},"resolver_uid":{"type":["string","null"],"format":"uuid"},"status":{"$ref":"#/components/schemas/ReportStatus"},"updated_at":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ResendCodeResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sent","temp_key"],"properties":{"sent":{"type":"boolean"},"temp_key":{"$ref":"#/components/schemas/TempKey"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ResetPasswordResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RevokeAllResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["revoked"],"properties":{"revoked":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RoleOverwriteView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","space_id","channel_id","role_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"channel_id":{"type":"string","format":"uuid"},"deny_mask":{"type":"integer","format":"int64"},"id":{"type":"string","format":"uuid"},"role_id":{"type":"string","format":"uuid"},"space_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RolePage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/RoleView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RoleView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","space_id","name","position","color","version","created_at","created_by","permissions"],"properties":{"color":{"type":"string"},"created_at":{"type":"string"},"created_by":{"type":"string","format":"uuid"},"icon_hash":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}},"position":{"type":"integer","format":"int64"},"space_id":{"type":"string","format":"uuid"},"unicode_emoji":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"version":{"type":"integer","format":"int32"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SavedMessageView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","channel_id","message_id","saved_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"id":{"type":"string","format":"uuid"},"message_id":{"type":"string","format":"uuid"},"saved_at":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SearchResults":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["data","ok"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RepoSummary"}},"ok":{"type":"boolean"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SetPrimaryEmailResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["email"],"properties":{"email":{"$ref":"#/components/schemas/EmailView"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SpaceBanPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SpaceBanView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SpaceBanView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["space_id","user_id","banned_by","created_at","updated_at","allow_agent_join","allow_speak","allow_push_repo","allow_comment_any"],"properties":{"allow_agent_join":{"type":"boolean"},"allow_comment_any":{"type":"boolean"},"allow_push_repo":{"type":"boolean"},"allow_speak":{"type":"boolean"},"banned_by":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"reason":{"type":["string","null"]},"space_id":{"type":"string","format":"uuid"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SpaceInvitePage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SpaceInviteView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SpaceInviteView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","space_id","user_id","email","role_ids","created_at"],"properties":{"accepted_at":{"type":["string","null"]},"created_at":{"type":"string"},"email":{"type":"string"},"expires_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"revoked_at":{"type":["string","null"]},"role_ids":{"type":"array","items":{"type":"string","format":"uuid"}},"space_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SpaceMemberPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SpaceMemberView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SpaceMemberView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["space_id","user_id","status","joined_at","created_at","message_notifications","muted","mobile_push","suppress_everyone","suppress_roles","hide_muted_channels"],"properties":{"alias_avatar_url":{"type":["string","null"]},"alias_name":{"type":["string","null"]},"created_at":{"type":"string"},"hide_muted_channels":{"type":"boolean"},"invited_at":{"type":["string","null"]},"invited_by":{"type":["string","null"],"format":"uuid"},"joined_at":{"type":"string"},"last_active_at":{"type":["string","null"]},"left_at":{"type":["string","null"]},"message_notifications":{"$ref":"#/components/schemas/MessageNotifications"},"mobile_push":{"type":"boolean"},"mute_until":{"type":["string","null"]},"muted":{"type":"boolean"},"space_id":{"type":"string","format":"uuid"},"status":{"$ref":"#/components/schemas/SpaceMemberStatus"},"suppress_everyone":{"type":"boolean"},"suppress_roles":{"type":"boolean"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SpacePage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SpaceView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SpaceView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","name","owner_id","public","is_active","allow_join","allow_invite","member_count","allow_join_level","member_must_enable_2fa","created_at","updated_at"],"properties":{"allow_invite":{"type":"boolean"},"allow_join":{"type":"boolean"},"allow_join_level":{"$ref":"#/components/schemas/SpaceAllowJoinLevel"},"avatar_url":{"type":["string","null"]},"created_at":{"type":"string"},"description":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"member_count":{"type":"integer","format":"int64"},"member_must_enable_2fa":{"type":"boolean"},"name":{"type":"string"},"owner_id":{"type":"string","format":"uuid"},"public":{"type":"boolean"},"updated_at":{"type":"string"},"welcome_message":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SshKeyView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","name","key_type","fingerprint","created_at"],"properties":{"created_at":{"type":"string"},"fingerprint":{"type":"string"},"id":{"type":"string","format":"uuid"},"key_type":{"$ref":"#/components/schemas/SshKeyType"},"last_used_at":{"type":["string","null"]},"name":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_StopwatchView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","issue_id","user_id","started_at","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"},"started_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SubscriberPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SubscriberView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Subscription":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["user_id","repo_id","mode","created_at"],"properties":{"created_at":{"type":"string"},"mode":{"type":"string"},"repo_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SuspensionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","user_id","suspension_type","starts_at","created_at"],"properties":{"created_at":{"type":"string"},"ends_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"reason":{"type":["string","null"]},"revoked_at":{"type":["string","null"]},"revoked_by":{"type":["string","null"],"format":"uuid"},"starts_at":{"type":"string"},"suspended_by":{"type":["string","null"],"format":"uuid"},"suspension_type":{"$ref":"#/components/schemas/SuspensionType"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SyncResult":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["repo_id","branches_added","tags_added","commits_added","size_bytes"],"properties":{"branches_added":{"type":"integer","format":"int64"},"commits_added":{"type":"integer","format":"int64"},"repo_id":{"type":"string","format":"uuid"},"size_bytes":{"type":"integer","format":"int64"},"tags_added":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SyncStatus":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["repo_id","branches_total","tags_total","commits_total","size","synced_at"],"properties":{"branches_total":{"type":"integer","format":"int64"},"commits_total":{"type":"integer","format":"int64"},"last_pushed_at":{"type":["string","null"]},"primary_language":{"type":["string","null"]},"repo_id":{"type":"string","format":"uuid"},"size":{"type":"integer","format":"int64"},"synced_at":{"type":"string"},"tags_total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_TagPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/TagView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_TagProtectionPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/TagProtectionView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_TagProtectionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","repo_id","name_pattern","whitelist_usernames","whitelist_teams","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"name_pattern":{"type":"string"},"repo_id":{"type":"string","format":"uuid"},"updated_at":{"type":"string"},"whitelist_teams":{"type":"array","items":{"type":"string"}},"whitelist_usernames":{"type":"array","items":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_TagView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","repo_id","name","tag_type","commit_sha","commit","message","zipball_url","tarball_url","created_at"],"properties":{"commit":{"$ref":"#/components/schemas/CommitMeta"},"commit_sha":{"type":"string"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"message":{"type":"string"},"name":{"type":"string"},"repo_id":{"type":"string","format":"uuid"},"tag_type":{"type":"string"},"tarball_url":{"type":"string"},"zipball_url":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_TopicList":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["topics"],"properties":{"topics":{"type":"array","items":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_TopicSearchResult":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["topics"],"properties":{"topics":{"type":"array","items":{"$ref":"#/components/schemas/TopicView"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_TreeView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sha","entries"],"properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/TreeEntryView"}},"sha":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_UnreadCountResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["count"],"properties":{"count":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_UserMe":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["uid","username","display_name","avatar","is_active","is_admin","is_restricted"],"properties":{"avatar":{"type":"string"},"display_name":{"type":"string"},"is_active":{"type":"boolean"},"is_admin":{"type":"boolean"},"is_restricted":{"type":"boolean"},"language":{"type":["string","null"]},"locale":{"type":["string","null"]},"timezone":{"type":["string","null"]},"uid":{"type":"string"},"username":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_UserOverwriteView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["channel_id","user_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"channel_id":{"type":"string","format":"uuid"},"deny_mask":{"type":"integer","format":"int64"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_UserPreferences":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["user_id","theme_mode","in_app_flags","email_flags","push_flags","email_digest","allow_dms_from","allow_mentions_from","show_online_status","created_at","updated_at"],"properties":{"allow_dms_from":{"$ref":"#/components/schemas/Audience"},"allow_mentions_from":{"$ref":"#/components/schemas/Audience"},"created_at":{"type":"string"},"diff_view_style":{"type":["string","null"]},"email_digest":{"type":"boolean"},"email_flags":{"type":"integer","format":"int32"},"in_app_flags":{"type":"integer","format":"int32"},"mute_until":{"type":["string","null"]},"push_flags":{"type":"integer","format":"int32"},"show_online_status":{"type":"boolean"},"theme_mode":{"type":"string"},"theme_token":{"type":["string","null"]},"theme_version":{"type":["integer","null"],"format":"int64"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_UserPublic":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["uid","username","display_name","avatar","visibility","bot","system","created_at"],"properties":{"avatar":{"type":"string"},"bot":{"type":"boolean"},"created_at":{"type":"string"},"display_name":{"type":"string"},"language":{"type":["string","null"]},"locale":{"type":["string","null"]},"system":{"type":"boolean"},"timezone":{"type":["string","null"]},"uid":{"type":"string","format":"uuid"},"username":{"type":"string"},"visibility":{"$ref":"#/components/schemas/ProfileVisibility"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_AccessKeyView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","name","token_last_eight","scope","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"scope":{"$ref":"#/components/schemas/AccessKeyScope"},"token_last_eight":{"type":"string"},"updated_at":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_AgreementDoc":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["key","version","updated_at","title","content_md"],"properties":{"content_md":{"type":"string"},"key":{"type":"string"},"title":{"type":"string"},"updated_at":{"type":"string"},"version":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_BlockedSummary":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["user","since"],"properties":{"since":{"type":"string"},"user":{"$ref":"#/components/schemas/UserPublic"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_CollectionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","channel_id","name","nums_open_issue","nums_closed_issue","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"nums_closed_issue":{"type":"integer","format":"int64"},"nums_open_issue":{"type":"integer","format":"int64"},"updated_at":{"type":["string","null"]}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_DeletionRequestView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","user_id","status","created_at","updated_at"],"properties":{"cancelled_at":{"type":["string","null"]},"completed_at":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"reason":{"type":["string","null"]},"scheduled_for":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/DeletionStatus"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_DeviceView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","is_trusted","first_seen_at","last_seen_at","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"device_name":{"type":["string","null"]},"device_type":{"type":["string","null"]},"first_seen_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_trusted":{"type":"boolean"},"last_seen_at":{"type":"string"},"os":{"type":["string","null"]},"updated_at":{"type":"string"},"user_agent":{"type":["string","null"]}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_EmailView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","email","is_activated","is_primary","created_at","updated_at"],"properties":{"activated_at":{"type":["string","null"]},"created_at":{"type":"string"},"email":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_activated":{"type":"boolean"},"is_primary":{"type":"boolean"},"updated_at":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_FollowerSummary":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["user","since"],"properties":{"since":{"type":"string"},"user":{"$ref":"#/components/schemas/UserPublic"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_GitRef":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["name","sha","type_"],"properties":{"name":{"type":"string"},"sha":{"type":"string"},"type_":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_IssueTemplate":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["name","title","content","fields"],"properties":{"content":{"type":"string"},"description":{"type":["string","null"]},"fields":{"type":"array","items":{"$ref":"#/components/schemas/IssueTemplateField"}},"name":{"type":"string"},"title":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_MemeView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","name","content_type","url","size","created_at"],"properties":{"content_type":{"type":"string"},"created_at":{"type":"string"},"height":{"type":["integer","null"],"format":"int32"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"},"url":{"type":"string"},"width":{"type":["integer","null"],"format":"int32"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_NotificationView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","notification_type","title","created_at"],"properties":{"actor_uid":{"type":["string","null"],"format":"uuid"},"body":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"notification_type":{"$ref":"#/components/schemas/NotificationType"},"read_at":{"type":["string","null"]},"title":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_OAuthProviderInfo":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["name","display_name","authorize_url"],"properties":{"authorize_url":{"type":"string"},"display_name":{"type":"string"},"name":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_PullRequestCommentView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","pull_request_id","user_id","body","created_at"],"properties":{"body":{"type":"string"},"commit_sha":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"line":{"type":["integer","null"],"format":"int32"},"path":{"type":["string","null"]},"pull_request_id":{"type":"string","format":"uuid"},"review_id":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_PullRequestEventView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","pull_request_id","user_id","event_type","created_at"],"properties":{"commit_sha":{"type":["string","null"]},"content":{"type":["string","null"]},"created_at":{"type":"string"},"event_type":{"type":"string"},"id":{"type":"string","format":"uuid"},"pull_request_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_PullRequestReviewView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","pull_request_id","user_id","official","state","created_at"],"properties":{"commit_sha":{"type":["string","null"]},"content":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"official":{"type":"boolean"},"pull_request_id":{"type":"string","format":"uuid"},"state":{"$ref":"#/components/schemas/ReviewState"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_PushSubscriptionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","platform","endpoint","created_at"],"properties":{"created_at":{"type":"string"},"endpoint":{"type":"string"},"id":{"type":"string","format":"uuid"},"platform":{"$ref":"#/components/schemas/PushPlatform"},"user_agent":{"type":["string","null"]}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_RecentMentionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","channel_id","message_id","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"message_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_RecoveryCodeView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","created_at"],"properties":{"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"used_at":{"type":["string","null"]}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_ReportView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","reported_uid","reason","status","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"evidence":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"reason":{"type":"string"},"reported_uid":{"type":"string","format":"uuid"},"reporter_uid":{"type":["string","null"],"format":"uuid"},"resolution_note":{"type":["string","null"]},"resolver_uid":{"type":["string","null"],"format":"uuid"},"status":{"$ref":"#/components/schemas/ReportStatus"},"updated_at":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_RoleOverwriteView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","space_id","channel_id","role_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"channel_id":{"type":"string","format":"uuid"},"deny_mask":{"type":"integer","format":"int64"},"id":{"type":"string","format":"uuid"},"role_id":{"type":"string","format":"uuid"},"space_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_SavedMessageView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","channel_id","message_id","saved_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"id":{"type":"string","format":"uuid"},"message_id":{"type":"string","format":"uuid"},"saved_at":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_ScheduledMessageView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","target_channel_id","payload","scheduled_at","status","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"payload":{"type":"string"},"scheduled_at":{"type":"string"},"status":{"$ref":"#/components/schemas/ScheduledMessageStatus"},"target_channel_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_SessionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","kind","is_revoked","created_at","expires_at"],"properties":{"app_id":{"type":["string","null"]},"client_ip_hash":{"type":["string","null"]},"created_at":{"type":"string"},"expires_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_revoked":{"type":"boolean"},"kind":{"$ref":"#/components/schemas/SessionKind"},"replaced_at":{"type":["string","null"]},"user_agent_hash":{"type":["string","null"]}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_SshKeyView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","name","key_type","fingerprint","created_at"],"properties":{"created_at":{"type":"string"},"fingerprint":{"type":"string"},"id":{"type":"string","format":"uuid"},"key_type":{"$ref":"#/components/schemas/SshKeyType"},"last_used_at":{"type":["string","null"]},"name":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_SuspensionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","user_id","suspension_type","starts_at","created_at"],"properties":{"created_at":{"type":"string"},"ends_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"reason":{"type":["string","null"]},"revoked_at":{"type":["string","null"]},"revoked_by":{"type":["string","null"],"format":"uuid"},"starts_at":{"type":"string"},"suspended_by":{"type":["string","null"],"format":"uuid"},"suspension_type":{"$ref":"#/components/schemas/SuspensionType"},"user_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_UserMini":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","login"],"properties":{"avatar_url":{"type":["string","null"]},"email":{"type":["string","null"]},"full_name":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"login":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_UserOverwriteView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["channel_id","user_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"channel_id":{"type":"string","format":"uuid"},"deny_mask":{"type":"integer","format":"int64"},"user_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_VerifyCodeResult":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["code_row_id"],"properties":{"code_row_id":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ViewPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ViewView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ViewView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","project_id","creator_id","name","filter","sort_by","layout","is_shared","sort_order","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"creator_id":{"type":"string","format":"uuid"},"description":{"type":["string","null"]},"filter":{},"group_by":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_shared":{"type":"boolean"},"layout":{"type":"string"},"name":{"type":"string"},"project_id":{"type":"string","format":"uuid"},"sort_by":{"type":"string"},"sort_order":{"type":"integer","format":"int32"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_WatchView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","user_id","mode","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":["string","null"],"format":"uuid"},"mode":{"type":"string"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"ApplyDiffPatchFileOptions":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["content"],"properties":{"content":{"type":"string"},"sha":{"type":["string","null"]}}}]},"ArchiveFormatQuery":{"type":"object","properties":{"format":{"type":["string","null"]},"ref_name":{"type":["string","null"]}}},"ArchiveRepoOption":{"type":"object","required":["archived"],"properties":{"archived":{"type":"boolean"}}},"AssignRoleCmd":{"type":"object","required":["role_id"],"properties":{"role_id":{"type":"string","format":"uuid"}}},"AttachmentPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/AttachmentView"}},"total":{"type":"integer","format":"int64"}}},"AttachmentView":{"type":"object","required":["id","owner_type","owner_id","filename","content_type","size","url","created_at"],"properties":{"content_type":{"type":"string"},"created_at":{"type":"string"},"filename":{"type":"string"},"id":{"type":"string","format":"uuid"},"owner_id":{"type":"string","format":"uuid"},"owner_type":{"type":"string"},"size":{"type":"integer","format":"int64"},"uploaded_by":{"type":["string","null"],"format":"uuid"},"url":{"type":"string"}}},"Audience":{"type":"string","enum":["everyone","following_only","nobody"]},"AuthorizationUrlResp":{"type":"object","required":["url","temp_key"],"properties":{"temp_key":{"$ref":"#/components/schemas/TempKey"},"url":{"type":"string"}}},"AuthorizeCmd":{"type":"object","required":["provider","code_verifier"],"properties":{"app_id":{"type":["string","null"]},"code_verifier":{"type":"string"},"provider":{"$ref":"#/components/schemas/OAuthProvider"}}},"AvatarFormat":{"type":"string","enum":["jpg","png","webp","gif"]},"AvatarView":{"type":"object","required":["uid","url","format","bytes","updated_at"],"properties":{"bytes":{"type":"integer","format":"int64","minimum":0},"format":{"$ref":"#/components/schemas/AvatarFormat"},"uid":{"type":"string","format":"uuid"},"updated_at":{"type":"string"},"url":{"type":"string"}}},"BlobView":{"type":"object","required":["sha","size","encoding","content"],"properties":{"content":{"type":"string"},"encoding":{"type":"string"},"sha":{"type":"string"},"size":{"type":"integer","format":"int64"}}},"BlockedSummary":{"type":"object","required":["user","since"],"properties":{"since":{"type":"string"},"user":{"$ref":"#/components/schemas/UserPublic"}}},"BranchPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BranchView"}},"total":{"type":"integer","format":"int64"}}},"BranchProtectionPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BranchProtectionView"}},"total":{"type":"integer","format":"int64"}}},"BranchProtectionView":{"type":"object","required":["id","repo_id","branch_name","rule_name","priority","enable_push","enable_push_whitelist","push_whitelist_usernames","push_whitelist_teams","push_whitelist_deploy_keys","enable_force_push","enable_force_push_allowlist","force_push_allowlist_usernames","force_push_allowlist_teams","force_push_allowlist_deploy_keys","enable_merge_whitelist","merge_whitelist_usernames","merge_whitelist_teams","enable_bypass_allowlist","bypass_allowlist_usernames","bypass_allowlist_teams","enable_approvals_whitelist","approvals_whitelist_usernames","approvals_whitelist_teams","required_approvals","block_on_rejected_reviews","block_on_change_requested_reviews","block_on_outdated_branch","dismiss_stale_approvals","ignore_stale_approvals","require_signed_commits","block_admin_merge_override","protected_file_patterns","unprotected_file_patterns","created_at","updated_at"],"properties":{"approvals_whitelist_teams":{"type":"array","items":{"type":"string"}},"approvals_whitelist_usernames":{"type":"array","items":{"type":"string"}},"block_admin_merge_override":{"type":"boolean"},"block_on_change_requested_reviews":{"type":"boolean"},"block_on_outdated_branch":{"type":"boolean"},"block_on_rejected_reviews":{"type":"boolean"},"branch_name":{"type":"string"},"branch_pattern":{"type":["string","null"]},"bypass_allowlist_teams":{"type":"array","items":{"type":"string"}},"bypass_allowlist_usernames":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"dismiss_stale_approvals":{"type":"boolean"},"enable_approvals_whitelist":{"type":"boolean"},"enable_bypass_allowlist":{"type":"boolean"},"enable_force_push":{"type":"boolean"},"enable_force_push_allowlist":{"type":"boolean"},"enable_merge_whitelist":{"type":"boolean"},"enable_push":{"type":"boolean"},"enable_push_whitelist":{"type":"boolean"},"force_push_allowlist_deploy_keys":{"type":"boolean"},"force_push_allowlist_teams":{"type":"array","items":{"type":"string"}},"force_push_allowlist_usernames":{"type":"array","items":{"type":"string"}},"id":{"type":"string","format":"uuid"},"ignore_stale_approvals":{"type":"boolean"},"merge_whitelist_teams":{"type":"array","items":{"type":"string"}},"merge_whitelist_usernames":{"type":"array","items":{"type":"string"}},"priority":{"type":"integer","format":"int64"},"protected_file_patterns":{"type":"string"},"push_whitelist_deploy_keys":{"type":"boolean"},"push_whitelist_teams":{"type":"array","items":{"type":"string"}},"push_whitelist_usernames":{"type":"array","items":{"type":"string"}},"repo_id":{"type":"string","format":"uuid"},"require_signed_commits":{"type":"boolean"},"required_approvals":{"type":"integer","format":"int32"},"rule_name":{"type":"string"},"unprotected_file_patterns":{"type":"string"},"updated_at":{"type":"string"}}},"BranchView":{"type":"object","required":["id","repo_id","name","commit_sha","is_protected","protected","required_approvals","enable_status_check","status_check_contexts","user_can_push","user_can_merge","effective_branch_protection_name","is_deleted","created_at","updated_at"],"properties":{"commit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CommitMeta"}]},"commit_sha":{"type":"string"},"created_at":{"type":"string"},"deleted_at":{"type":["string","null"]},"effective_branch_protection_name":{"type":"string"},"enable_status_check":{"type":"boolean"},"id":{"type":"string","format":"uuid"},"is_deleted":{"type":"boolean"},"is_protected":{"type":"boolean"},"name":{"type":"string"},"protected":{"type":"boolean"},"repo_id":{"type":"string","format":"uuid"},"required_approvals":{"type":"integer","format":"int64"},"status_check_contexts":{"type":"array","items":{"type":"string"}},"updated_at":{"type":"string"},"user_can_merge":{"type":"boolean"},"user_can_push":{"type":"boolean"}}},"CallbackCmd":{"type":"object","required":["provider","code","state","temp_key_value"],"properties":{"app_id":{"type":["string","null"]},"code":{"type":"string"},"provider":{"$ref":"#/components/schemas/OAuthProvider"},"state":{"type":"string"},"temp_key_value":{"type":"string"}}},"ChangeFileEntry":{"type":"object","required":["operation","path"],"properties":{"content":{"type":["string","null"]},"from_path":{"type":["string","null"]},"operation":{"type":"string"},"path":{"type":"string"},"sha":{"type":["string","null"]}}},"ChangeFilesOptions":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["files"],"properties":{"files":{"type":"array","items":{"$ref":"#/components/schemas/ChangeFileEntry"}}}}]},"ChannelPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ChannelView"}},"total":{"type":"integer","format":"int64"}}},"ChannelSummary":{"type":"object","required":["id","space_id","name"],"properties":{"display_name":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"space_id":{"type":"string","format":"uuid"}}},"ChannelView":{"type":"object","required":["id","name","kind","position","is_archived","created_at","updated_at","created_by"],"properties":{"archived_at":{"type":["string","null"]},"archived_by":{"type":["string","null"],"format":"uuid"},"color":{"type":["string","null"]},"created_at":{"type":"string"},"created_by":{"type":"string","format":"uuid"},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_archived":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"parent_id":{"type":["string","null"],"format":"uuid"},"position":{"type":"integer","format":"int32"},"purpose":{"type":["string","null"]},"space_id":{"type":["string","null"],"format":"uuid"},"topic":{"type":["string","null"]},"updated_at":{"type":"string"}}},"CloseIssueOption":{"type":"object","required":["closed"],"properties":{"closed":{"type":"boolean"}}},"CollaboratorPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CollaboratorView"}},"total":{"type":"integer","format":"int64"}}},"CollaboratorView":{"type":"object","required":["id","repo_id","user_id","mode","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"mode":{"type":"string"},"repo_id":{"type":"string","format":"uuid"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"CollectionPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CollectionView"}},"total":{"type":"integer","format":"int64"}}},"CollectionView":{"type":"object","required":["id","channel_id","name","nums_open_issue","nums_closed_issue","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"nums_closed_issue":{"type":"integer","format":"int64"},"nums_open_issue":{"type":"integer","format":"int64"},"updated_at":{"type":["string","null"]}}},"CombinedStatusView":{"type":"object","required":["sha","state","statuses","total_count"],"properties":{"sha":{"type":"string"},"state":{"type":"string"},"statuses":{"type":"array","items":{"$ref":"#/components/schemas/CommitStatusView"}},"total_count":{"type":"integer","format":"int64"}}},"CommentPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CommentView"}},"total":{"type":"integer","format":"int64"}}},"CommentView":{"type":"object","required":["id","poster_id","content","created_at"],"properties":{"content":{"type":"string"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":["string","null"],"format":"uuid"},"parent_id":{"type":["string","null"],"format":"uuid"},"poster_id":{"type":"string","format":"uuid"},"updated_at":{"type":["string","null"]}}},"CommitDateOptions":{"type":"object","properties":{"author":{"type":["string","null"]},"committer":{"type":["string","null"]}}},"CommitDiffPayload":{"type":"object","required":["sha","format","content"],"properties":{"content":{"type":"string"},"format":{"type":"string"},"sha":{"type":"string"}}},"CommitMeta":{"type":"object","required":["sha","message"],"properties":{"author_email":{"type":["string","null"]},"author_name":{"type":["string","null"]},"authored_at":{"type":["string","null"]},"committed_at":{"type":["string","null"]},"committer_email":{"type":["string","null"]},"committer_name":{"type":["string","null"]},"message":{"type":"string"},"sha":{"type":"string"},"tree_sha":{"type":["string","null"]}}},"CommitStatusPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CommitStatusView"}},"total":{"type":"integer","format":"int64"}}},"CommitStatusView":{"type":"object","required":["id","repo_id","sha","state","context","url","creator","created_at"],"properties":{"context":{"type":"string"},"created_at":{"type":"string"},"creator":{"$ref":"#/components/schemas/CommitUserSummary"},"description":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"repo_id":{"type":"string","format":"uuid"},"sha":{"type":"string"},"state":{"type":"string"},"target_url":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"url":{"type":"string"}}},"CommitSummary":{"type":"object","required":["sha","message","parent_shas","tree_sha"],"properties":{"author":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/UserMini"}]},"authored_at":{"type":["string","null"]},"committed_at":{"type":["string","null"]},"committer":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/UserMini"}]},"message":{"type":"string"},"parent_shas":{"type":"array","items":{"type":"string"}},"sha":{"type":"string"},"tree_sha":{"type":"string"}}},"CommitUserSummary":{"type":"object","required":["id","login"],"properties":{"avatar_url":{"type":["string","null"]},"full_name":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"login":{"type":"string"}}},"CommitView":{"type":"object","required":["sha","message","parent_shas","tree_sha"],"properties":{"author_email":{"type":["string","null"]},"author_name":{"type":["string","null"]},"authored_at":{"type":["string","null"]},"committed_at":{"type":["string","null"]},"committer_email":{"type":["string","null"]},"committer_name":{"type":["string","null"]},"message":{"type":"string"},"parent_shas":{"type":"array","items":{"type":"string"}},"sha":{"type":"string"},"tree_sha":{"type":"string"}}},"CommitsResponse":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CommitSummary"}},"total":{"type":"integer","format":"int64"}}},"CompareFileDiff":{"type":"object","required":["path","additions","deletions","status"],"properties":{"additions":{"type":"integer","format":"int64"},"deletions":{"type":"integer","format":"int64"},"path":{"type":"string"},"status":{"type":"string"}}},"CompareView":{"type":"object","required":["base","head","total_commits","ahead_by","behind_by","files"],"properties":{"ahead_by":{"type":"integer","format":"int64"},"base":{"type":"string"},"behind_by":{"type":"integer","format":"int64"},"files":{"type":"array","items":{"$ref":"#/components/schemas/CompareFileDiff"}},"head":{"type":"string"},"merge_base":{"type":["string","null"]},"total_commits":{"type":"integer","format":"int64"}}},"ConfirmEmailChangeCmd":{"type":"object","required":["ticket_id"],"properties":{"ticket_id":{"type":"string","format":"uuid"}}},"ContentHistoryPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ContentHistoryView"}},"total":{"type":"integer","format":"int64"}}},"ContentHistoryView":{"type":"object","required":["id","issue_id","poster_id","edited_at","created_at"],"properties":{"comment_id":{"type":["string","null"],"format":"uuid"},"content_after":{"type":["string","null"]},"content_before":{"type":["string","null"]},"created_at":{"type":"string"},"edited_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"},"poster_id":{"type":"string","format":"uuid"}}},"ContentsExtResponse":{"type":"object","required":["dir_contents"],"properties":{"dir_contents":{"type":"array","items":{"$ref":"#/components/schemas/ContentsResponse"}},"file_contents":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ContentsResponse"}]}}},"ContentsListResponse":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ContentsResponse"}}}},"ContentsQuery":{"type":"object","properties":{"ref":{"type":["string","null"]}}},"ContentsResponse":{"type":"object","required":["name","path","sha","type","size"],"properties":{"content":{"type":["string","null"]},"download_url":{"type":["string","null"]},"encoding":{"type":["string","null"]},"git_url":{"type":["string","null"]},"html_url":{"type":["string","null"]},"last_author_date":{"type":["string","null"]},"last_commit_message":{"type":["string","null"]},"last_commit_sha":{"type":["string","null"]},"last_committer_date":{"type":["string","null"]},"lfs_oid":{"type":["string","null"]},"lfs_size":{"type":["integer","null"],"format":"int64"},"links":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/FileLinksResponse"}]},"name":{"type":"string"},"path":{"type":"string"},"sha":{"type":"string"},"size":{"type":"integer","format":"int64"},"submodule_git_url":{"type":["string","null"]},"target":{"type":["string","null"]},"type":{"type":"string"},"url":{"type":["string","null"]}}},"CreateAccessKeyCmd":{"type":"object","required":["name","scope"],"properties":{"name":{"type":"string"},"scope":{"$ref":"#/components/schemas/AccessKeyScope"}}},"CreateAccessKeyResp":{"type":"object","required":["key","token"],"properties":{"key":{"$ref":"#/components/schemas/AccessKeyView"},"token":{"type":"string"}}},"CreateBanCmd":{"type":"object","required":["user_id"],"properties":{"allow_agent_join":{"type":["boolean","null"]},"allow_comment_any":{"type":["boolean","null"]},"allow_push_repo":{"type":["boolean","null"]},"allow_speak":{"type":["boolean","null"]},"expires_at":{"type":["string","null"]},"reason":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"CreateBranchOption":{"type":"object","required":["new_branch_name"],"properties":{"new_branch_name":{"type":"string"},"old_branch_name":{"type":["string","null"]},"old_ref_name":{"type":["string","null"]}}},"CreateBranchProtectionOption":{"type":"object","required":["branch_name"],"properties":{"approvals_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"approvals_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"block_admin_merge_override":{"type":["boolean","null"]},"block_on_change_requested_reviews":{"type":["boolean","null"]},"block_on_outdated_branch":{"type":["boolean","null"]},"block_on_rejected_reviews":{"type":["boolean","null"]},"branch_name":{"type":"string"},"branch_pattern":{"type":["string","null"]},"bypass_allowlist_teams":{"type":["array","null"],"items":{"type":"string"}},"bypass_allowlist_usernames":{"type":["array","null"],"items":{"type":"string"}},"dismiss_stale_approvals":{"type":["boolean","null"]},"enable_approvals_whitelist":{"type":["boolean","null"]},"enable_bypass_allowlist":{"type":["boolean","null"]},"enable_force_push":{"type":["boolean","null"]},"enable_force_push_allowlist":{"type":["boolean","null"]},"enable_merge_whitelist":{"type":["boolean","null"]},"enable_push":{"type":["boolean","null"]},"enable_push_whitelist":{"type":["boolean","null"]},"force_push_allowlist_deploy_keys":{"type":["boolean","null"]},"force_push_allowlist_teams":{"type":["array","null"],"items":{"type":"string"}},"force_push_allowlist_usernames":{"type":["array","null"],"items":{"type":"string"}},"ignore_stale_approvals":{"type":["boolean","null"]},"merge_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"merge_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"priority":{"type":["integer","null"],"format":"int64"},"protected_file_patterns":{"type":["string","null"]},"push_whitelist_deploy_keys":{"type":["boolean","null"]},"push_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"push_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"require_signed_commits":{"type":["boolean","null"]},"required_approvals":{"type":["integer","null"],"format":"int32"},"rule_name":{"type":["string","null"]},"unprotected_file_patterns":{"type":["string","null"]}}},"CreateCollectionOption":{"type":"object","required":["space_id","name"],"properties":{"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"name":{"type":"string"},"parent_dir":{"type":["string","null"],"format":"uuid"},"space_id":{"type":"string","format":"uuid"}}},"CreateCommentOption":{"type":"object","required":["content"],"properties":{"content":{"type":"string"},"parent_id":{"type":["string","null"],"format":"uuid"}}},"CreateDependencyOption":{"type":"object","required":["dependency_id"],"properties":{"dependency_id":{"type":"string","format":"uuid"}}},"CreateDeployKeyOption":{"type":"object","required":["title","key"],"properties":{"key":{"type":"string"},"read_only":{"type":["boolean","null"]},"title":{"type":"string"}}},"CreateDocumentCmd":{"type":"object","required":["title","slug"],"properties":{"content":{"type":"string"},"icon":{"type":["string","null"]},"parent_id":{"type":["string","null"],"format":"uuid"},"slug":{"type":"string"},"title":{"type":"string"}}},"CreateFileOption":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["content"],"properties":{"content":{"type":"string"}}}]},"CreateInviteCmd":{"type":"object","required":["role_ids"],"properties":{"email":{"type":["string","null"]},"expires_at":{"type":["string","null"]},"role_ids":{"type":"array","items":{"type":"string","format":"uuid"}},"user_id":{"type":["string","null"],"format":"uuid"}}},"CreateIssueOption":{"type":"object","required":["title","body"],"properties":{"body":{"type":"string"},"description":{"type":["string","null"]},"milestone_id":{"type":["string","null"],"format":"uuid"},"title":{"type":"string"}}},"CreateLabelOption":{"type":"object","required":["name","color"],"properties":{"color":{"type":"string"},"description":{"type":["string","null"]},"exclusive":{"type":["boolean","null"]},"exclusive_order":{"type":["integer","null"],"format":"int32"},"name":{"type":"string"}}},"CreateMemberOption":{"type":"object","required":["user_id","kind"],"properties":{"kind":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"CreateMilestoneOption":{"type":"object","required":["name"],"properties":{"description":{"type":["string","null"]},"due_at":{"type":["string","null"]},"name":{"type":"string"}}},"CreatePinOption":{"type":"object","required":["issue_id","pin_order"],"properties":{"issue_id":{"type":"string","format":"uuid"},"pin_order":{"type":"integer","format":"int32"}}},"CreateProjectCmd":{"type":"object","required":["space_id","name"],"properties":{"color":{"type":["string","null"]},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"lead_id":{"type":["string","null"],"format":"uuid"},"name":{"type":"string"},"parent_dir":{"type":["string","null"],"format":"uuid"},"space_id":{"type":"string","format":"uuid"},"target_date":{"type":["string","null"],"format":"date"}}},"CreatePullRequestCommentOption":{"type":"object","required":["body"],"properties":{"body":{"type":"string"},"commit_sha":{"type":["string","null"]},"line":{"type":["integer","null"],"format":"int32"},"path":{"type":["string","null"]}}},"CreatePullRequestOption":{"type":"object","required":["title","head","base"],"properties":{"base":{"type":"string"},"body":{"type":["string","null"]},"head":{"type":"string"},"title":{"type":"string"}}},"CreateReactionOption":{"type":"object","required":["emoji"],"properties":{"emoji":{"type":"string"}}},"CreateReleaseOption":{"type":"object","required":["tag_name","title"],"properties":{"content":{"type":["string","null"]},"is_draft":{"type":["boolean","null"]},"is_prerelease":{"type":["boolean","null"]},"tag_message":{"type":["string","null"]},"tag_name":{"type":"string"},"target":{"type":["string","null"]},"title":{"type":"string"}}},"CreateRepoOption":{"type":"object","required":["space_id","name"],"properties":{"auto_init":{"type":["boolean","null"]},"default_branch":{"type":["string","null"]},"description":{"type":["string","null"]},"enable_lfs":{"type":["boolean","null"]},"gitignores":{"type":["string","null"]},"is_private":{"type":["boolean","null"]},"issue_labels":{"type":["string","null"]},"license_name":{"type":["string","null"]},"name":{"type":"string"},"object_format":{"type":["string","null"]},"parent_dir":{"type":["string","null"],"format":"uuid"},"readme":{"type":["string","null"]},"space_id":{"type":"string","format":"uuid"},"template":{"type":["boolean","null"]},"website":{"type":["string","null"]}}},"CreateRepoRelOption":{"type":"object","required":["repo_id"],"properties":{"repo_id":{"type":"string","format":"uuid"}}},"CreateRoleCmd":{"type":"object","required":["name","permissions"],"properties":{"color":{"type":["string","null"]},"icon_hash":{"type":["string","null"]},"name":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}},"position":{"type":["integer","null"],"format":"int64"},"unicode_emoji":{"type":["string","null"]}}},"CreateSpaceCmd":{"type":"object","required":["name"],"properties":{"allow_invite":{"type":"boolean"},"allow_join":{"type":"boolean"},"allow_join_level":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SpaceAllowJoinLevel"}]},"avatar_url":{"type":["string","null"]},"description":{"type":["string","null"]},"member_must_enable_2fa":{"type":"boolean"},"name":{"type":"string"},"public":{"type":"boolean"},"welcome_message":{"type":["string","null"]}}},"CreateStatusOption":{"type":"object","required":["state","context"],"properties":{"context":{"type":"string"},"description":{"type":["string","null"]},"state":{"type":"string"},"target_url":{"type":["string","null"]}}},"CreateTagOption":{"type":"object","required":["tag_name"],"properties":{"message":{"type":["string","null"]},"tag_name":{"type":"string"},"target":{"type":["string","null"]}}},"CreateTagProtectionOption":{"type":"object","required":["name_pattern"],"properties":{"name_pattern":{"type":"string"},"whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"whitelist_usernames":{"type":["array","null"],"items":{"type":"string","format":"uuid"}}}},"CreateViewCmd":{"type":"object","required":["name"],"properties":{"description":{"type":["string","null"]},"filter":{},"group_by":{"type":["string","null"]},"is_shared":{"type":"boolean"},"layout":{"type":"string"},"name":{"type":"string"},"sort_by":{"type":"string"}}},"DeleteFileOption":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["sha"],"properties":{"sha":{"type":"string"}}}]},"DeletionRequestView":{"type":"object","required":["id","user_id","status","created_at","updated_at"],"properties":{"cancelled_at":{"type":["string","null"]},"completed_at":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"reason":{"type":["string","null"]},"scheduled_for":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/DeletionStatus"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"DeletionStatus":{"type":"string","enum":["pending","scheduled","completed","cancelled"]},"DependencyView":{"type":"object","required":["id","issue_id","dependency_id","created_at"],"properties":{"created_at":{"type":"string"},"dependency_id":{"type":"string","format":"uuid"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"}}},"DeployKeyPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DeployKeyView"}},"total":{"type":"integer","format":"int64"}}},"DeployKeyView":{"type":"object","required":["id","key_id","repo_id","title","key_type","fingerprint","content","url","read_only","created_at"],"properties":{"content":{"type":"string"},"created_at":{"type":"string"},"fingerprint":{"type":"string"},"id":{"type":"string","format":"uuid"},"key_id":{"type":"integer","format":"int64"},"key_type":{"type":"string"},"last_used_at":{"type":["string","null"]},"read_only":{"type":"boolean"},"repo_id":{"type":"string","format":"uuid"},"title":{"type":"string"},"url":{"type":"string"}}},"DeviceView":{"type":"object","required":["id","is_trusted","first_seen_at","last_seen_at","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"device_name":{"type":["string","null"]},"device_type":{"type":["string","null"]},"first_seen_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_trusted":{"type":"boolean"},"last_seen_at":{"type":"string"},"os":{"type":["string","null"]},"updated_at":{"type":"string"},"user_agent":{"type":["string","null"]}}},"DocumentPage":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DocumentView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"DocumentView":{"type":"object","required":["id","project_id","creator_id","title","slug","content","created_at"],"properties":{"content":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"creator_id":{"type":"string","format":"uuid"},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"last_editor_id":{"type":["string","null"],"format":"uuid"},"parent_id":{"type":["string","null"],"format":"uuid"},"project_id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"title":{"type":"string"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"EditBranchProtectionOption":{"type":"object","properties":{"approvals_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"approvals_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"block_admin_merge_override":{"type":["boolean","null"]},"block_on_change_requested_reviews":{"type":["boolean","null"]},"block_on_outdated_branch":{"type":["boolean","null"]},"block_on_rejected_reviews":{"type":["boolean","null"]},"branch_pattern":{"type":["string","null"]},"bypass_allowlist_teams":{"type":["array","null"],"items":{"type":"string"}},"bypass_allowlist_usernames":{"type":["array","null"],"items":{"type":"string"}},"dismiss_stale_approvals":{"type":["boolean","null"]},"enable_approvals_whitelist":{"type":["boolean","null"]},"enable_bypass_allowlist":{"type":["boolean","null"]},"enable_force_push":{"type":["boolean","null"]},"enable_force_push_allowlist":{"type":["boolean","null"]},"enable_merge_whitelist":{"type":["boolean","null"]},"enable_push":{"type":["boolean","null"]},"enable_push_whitelist":{"type":["boolean","null"]},"force_push_allowlist_deploy_keys":{"type":["boolean","null"]},"force_push_allowlist_teams":{"type":["array","null"],"items":{"type":"string"}},"force_push_allowlist_usernames":{"type":["array","null"],"items":{"type":"string"}},"ignore_stale_approvals":{"type":["boolean","null"]},"merge_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"merge_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"priority":{"type":["integer","null"],"format":"int64"},"protected_file_patterns":{"type":["string","null"]},"push_whitelist_deploy_keys":{"type":["boolean","null"]},"push_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"push_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"require_signed_commits":{"type":["boolean","null"]},"required_approvals":{"type":["integer","null"],"format":"int32"},"unprotected_file_patterns":{"type":["string","null"]}}},"EditReleaseOption":{"type":"object","properties":{"content":{"type":["string","null"]},"is_draft":{"type":["boolean","null"]},"is_prerelease":{"type":["boolean","null"]},"tag_name":{"type":["string","null"]},"target":{"type":["string","null"]},"title":{"type":["string","null"]}}},"EditTagProtectionOption":{"type":"object","properties":{"name_pattern":{"type":["string","null"]},"whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"whitelist_usernames":{"type":["array","null"],"items":{"type":"string","format":"uuid"}}}},"EmailChangeTicketStatus":{"type":"string","enum":["pending","verified","completed","cancelled"]},"EmailChangeTicketView":{"type":"object","required":["id","new_email","status","expires_at","created_at"],"properties":{"created_at":{"type":"string"},"expires_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"new_email":{"type":"string"},"status":{"$ref":"#/components/schemas/EmailChangeTicketStatus"},"used_at":{"type":["string","null"]}}},"EmailView":{"type":"object","required":["id","email","is_activated","is_primary","created_at","updated_at"],"properties":{"activated_at":{"type":["string","null"]},"created_at":{"type":"string"},"email":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_activated":{"type":"boolean"},"is_primary":{"type":"boolean"},"updated_at":{"type":"string"}}},"ErrorBody":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}},"EventPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/EventView"}},"total":{"type":"integer","format":"int64"}}},"EventView":{"type":"object","required":["id","user_id","event_type","created_at"],"properties":{"comment_id":{"type":["string","null"],"format":"uuid"},"commit_sha":{"type":["string","null"]},"content":{"type":["string","null"]},"created_at":{"type":"string"},"event_type":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":["string","null"],"format":"uuid"},"new_ref":{"type":["string","null"]},"new_title":{"type":["string","null"]},"old_ref":{"type":["string","null"]},"old_title":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"ExternalTracker":{"type":"object","required":["external_tracker_url","external_tracker_format","external_tracker_style"],"properties":{"external_tracker_format":{"type":"string"},"external_tracker_style":{"type":"string"},"external_tracker_url":{"type":"string"}}},"ExternalWiki":{"type":"object","required":["external_wiki_url"],"properties":{"external_wiki_url":{"type":"string"}}},"FavoritePage":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/FavoriteView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"FavoriteView":{"type":"object","required":["id","project_id","user_id","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"folder":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"project_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"FileDeleteResponse":{"type":"object","properties":{"commit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CommitSummary"}]},"content":{}}},"FileLinksResponse":{"type":"object","properties":{"git":{"type":["string","null"]},"html":{"type":["string","null"]},"self":{"type":["string","null"]}}},"FileOptions":{"type":"object","properties":{"author":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/GitIdentity"}]},"branch":{"type":["string","null"]},"committer":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/GitIdentity"}]},"dates":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CommitDateOptions"}]},"force_push":{"type":["boolean","null"]},"message":{"type":["string","null"]},"new_branch":{"type":["string","null"]},"signoff":{"type":["boolean","null"]}}},"FilesResponse":{"type":"object","required":["files"],"properties":{"commit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CommitSummary"}]},"files":{"type":"array","items":{"$ref":"#/components/schemas/ContentsResponse"}}}},"FollowerSummary":{"type":"object","required":["user","since"],"properties":{"since":{"type":"string"},"user":{"$ref":"#/components/schemas/UserPublic"}}},"ForgotPasswordCmd":{"type":"object","required":["email","pow"],"properties":{"email":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"}}},"ForgotPasswordResp":{"type":"object","required":["sent","temp_key"],"properties":{"sent":{"type":"boolean"},"temp_key":{"$ref":"#/components/schemas/TempKey"}}},"ForkRepoOption":{"type":"object","required":["to_channel_id"],"properties":{"description":{"type":["string","null"]},"name":{"type":["string","null"]},"to_channel_id":{"type":"string","format":"uuid"}}},"ForkView":{"type":"object","required":["id","name","full_name","owner","private","fork","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"fork":{"type":"boolean"},"full_name":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"owner":{"$ref":"#/components/schemas/UserMini"},"private":{"type":"boolean"},"updated_at":{"type":"string"}}},"ForksResponse":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ForkView"}},"total":{"type":"integer","format":"int64"}}},"GenerateRepoOption":{"type":"object","required":["to_channel_id","name"],"properties":{"description":{"type":["string","null"]},"is_private":{"type":["boolean","null"]},"name":{"type":"string"},"to_channel_id":{"type":"string","format":"uuid"}}},"GitIdentity":{"type":"object","required":["name","email"],"properties":{"date":{"type":["string","null"]},"email":{"type":"string"},"name":{"type":"string"}}},"GitRef":{"type":"object","required":["name","sha","type_"],"properties":{"name":{"type":"string"},"sha":{"type":"string"},"type_":{"type":"string"}}},"HealthStatus":{"type":"object","required":["status","service"],"properties":{"service":{"type":"string"},"status":{"type":"string"}}},"InternalTracker":{"type":"object","required":["enable_time_tracker","allow_only_contributors_to_track_time","enable_issue_dependencies"],"properties":{"allow_only_contributors_to_track_time":{"type":"boolean"},"enable_issue_dependencies":{"type":"boolean"},"enable_time_tracker":{"type":"boolean"}}},"IssueConfig":{"type":"object","required":["blank_issues_enabled"],"properties":{"blank_issues_enabled":{"type":"boolean"},"contact_links":{}}},"IssueConfigValidation":{"type":"object","required":["valid"],"properties":{"message":{"type":["string","null"]},"valid":{"type":"boolean"}}},"IssuePage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/IssueView"}},"total":{"type":"integer","format":"int64"}}},"IssueState":{"type":"string","enum":["open","closed"]},"IssueTemplate":{"type":"object","required":["name","title","content","fields"],"properties":{"content":{"type":"string"},"description":{"type":["string","null"]},"fields":{"type":"array","items":{"$ref":"#/components/schemas/IssueTemplateField"}},"name":{"type":"string"},"title":{"type":"string"}}},"IssueTemplateField":{"type":"object","required":["type_","id","name"],"properties":{"description":{"type":["string","null"]},"id":{"type":"string"},"name":{"type":"string"},"required":{"type":["boolean","null"]},"type_":{"type":"string"},"validations":{}}},"IssueUserView":{"type":"object","required":["id","user_id","issue_id","is_read","is_mentioned","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_mentioned":{"type":"boolean"},"is_read":{"type":"boolean"},"issue_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"IssueView":{"type":"object","required":["id","collection_id","autoincrement_id","author_id","title","body","state","created_at"],"properties":{"author_id":{"type":"string","format":"uuid"},"autoincrement_id":{"type":"integer","format":"int32"},"body":{"type":"string"},"closed_at":{"type":["string","null"]},"collection_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"milestone_id":{"type":["string","null"],"format":"uuid"},"state":{"$ref":"#/components/schemas/IssueState"},"title":{"type":"string"},"updated_at":{"type":["string","null"]}}},"LabelPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/LabelView"}},"total":{"type":"integer","format":"int64"}}},"LabelView":{"type":"object","required":["id","channel_id","name","exclusive","exclusive_order","color","is_archived","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"color":{"type":"string"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"exclusive":{"type":"boolean"},"exclusive_order":{"type":"integer","format":"int32"},"id":{"type":"string","format":"uuid"},"is_archived":{"type":"boolean"},"name":{"type":"string"},"updated_at":{"type":["string","null"]}}},"LanguagesResponse":{"type":"object","required":["languages"],"properties":{"languages":{"type":"object","additionalProperties":{"type":"integer","format":"int64"},"propertyNames":{"type":"string"}}}},"LicensesResponse":{"type":"object","required":["licenses"],"properties":{"licenses":{"type":"array","items":{"type":"string"}}}},"LinkKind":{"type":"string","enum":["related","duplicate","blocks","blocked_by"]},"LinkPage":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/LinkView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"LinkView":{"type":"object","required":["id","project_id","related_project_id","kind","created_by","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"created_by":{"type":"string","format":"uuid"},"id":{"type":"string","format":"uuid"},"kind":{"$ref":"#/components/schemas/LinkKind"},"project_id":{"type":"string","format":"uuid"},"related_project_id":{"type":"string","format":"uuid"}}},"ListActivityQuery":{"type":"object","properties":{"page":{"type":"integer","format":"int64","minimum":0},"per_page":{"type":"integer","format":"int64","minimum":0},"verb":{"type":["string","null"]}}},"ListAttachmentQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListBlocksQuery":{"type":"object","properties":{"cursor":{"type":["string","null"],"format":"uuid"},"limit":{"type":"integer","minimum":0}}},"ListBranchProtectionQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListBranchQuery":{"type":"object","properties":{"keyword":{"type":["string","null"]},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListCollaboratorQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListCollectionQuery":{"type":"object","properties":{"channel_id":{"type":["string","null"],"format":"uuid"},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"q":{"type":["string","null"]}}},"ListCommentQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"parent_id":{"type":["string","null"],"format":"uuid"}}},"ListContentHistoryQuery":{"type":"object","properties":{"comment_id":{"type":["string","null"],"format":"uuid"},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListDeployKeyQuery":{"type":"object","properties":{"fingerprint":{"type":["string","null"]},"key_id":{"type":["string","null"],"format":"uuid"},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListEventQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListFollowersQuery":{"type":"object","required":["target_uid"],"properties":{"cursor":{"type":["string","null"],"format":"uuid"},"limit":{"type":"integer","minimum":0},"target_uid":{"type":"string","format":"uuid"}}},"ListFollowingQuery":{"type":"object","required":["user_uid"],"properties":{"cursor":{"type":["string","null"],"format":"uuid"},"limit":{"type":"integer","minimum":0},"user_uid":{"type":"string","format":"uuid"}}},"ListIssueQuery":{"type":"object","properties":{"author_id":{"type":["string","null"],"format":"uuid"},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"milestone_id":{"type":["string","null"],"format":"uuid"},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"q":{"type":["string","null"]},"state":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/IssueState"}]}}},"ListLabelQuery":{"type":"object","properties":{"is_archived":{"type":["boolean","null"]},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"q":{"type":["string","null"]}}},"ListMemberQuery":{"type":"object","properties":{"kind":{"type":["string","null"]},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListMilestoneQuery":{"type":"object","properties":{"is_closed":{"type":["boolean","null"]},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"q":{"type":["string","null"]}}},"ListNotificationsQuery":{"type":"object","properties":{"cursor":{"type":["string","null"],"format":"uuid"},"limit":{"type":"integer","minimum":0},"notification_type":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NotificationType"}]},"unread_only":{"type":["boolean","null"]}}},"ListProjectQuery":{"type":"object","required":["space_id"],"properties":{"lead_id":{"type":["string","null"],"format":"uuid"},"page":{"type":"integer","format":"int64","minimum":0},"per_page":{"type":"integer","format":"int64","minimum":0},"q":{"type":["string","null"]},"space_id":{"type":"string","format":"uuid"},"starred_only":{"type":["boolean","null"]},"state":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProjectState"}]}}},"ListPullRequestQuery":{"type":"object","properties":{"keyword":{"type":["string","null"]},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0},"state":{"type":["string","null"]}}},"ListReactionQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListReleaseQuery":{"type":"object","properties":{"draft":{"type":["boolean","null"]},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0},"prerelease":{"type":["boolean","null"]}}},"ListRepoQuery":{"type":"object","properties":{"channel_id":{"type":["string","null"],"format":"uuid"},"is_archived":{"type":["boolean","null"]},"is_private":{"type":["boolean","null"]},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"owner_user_id":{"type":["string","null"],"format":"uuid"},"q":{"type":["string","null"]}}},"ListSessionsQuery":{"type":"object","properties":{"app_id":{"type":["string","null"]},"include_revoked":{"type":"boolean"}}},"ListStatusQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0},"sort":{"type":["string","null"]},"state":{"type":["string","null"]}}},"ListSubscriberQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListTagProtectionQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListTagQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListTrackedTimeQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"user_id":{"type":["string","null"],"format":"uuid"}}},"LoginCmd":{"type":"object","required":["identifier","password","pow"],"properties":{"app_id":{"type":["string","null"]},"identifier":{"type":"string"},"password":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"}}},"LoginResp":{"type":"object","required":["access_token","refresh_token","token_type","expires_in","user"],"properties":{"access_token":{"type":"string"},"expires_in":{"type":"integer","format":"int64"},"refresh_token":{"type":"string"},"token_type":{"type":"string"},"user":{"$ref":"#/components/schemas/UserPublic"}}},"LogoutCmd":{"type":"object","required":["refresh_token"],"properties":{"refresh_token":{"type":"string"}}},"LogoutResp":{"type":"object","required":["revoked"],"properties":{"revoked":{"type":"boolean"}}},"MarkAllReadResp":{"type":"object","required":["marked"],"properties":{"marked":{"type":"integer","format":"int64","minimum":0}}},"MarkReadCmd":{"type":"object","required":["notification_ids"],"properties":{"notification_ids":{"type":"array","items":{"type":"string","format":"uuid"}}}},"MarkReadResp":{"type":"object","required":["marked"],"properties":{"marked":{"type":"integer","format":"int64","minimum":0}}},"MemberPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/MemberView"}},"total":{"type":"integer","format":"int64"}}},"MemberRole":{"type":"string","enum":["owner","lead","contributor","viewer"]},"MemberView":{"type":"object","required":["id","issue_id","user_id","kind","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"},"kind":{"type":"string"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"MemeView":{"type":"object","required":["id","name","content_type","url","size","created_at"],"properties":{"content_type":{"type":"string"},"created_at":{"type":"string"},"height":{"type":["integer","null"],"format":"int32"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"},"url":{"type":"string"},"width":{"type":["integer","null"],"format":"int32"}}},"MergePullRequestOption":{"type":"object","required":["style"],"properties":{"commit_message":{"type":["string","null"]},"commit_title":{"type":["string","null"]},"delete_branch_after_merge":{"type":"boolean"},"style":{"$ref":"#/components/schemas/MergeStyle"}}},"MergeStyle":{"type":"string","enum":["fast_forward","rebase","rebase_merge","squash","merge","manually_merged"]},"MergeUpstreamRequest":{"type":"object","required":["branch"],"properties":{"branch":{"type":"string"},"ff_only":{"type":["boolean","null"]}}},"MergeUpstreamResponse":{"type":"object","required":["merge_type"],"properties":{"merge_type":{"type":"string"}}},"MergeView":{"type":"object","required":["sha","merged"],"properties":{"merged":{"type":"boolean"},"message":{"type":["string","null"]},"sha":{"type":"string"}}},"MessageNotifications":{"type":"string","enum":["all","mentions","nothing"]},"MilestonePage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/MilestoneView"}},"total":{"type":"integer","format":"int64"}}},"MilestoneView":{"type":"object","required":["id","collection_id","name","is_closed","num_issues","num_closed_issues","created_at"],"properties":{"collection_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"due_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_closed":{"type":"boolean"},"name":{"type":"string"},"num_closed_issues":{"type":"integer","format":"int32"},"num_issues":{"type":"integer","format":"int32"},"updated_at":{"type":["string","null"]}}},"NewPinAllowedResponse":{"type":"object","required":["allowed"],"properties":{"allowed":{"type":"boolean"}}},"NoteView":{"type":"object","required":["sha","message"],"properties":{"message":{"type":"string"},"sha":{"type":"string"}}},"NotificationType":{"type":"string","enum":["mention","reply","follow","invite","assignment","system"]},"NotificationView":{"type":"object","required":["id","notification_type","title","created_at"],"properties":{"actor_uid":{"type":["string","null"],"format":"uuid"},"body":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"notification_type":{"$ref":"#/components/schemas/NotificationType"},"read_at":{"type":["string","null"]},"title":{"type":"string"}}},"OAuthLoginResp":{"type":"object","required":["access_token","refresh_token","token_type","expires_in","user_id","auto_registered"],"properties":{"access_token":{"type":"string"},"auto_registered":{"type":"boolean"},"expires_in":{"type":"integer","format":"int64"},"refresh_token":{"type":"string"},"token_type":{"type":"string"},"user_id":{"type":"string"}}},"OAuthProvider":{"type":"string","enum":["google","github","apple"]},"OAuthProviderInfo":{"type":"object","required":["name","display_name","authorize_url"],"properties":{"authorize_url":{"type":"string"},"display_name":{"type":"string"},"name":{"type":"string"}}},"Permission":{"type":"object","required":["admin","push","pull"],"properties":{"admin":{"type":"boolean"},"pull":{"type":"boolean"},"push":{"type":"boolean"}}},"PinView":{"type":"object","required":["id","collection_id","pin_order","created_at"],"properties":{"collection_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":["string","null"],"format":"uuid"},"pin_order":{"type":"integer","format":"int32"}}},"PowChallengeResp":{"type":"object","required":["challenge","ttl_seconds"],"properties":{"challenge":{"type":"string"},"ttl_seconds":{"type":"integer","format":"int64","minimum":0}}},"PowProof":{"type":"object","required":["challenge","solution"],"properties":{"challenge":{"type":"string"},"solution":{"type":"string"}}},"PrState":{"type":"string","enum":["open","closed","merged"]},"ProfileView":{"type":"object","required":["user_id","show_email","show_location","show_real_name","show_activity","updated_at"],"properties":{"accent_color":{"type":["string","null"]},"banner_color":{"type":["integer","null"],"format":"int32"},"banner_url":{"type":["string","null"]},"bio":{"type":["string","null"]},"company":{"type":["string","null"]},"date_of_birth":{"type":["string","null"],"format":"date"},"location":{"type":["string","null"]},"pronouns":{"type":["string","null"]},"pronouns_privacy":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProfileVisibility"}]},"real_name":{"type":["string","null"]},"show_activity":{"type":"boolean"},"show_email":{"type":"boolean"},"show_location":{"type":"boolean"},"show_real_name":{"type":"boolean"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"},"website":{"type":["string","null"]}}},"ProfileVisibility":{"type":"string","enum":["public","registered_only","members_only","private"]},"ProjectHealth":{"type":"string","enum":["on_track","at_risk","off_track","none"]},"ProjectPage":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ProjectView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"ProjectState":{"type":"string","enum":["backlog","planned","in_progress","paused","completed","cancelled"]},"ProjectView":{"type":"object","required":["id","space_id","creator_id","name","state","health","sort_order","starred","created_at"],"properties":{"cancelled_at":{"type":["string","null"],"format":"date-time"},"color":{"type":["string","null"]},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"creator_id":{"type":"string","format":"uuid"},"description":{"type":["string","null"]},"health":{"$ref":"#/components/schemas/ProjectHealth"},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"lead_id":{"type":["string","null"],"format":"uuid"},"name":{"type":"string"},"sort_order":{"type":"integer","format":"int32"},"space_id":{"type":"string","format":"uuid"},"starred":{"type":"integer","format":"int32"},"started_at":{"type":["string","null"],"format":"date-time"},"state":{"$ref":"#/components/schemas/ProjectState"},"target_date":{"type":["string","null"],"format":"date"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"PublisherSummary":{"type":"object","required":["id","name","login"],"properties":{"avatar_url":{"type":["string","null"]},"email":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"login":{"type":"string"},"name":{"type":"string"}}},"PullRequestCommentView":{"type":"object","required":["id","pull_request_id","user_id","body","created_at"],"properties":{"body":{"type":"string"},"commit_sha":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"line":{"type":["integer","null"],"format":"int32"},"path":{"type":["string","null"]},"pull_request_id":{"type":"string","format":"uuid"},"review_id":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"PullRequestEventView":{"type":"object","required":["id","pull_request_id","user_id","event_type","created_at"],"properties":{"commit_sha":{"type":["string","null"]},"content":{"type":["string","null"]},"created_at":{"type":"string"},"event_type":{"type":"string"},"id":{"type":"string","format":"uuid"},"pull_request_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"PullRequestPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PullRequestView"}},"total":{"type":"integer","format":"int64"}}},"PullRequestReviewView":{"type":"object","required":["id","pull_request_id","user_id","official","state","created_at"],"properties":{"commit_sha":{"type":["string","null"]},"content":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"official":{"type":"boolean"},"pull_request_id":{"type":"string","format":"uuid"},"state":{"$ref":"#/components/schemas/ReviewState"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"PullRequestView":{"type":"object","required":["id","repo_id","number","title","head_branch","base_branch","author_id","state","is_locked","has_merged","created_at","comments_count","reviews_count"],"properties":{"author_id":{"type":"string","format":"uuid"},"base_branch":{"type":"string"},"base_sha":{"type":["string","null"]},"body":{"type":["string","null"]},"closed_at":{"type":["string","null"]},"comments_count":{"type":"integer","format":"int64"},"created_at":{"type":"string"},"has_merged":{"type":"boolean"},"head_branch":{"type":"string"},"head_sha":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_locked":{"type":"boolean"},"mergeable":{"type":["boolean","null"]},"mergeable_state":{"type":["string","null"]},"merged_at":{"type":["string","null"]},"merged_commit_sha":{"type":["string","null"]},"merger_id":{"type":["string","null"]},"number":{"type":"integer","format":"int64"},"repo_id":{"type":"string","format":"uuid"},"reviews_count":{"type":"integer","format":"int64"},"state":{"$ref":"#/components/schemas/PrState"},"title":{"type":"string"},"updated_at":{"type":["string","null"]}}},"PushPlatform":{"type":"string","enum":["web_push","android_fcm","ios_apns"]},"PushSubscriptionView":{"type":"object","required":["id","platform","endpoint","created_at"],"properties":{"created_at":{"type":"string"},"endpoint":{"type":"string"},"id":{"type":"string","format":"uuid"},"platform":{"$ref":"#/components/schemas/PushPlatform"},"user_agent":{"type":["string","null"]}}},"ReactionAggView":{"type":"object","required":["emoji","count","user_ids"],"properties":{"count":{"type":"integer","format":"int64"},"emoji":{"type":"string"},"user_ids":{"type":"array","items":{"type":"string","format":"uuid"}}}},"ReactionScope":{"type":"string","enum":["issue","comment"]},"ReactionView":{"type":"object","required":["id","scope","target_id","user_id","emoji","created_at"],"properties":{"created_at":{"type":"string"},"emoji":{"type":"string"},"id":{"type":"string","format":"uuid"},"scope":{"$ref":"#/components/schemas/ReactionScope"},"target_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"RecentMentionView":{"type":"object","required":["id","channel_id","message_id","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"message_id":{"type":"string","format":"uuid"}}},"ReclaimCmd":{"type":"object","required":["email","pow"],"properties":{"email":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"}}},"ReclaimResp":{"type":"object","required":["sent","temp_key"],"properties":{"sent":{"type":"boolean"},"temp_key":{"$ref":"#/components/schemas/TempKey"}}},"RecoveryCodeView":{"type":"object","required":["id","created_at"],"properties":{"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"used_at":{"type":["string","null"]}}},"RefreshCmd":{"type":"object","required":["refresh_token"],"properties":{"app_id":{"type":["string","null"]},"refresh_token":{"type":"string"}}},"RefreshResp":{"type":"object","required":["access_token","refresh_token","token_type","expires_in"],"properties":{"access_token":{"type":"string"},"expires_in":{"type":"integer","format":"int64"},"refresh_token":{"type":"string"},"token_type":{"type":"string"}}},"RegenerateRecoveryResp":{"type":"object","required":["codes"],"properties":{"codes":{"type":"array","items":{"type":"string"}}}},"RegisterCmd":{"type":"object","required":["email","password","pow"],"properties":{"accept_agreements":{"type":"array","items":{"type":"string"}},"email":{"type":"string"},"password":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"},"username":{"type":["string","null"]}}},"RegisterResp":{"type":"object","required":["uid","pending","temp_key","purpose"],"properties":{"pending":{"type":"boolean"},"purpose":{"type":"string"},"temp_key":{"$ref":"#/components/schemas/TempKey"},"uid":{"type":"string"}}},"ReleaseAttachment":{"type":"object","required":["id","name","size","download_url","created_at"],"properties":{"created_at":{"type":"string"},"download_url":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"}}},"ReleaseAttachmentListResponse":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ReleaseAttachmentView"}}}},"ReleaseAttachmentView":{"type":"object","required":["id","name","size","download_url","created_at"],"properties":{"created_at":{"type":"string"},"download_url":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"}}},"ReleasePage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ReleaseView"}},"total":{"type":"integer","format":"int64"}}},"ReleaseView":{"type":"object","required":["id","repo_id","tag_name","target","title","sha","num_commits","is_draft","is_prerelease","is_tag","url","html_url","tarball_url","zipball_url","upload_url","publisher","attachments","created_at","updated_at"],"properties":{"attachments":{"type":"array","items":{"$ref":"#/components/schemas/ReleaseAttachment"}},"content":{"type":["string","null"]},"created_at":{"type":"string"},"html_url":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_draft":{"type":"boolean"},"is_prerelease":{"type":"boolean"},"is_tag":{"type":"boolean"},"num_commits":{"type":"integer","format":"int32"},"publisher":{"$ref":"#/components/schemas/UserSummary"},"repo_id":{"type":"string","format":"uuid"},"sha":{"type":"string"},"tag_name":{"type":"string"},"tarball_url":{"type":"string"},"target":{"type":"string"},"title":{"type":"string"},"updated_at":{"type":"string"},"upload_url":{"type":"string"},"url":{"type":"string"},"zipball_url":{"type":"string"}}},"RenameBranchOption":{"type":"object","required":["new_name"],"properties":{"new_name":{"type":"string"}}},"RenameRepoOption":{"type":"object","required":["new_name"],"properties":{"new_name":{"type":"string"}}},"RepoCollaboratorPermission":{"type":"object","required":["permission","role","user"],"properties":{"permission":{"type":"string"},"role":{"type":"string"},"user":{"$ref":"#/components/schemas/UserSummary"}}},"RepoPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/RepoView"}},"total":{"type":"integer","format":"int64"}}},"RepoRelView":{"type":"object","required":["id","issue_id","repo_id","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"},"repo_id":{"type":"string","format":"uuid"}}},"RepoSummary":{"type":"object","required":["id","name","full_name","empty","private","fork","template","mirror","size","stars_count","forks_count","watchers_count","open_issues_count"],"properties":{"description":{"type":["string","null"]},"empty":{"type":"boolean"},"fork":{"type":"boolean"},"forks_count":{"type":"integer","format":"int32"},"full_name":{"type":"string"},"id":{"type":"string","format":"uuid"},"mirror":{"type":"boolean"},"name":{"type":"string"},"open_issues_count":{"type":"integer","format":"int32"},"private":{"type":"boolean"},"size":{"type":"integer","format":"int64"},"stars_count":{"type":"integer","format":"int32"},"template":{"type":"boolean"},"watchers_count":{"type":"integer","format":"int32"}}},"RepoTopicOptions":{"type":"object","required":["topics"],"properties":{"topics":{"type":"array","items":{"type":"string"}}}},"RepoView":{"type":"object","required":["id","channel_id","space_id","name","lower_name","full_name","default_branch","enable_lfs","is_private","is_archived","is_fork","is_template","is_mirror","empty","size","git_size","lfs_size","nums_watch","nums_star","nums_pr","nums_commits","nums_branches","nums_tags","allow_rebase","allow_rebase_explicit","allow_squash_merge","allow_merge_commits","allow_fast_forward_only_merge","allow_rebase_update","allow_merge_update","allow_manual_merge","autodetect_manual_merge","default_delete_branch_after_merge","default_allow_maintainer_edit","ignore_whitespace_conflicts","object_format","has_code","has_issues","has_wiki","has_pull_requests","has_projects","has_releases","has_packages","has_actions","projects_mode","languages","licenses","topics","html_url","url","link","ssh_url","clone_url","created_at","updated_at"],"properties":{"allow_fast_forward_only_merge":{"type":"boolean"},"allow_manual_merge":{"type":"boolean"},"allow_merge_commits":{"type":"boolean"},"allow_merge_update":{"type":"boolean"},"allow_rebase":{"type":"boolean"},"allow_rebase_explicit":{"type":"boolean"},"allow_rebase_update":{"type":"boolean"},"allow_squash_merge":{"type":"boolean"},"archived_at":{"type":["string","null"]},"autodetect_manual_merge":{"type":"boolean"},"avatar_url":{"type":["string","null"]},"channel":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ChannelSummary"}]},"channel_id":{"type":"string","format":"uuid"},"clone_url":{"type":"string"},"created_at":{"type":"string"},"default_allow_maintainer_edit":{"type":"boolean"},"default_branch":{"type":"string"},"default_delete_branch_after_merge":{"type":"boolean"},"description":{"type":["string","null"]},"empty":{"type":"boolean"},"enable_lfs":{"type":"boolean"},"full_name":{"type":"string"},"git_size":{"type":"integer","format":"int64"},"has_actions":{"type":"boolean"},"has_code":{"type":"boolean"},"has_issues":{"type":"boolean"},"has_packages":{"type":"boolean"},"has_projects":{"type":"boolean"},"has_pull_requests":{"type":"boolean"},"has_releases":{"type":"boolean"},"has_wiki":{"type":"boolean"},"html_url":{"type":"string"},"id":{"type":"string","format":"uuid"},"ignore_whitespace_conflicts":{"type":"boolean"},"is_archived":{"type":"boolean"},"is_fork":{"type":"boolean"},"is_mirror":{"type":"boolean"},"is_private":{"type":"boolean"},"is_template":{"type":"boolean"},"languages":{"type":"array","items":{"type":"string"}},"last_pushed_at":{"type":["string","null"]},"lfs_size":{"type":"integer","format":"int64"},"license_name":{"type":["string","null"]},"licenses":{"type":"array","items":{"type":"string"}},"link":{"type":"string"},"lower_name":{"type":"string"},"name":{"type":"string"},"nums_branches":{"type":"integer","format":"int32"},"nums_commits":{"type":"integer","format":"int32"},"nums_pr":{"type":"integer","format":"int32"},"nums_star":{"type":"integer","format":"int32"},"nums_tags":{"type":"integer","format":"int32"},"nums_watch":{"type":"integer","format":"int32"},"object_format":{"type":"string"},"parent":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/RepoView"}]},"primary_language":{"type":["string","null"]},"projects_mode":{"type":"string"},"size":{"type":"integer","format":"int64"},"space":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SpaceSummary"}]},"space_id":{"type":"string","format":"uuid"},"ssh_url":{"type":"string"},"storage_limit_size":{"type":["integer","null"],"format":"int64"},"topics":{"type":"array","items":{"type":"string"}},"updated_at":{"type":"string"},"url":{"type":"string"},"website":{"type":["string","null"]}}},"ReportStatus":{"type":"string","enum":["open","under_review","resolved","dismissed"]},"ReportView":{"type":"object","required":["id","reported_uid","reason","status","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"evidence":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"reason":{"type":"string"},"reported_uid":{"type":"string","format":"uuid"},"reporter_uid":{"type":["string","null"],"format":"uuid"},"resolution_note":{"type":["string","null"]},"resolver_uid":{"type":["string","null"],"format":"uuid"},"status":{"$ref":"#/components/schemas/ReportStatus"},"updated_at":{"type":"string"}}},"RequestChangeBody":{"type":"object","required":["new_email"],"properties":{"new_email":{"type":"string"}}},"RequestDeletionCmd":{"type":"object","properties":{"reason":{"type":["string","null"]}}},"ResendCodeCmd":{"type":"object","required":["email","pow","purpose"],"properties":{"email":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"},"purpose":{"type":"string"}}},"ResendCodeResp":{"type":"object","required":["sent","temp_key"],"properties":{"sent":{"type":"boolean"},"temp_key":{"$ref":"#/components/schemas/TempKey"}}},"ResetPasswordCmd":{"type":"object","required":["email","token","new_password","temp_key_value"],"properties":{"email":{"type":"string"},"new_password":{"type":"string"},"temp_key_value":{"type":"string"},"token":{"type":"string"}}},"ResetPasswordResp":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"}}},"ReviewState":{"type":"string","enum":["approved","changes_requested","commented"]},"RevokeAllResp":{"type":"object","required":["revoked"],"properties":{"revoked":{"type":"integer","format":"int64","minimum":0}}},"RevokeSuspensionCmd":{"type":"object","properties":{"reason":{"type":["string","null"]}}},"RoleOverwriteView":{"type":"object","required":["id","space_id","channel_id","role_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"channel_id":{"type":"string","format":"uuid"},"deny_mask":{"type":"integer","format":"int64"},"id":{"type":"string","format":"uuid"},"role_id":{"type":"string","format":"uuid"},"space_id":{"type":"string","format":"uuid"}}},"RolePage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/RoleView"}},"total":{"type":"integer","format":"int64"}}},"RoleView":{"type":"object","required":["id","space_id","name","position","color","version","created_at","created_by","permissions"],"properties":{"color":{"type":"string"},"created_at":{"type":"string"},"created_by":{"type":"string","format":"uuid"},"icon_hash":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}},"position":{"type":"integer","format":"int64"},"space_id":{"type":"string","format":"uuid"},"unicode_emoji":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"version":{"type":"integer","format":"int32"}}},"SaveMessageCmd":{"type":"object","required":["channel_id","message_id"],"properties":{"channel_id":{"type":"string","format":"uuid"},"message_id":{"type":"string","format":"uuid"}}},"SavedMessageView":{"type":"object","required":["id","channel_id","message_id","saved_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"id":{"type":"string","format":"uuid"},"message_id":{"type":"string","format":"uuid"},"saved_at":{"type":"string"}}},"ScheduledMessageStatus":{"type":"string","enum":["pending","sent","cancelled"]},"ScheduledMessageView":{"type":"object","required":["id","target_channel_id","payload","scheduled_at","status","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"payload":{"type":"string"},"scheduled_at":{"type":"string"},"status":{"$ref":"#/components/schemas/ScheduledMessageStatus"},"target_channel_id":{"type":"string","format":"uuid"}}},"SearchResults":{"type":"object","required":["data","ok"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RepoSummary"}},"ok":{"type":"boolean"}}},"SessionKind":{"type":"string","enum":["web_login","bearer_access"]},"SessionView":{"type":"object","required":["id","kind","is_revoked","created_at","expires_at"],"properties":{"app_id":{"type":["string","null"]},"client_ip_hash":{"type":["string","null"]},"created_at":{"type":"string"},"expires_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_revoked":{"type":"boolean"},"kind":{"$ref":"#/components/schemas/SessionKind"},"replaced_at":{"type":["string","null"]},"user_agent_hash":{"type":["string","null"]}}},"SetPrimaryEmailResp":{"type":"object","required":["email"],"properties":{"email":{"$ref":"#/components/schemas/EmailView"}}},"SetRoleOverwriteCmd":{"type":"object","required":["role_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"deny_mask":{"type":"integer","format":"int64"},"role_id":{"type":"string","format":"uuid"}}},"SetUserOverwriteCmd":{"type":"object","required":["user_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"deny_mask":{"type":"integer","format":"int64"},"user_id":{"type":"string","format":"uuid"}}},"SpaceAllowJoinLevel":{"type":"string","enum":["none","need_mail_active","need_mail_active_and_last_one_mid","need_mail_active_and_last_one_hours","need_mail_active_and_phone_active"]},"SpaceBanPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SpaceBanView"}},"total":{"type":"integer","format":"int64"}}},"SpaceBanView":{"type":"object","required":["space_id","user_id","banned_by","created_at","updated_at","allow_agent_join","allow_speak","allow_push_repo","allow_comment_any"],"properties":{"allow_agent_join":{"type":"boolean"},"allow_comment_any":{"type":"boolean"},"allow_push_repo":{"type":"boolean"},"allow_speak":{"type":"boolean"},"banned_by":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"reason":{"type":["string","null"]},"space_id":{"type":"string","format":"uuid"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"SpaceInvitePage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SpaceInviteView"}},"total":{"type":"integer","format":"int64"}}},"SpaceInviteView":{"type":"object","required":["id","space_id","user_id","email","role_ids","created_at"],"properties":{"accepted_at":{"type":["string","null"]},"created_at":{"type":"string"},"email":{"type":"string"},"expires_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"revoked_at":{"type":["string","null"]},"role_ids":{"type":"array","items":{"type":"string","format":"uuid"}},"space_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"SpaceMemberPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SpaceMemberView"}},"total":{"type":"integer","format":"int64"}}},"SpaceMemberStatus":{"type":"string","enum":["active","inactive","left","removed"]},"SpaceMemberView":{"type":"object","required":["space_id","user_id","status","joined_at","created_at","message_notifications","muted","mobile_push","suppress_everyone","suppress_roles","hide_muted_channels"],"properties":{"alias_avatar_url":{"type":["string","null"]},"alias_name":{"type":["string","null"]},"created_at":{"type":"string"},"hide_muted_channels":{"type":"boolean"},"invited_at":{"type":["string","null"]},"invited_by":{"type":["string","null"],"format":"uuid"},"joined_at":{"type":"string"},"last_active_at":{"type":["string","null"]},"left_at":{"type":["string","null"]},"message_notifications":{"$ref":"#/components/schemas/MessageNotifications"},"mobile_push":{"type":"boolean"},"mute_until":{"type":["string","null"]},"muted":{"type":"boolean"},"space_id":{"type":"string","format":"uuid"},"status":{"$ref":"#/components/schemas/SpaceMemberStatus"},"suppress_everyone":{"type":"boolean"},"suppress_roles":{"type":"boolean"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"SpacePage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SpaceView"}},"total":{"type":"integer","format":"int64"}}},"SpaceSummary":{"type":"object","required":["id","name"],"properties":{"display_name":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"SpaceView":{"type":"object","required":["id","name","owner_id","public","is_active","allow_join","allow_invite","member_count","allow_join_level","member_must_enable_2fa","created_at","updated_at"],"properties":{"allow_invite":{"type":"boolean"},"allow_join":{"type":"boolean"},"allow_join_level":{"$ref":"#/components/schemas/SpaceAllowJoinLevel"},"avatar_url":{"type":["string","null"]},"created_at":{"type":"string"},"description":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"member_count":{"type":"integer","format":"int64"},"member_must_enable_2fa":{"type":"boolean"},"name":{"type":"string"},"owner_id":{"type":"string","format":"uuid"},"public":{"type":"boolean"},"updated_at":{"type":"string"},"welcome_message":{"type":["string","null"]}}},"SshKeyType":{"type":"string","enum":["ssh_rsa","ssh_ed25519","ecdsa_sha2_nistp256"]},"SshKeyView":{"type":"object","required":["id","name","key_type","fingerprint","created_at"],"properties":{"created_at":{"type":"string"},"fingerprint":{"type":"string"},"id":{"type":"string","format":"uuid"},"key_type":{"$ref":"#/components/schemas/SshKeyType"},"last_used_at":{"type":["string","null"]},"name":{"type":"string"}}},"StopwatchView":{"type":"object","required":["id","issue_id","user_id","started_at","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"},"started_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"SubmitPullRequestReviewOption":{"type":"object","required":["state"],"properties":{"commit_sha":{"type":["string","null"]},"content":{"type":["string","null"]},"state":{"$ref":"#/components/schemas/ReviewState"}}},"SubmitReportCmd":{"type":"object","required":["reported_uid","reason"],"properties":{"evidence":{"type":["string","null"]},"reason":{"type":"string"},"reported_uid":{"type":"string","format":"uuid"}}},"SubscriberPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SubscriberView"}},"total":{"type":"integer","format":"int64"}}},"SubscriberView":{"type":"object","required":["user_id","repo_id","mode","created_at"],"properties":{"created_at":{"type":"string"},"mode":{"type":"string"},"repo_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"Subscription":{"type":"object","required":["user_id","repo_id","mode","created_at"],"properties":{"created_at":{"type":"string"},"mode":{"type":"string"},"repo_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"SuspendCmd":{"type":"object","required":["suspension_type"],"properties":{"ends_at":{"type":["string","null"]},"reason":{"type":["string","null"]},"suspension_type":{"$ref":"#/components/schemas/SuspensionType"}}},"SuspensionType":{"type":"string","enum":["temporary","permanent"]},"SuspensionView":{"type":"object","required":["id","user_id","suspension_type","starts_at","created_at"],"properties":{"created_at":{"type":"string"},"ends_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"reason":{"type":["string","null"]},"revoked_at":{"type":["string","null"]},"revoked_by":{"type":["string","null"],"format":"uuid"},"starts_at":{"type":"string"},"suspended_by":{"type":["string","null"],"format":"uuid"},"suspension_type":{"$ref":"#/components/schemas/SuspensionType"},"user_id":{"type":"string","format":"uuid"}}},"SyncResult":{"type":"object","required":["repo_id","branches_added","tags_added","commits_added","size_bytes"],"properties":{"branches_added":{"type":"integer","format":"int64"},"commits_added":{"type":"integer","format":"int64"},"repo_id":{"type":"string","format":"uuid"},"size_bytes":{"type":"integer","format":"int64"},"tags_added":{"type":"integer","format":"int64"}}},"SyncStatus":{"type":"object","required":["repo_id","branches_total","tags_total","commits_total","size","synced_at"],"properties":{"branches_total":{"type":"integer","format":"int64"},"commits_total":{"type":"integer","format":"int64"},"last_pushed_at":{"type":["string","null"]},"primary_language":{"type":["string","null"]},"repo_id":{"type":"string","format":"uuid"},"size":{"type":"integer","format":"int64"},"synced_at":{"type":"string"},"tags_total":{"type":"integer","format":"int64"}}},"TagPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/TagView"}},"total":{"type":"integer","format":"int64"}}},"TagProtectionPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/TagProtectionView"}},"total":{"type":"integer","format":"int64"}}},"TagProtectionView":{"type":"object","required":["id","repo_id","name_pattern","whitelist_usernames","whitelist_teams","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"name_pattern":{"type":"string"},"repo_id":{"type":"string","format":"uuid"},"updated_at":{"type":"string"},"whitelist_teams":{"type":"array","items":{"type":"string"}},"whitelist_usernames":{"type":"array","items":{"type":"string"}}}},"TagView":{"type":"object","required":["id","repo_id","name","tag_type","commit_sha","commit","message","zipball_url","tarball_url","created_at"],"properties":{"commit":{"$ref":"#/components/schemas/CommitMeta"},"commit_sha":{"type":"string"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"message":{"type":"string"},"name":{"type":"string"},"repo_id":{"type":"string","format":"uuid"},"tag_type":{"type":"string"},"tarball_url":{"type":"string"},"zipball_url":{"type":"string"}}},"TempKey":{"type":"object","required":["name","value","ttl_seconds","secure","http_only","same_site"],"properties":{"domain":{"type":["string","null"]},"http_only":{"type":"boolean"},"name":{"type":"string"},"path":{"type":["string","null"]},"same_site":{"type":"string"},"secure":{"type":"boolean"},"ttl_seconds":{"type":"integer","format":"int64","minimum":0},"value":{"type":"string"}}},"TopicList":{"type":"object","required":["topics"],"properties":{"topics":{"type":"array","items":{"type":"string"}}}},"TopicSearchQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0},"q":{"type":["string","null"]}}},"TopicSearchResult":{"type":"object","required":["topics"],"properties":{"topics":{"type":"array","items":{"$ref":"#/components/schemas/TopicView"}}}},"TopicView":{"type":"object","required":["id","name","repo_count","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"repo_count":{"type":"integer","format":"int32"},"updated_at":{"type":"string"}}},"TrackedTimePage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/TrackedTimeView"}},"total":{"type":"integer","format":"int64"}}},"TrackedTimeView":{"type":"object","required":["id","issue_id","user_id","seconds","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"},"seconds":{"type":"integer","format":"int64"},"user_id":{"type":"string","format":"uuid"}}},"TransferRepoOption":{"type":"object","required":["new_channel_id"],"properties":{"new_channel_id":{"type":"string","format":"uuid"},"new_name":{"type":["string","null"]}}},"TreeEntryView":{"type":"object","required":["path","mode","type_","sha"],"properties":{"mode":{"type":"string"},"path":{"type":"string"},"sha":{"type":"string"},"size":{"type":["integer","null"],"format":"int64"},"type_":{"type":"string"}}},"TreeView":{"type":"object","required":["sha","entries"],"properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/TreeEntryView"}},"sha":{"type":"string"}}},"UnassignRoleCmd":{"type":"object","required":["role_id"],"properties":{"role_id":{"type":"string","format":"uuid"}}},"UnreadCountResp":{"type":"object","required":["count"],"properties":{"count":{"type":"integer","format":"int64"}}},"UpdateAvatarOption":{"type":"object","required":["image"],"properties":{"image":{"type":"string"}}},"UpdateBanCmd":{"type":"object","properties":{"allow_agent_join":{"type":["boolean","null"]},"allow_comment_any":{"type":["boolean","null"]},"allow_push_repo":{"type":["boolean","null"]},"allow_speak":{"type":["boolean","null"]},"expires_at":{"type":["string","null"]},"reason":{"type":["string","null"]}}},"UpdateBranchOption":{"type":"object","required":["new_commit_id"],"properties":{"force":{"type":["boolean","null"]},"new_commit_id":{"type":"string"},"old_commit_id":{"type":["string","null"]}}},"UpdateBranchProtectionPriorities":{"type":"object","required":["ids"],"properties":{"ids":{"type":"array","items":{"type":"string","format":"uuid"}}}},"UpdateCollectionOption":{"type":"object","properties":{"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"name":{"type":["string","null"]}}},"UpdateCommentOption":{"type":"object","required":["content"],"properties":{"content":{"type":"string"}}},"UpdateDeviceCmd":{"type":"object","properties":{"device_name":{"type":["string","null"]},"is_trusted":{"type":["boolean","null"]}}},"UpdateDocumentCmd":{"type":"object","properties":{"content":{"type":["string","null"]},"icon":{"type":["string","null"]},"parent_id":{"type":["string","null"],"format":"uuid"},"slug":{"type":["string","null"]},"title":{"type":["string","null"]}}},"UpdateFileOption":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["content"],"properties":{"content":{"type":"string"},"from_path":{"type":["string","null"]},"sha":{"type":["string","null"]}}}]},"UpdateIssueOption":{"type":"object","properties":{"body":{"type":["string","null"]},"description":{"type":["string","null"]},"milestone_id":{"type":["string","null"],"format":"uuid"},"title":{"type":["string","null"]}}},"UpdateIssueUserOption":{"type":"object","properties":{"is_mentioned":{"type":["boolean","null"]},"is_read":{"type":["boolean","null"]}}},"UpdateLabelOption":{"type":"object","properties":{"color":{"type":["string","null"]},"description":{"type":["string","null"]},"exclusive":{"type":["boolean","null"]},"exclusive_order":{"type":["integer","null"],"format":"int32"},"is_archived":{"type":["boolean","null"]},"name":{"type":["string","null"]}}},"UpdateMemberCmd":{"type":"object","required":["role"],"properties":{"role":{"$ref":"#/components/schemas/MemberRole"}}},"UpdateMilestoneOption":{"type":"object","properties":{"description":{"type":["string","null"]},"due_at":{"type":["string","null"]},"is_closed":{"type":["boolean","null"]},"name":{"type":["string","null"]}}},"UpdatePreferencesCmd":{"type":"object","properties":{"allow_dms_from":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Audience"}]},"allow_mentions_from":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Audience"}]},"diff_view_style":{"type":["string","null"]},"email_digest":{"type":["boolean","null"]},"email_flags":{"type":["integer","null"],"format":"int32"},"in_app_flags":{"type":["integer","null"],"format":"int32"},"mute_until":{"type":["string","null"]},"push_flags":{"type":["integer","null"],"format":"int32"},"show_online_status":{"type":["boolean","null"]},"theme_mode":{"type":["string","null"]},"theme_token":{"type":["string","null"]},"theme_version":{"type":["integer","null"],"format":"int64"}}},"UpdateProfileCmd":{"type":"object","properties":{"avatar":{"type":["string","null"]},"display_name":{"type":["string","null"]},"language":{"type":["string","null"]},"locale":{"type":["string","null"]},"profile":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/UpdateProfileFields"}]},"timezone":{"type":["string","null"]},"visibility":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProfileVisibility"}]}}},"UpdateProfileFields":{"type":"object","properties":{"accent_color":{"type":["string","null"]},"banner_color":{"type":["integer","null"],"format":"int32"},"banner_url":{"type":["string","null"]},"bio":{"type":["string","null"]},"company":{"type":["string","null"]},"date_of_birth":{"type":["string","null"],"format":"date"},"location":{"type":["string","null"]},"pronouns":{"type":["string","null"]},"pronouns_privacy":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProfileVisibility"}]},"real_name":{"type":["string","null"]},"show_activity":{"type":["boolean","null"]},"show_email":{"type":["boolean","null"]},"show_location":{"type":["boolean","null"]},"show_real_name":{"type":["boolean","null"]},"website":{"type":["string","null"]}}},"UpdateProjectCmd":{"type":"object","properties":{"color":{"type":["string","null"]},"description":{"type":["string","null"]},"health":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProjectHealth"}]},"icon":{"type":["string","null"]},"lead_id":{"type":["string","null"],"format":"uuid"},"name":{"type":["string","null"]},"sort_order":{"type":["integer","null"],"format":"int32"},"state":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProjectState"}]},"target_date":{"type":["string","null"],"format":"date"}}},"UpdatePullRequestOption":{"type":"object","properties":{"base":{"type":["string","null"]},"body":{"type":["string","null"]},"head":{"type":["string","null"]},"title":{"type":["string","null"]}}},"UpdateRepoOption":{"type":"object","properties":{"allow_fast_forward_only_merge":{"type":["boolean","null"]},"allow_manual_merge":{"type":["boolean","null"]},"allow_merge_commits":{"type":["boolean","null"]},"allow_merge_update":{"type":["boolean","null"]},"allow_rebase":{"type":["boolean","null"]},"allow_rebase_explicit":{"type":["boolean","null"]},"allow_rebase_update":{"type":["boolean","null"]},"allow_squash_merge":{"type":["boolean","null"]},"archived":{"type":["boolean","null"]},"autodetect_manual_merge":{"type":["boolean","null"]},"default_allow_maintainer_edit":{"type":["boolean","null"]},"default_branch":{"type":["string","null"]},"default_delete_branch_after_merge":{"type":["boolean","null"]},"default_merge_style":{"type":["string","null"]},"default_update_style":{"type":["string","null"]},"description":{"type":["string","null"]},"enable_lfs":{"type":["boolean","null"]},"external_tracker":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExternalTracker"}]},"external_wiki":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExternalWiki"}]},"has_actions":{"type":["boolean","null"]},"has_code":{"type":["boolean","null"]},"has_issues":{"type":["boolean","null"]},"has_packages":{"type":["boolean","null"]},"has_projects":{"type":["boolean","null"]},"has_pull_requests":{"type":["boolean","null"]},"has_releases":{"type":["boolean","null"]},"has_wiki":{"type":["boolean","null"]},"ignore_whitespace_conflicts":{"type":["boolean","null"]},"internal_tracker":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/InternalTracker"}]},"is_private":{"type":["boolean","null"]},"license_name":{"type":["string","null"]},"name":{"type":["string","null"]},"projects_mode":{"type":["string","null"]},"template":{"type":["boolean","null"]},"website":{"type":["string","null"]}}},"UpdateReportCmd":{"type":"object","required":["status"],"properties":{"resolution_note":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/ReportStatus"}}},"UpdateRoleCmd":{"type":"object","properties":{"color":{"type":["string","null"]},"icon_hash":{"type":["string","null"]},"name":{"type":["string","null"]},"permissions":{"type":["array","null"],"items":{"type":"string"}},"position":{"type":["integer","null"],"format":"int64"},"unicode_emoji":{"type":["string","null"]}}},"UpdateSpaceCmd":{"type":"object","properties":{"allow_invite":{"type":["boolean","null"]},"allow_join":{"type":["boolean","null"]},"allow_join_level":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SpaceAllowJoinLevel"}]},"avatar_url":{"type":["string","null"]},"description":{"type":["string","null"]},"member_must_enable_2fa":{"type":["boolean","null"]},"name":{"type":["string","null"]},"public":{"type":["boolean","null"]},"welcome_message":{"type":["string","null"]}}},"UpdateViewCmd":{"type":"object","properties":{"description":{"type":["string","null"]},"filter":{},"group_by":{"type":["string","null"]},"is_shared":{"type":["boolean","null"]},"layout":{"type":["string","null"]},"name":{"type":["string","null"]},"sort_by":{"type":["string","null"]}}},"UploadAttachmentInput":{"type":"object","required":["filename","content_type","data"],"properties":{"content_type":{"type":"string"},"data":{"type":"array","items":{"type":"integer","format":"int32","minimum":0}},"filename":{"type":"string"}}},"UploadAvatarCmd":{"type":"object","required":["content_type","data_base64"],"properties":{"content_type":{"type":"string"},"data_base64":{"type":"string"}}},"UpsertMemeCmd":{"type":"object","required":["name","content_type","url","size"],"properties":{"content_type":{"type":"string"},"height":{"type":["integer","null"],"format":"int32"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"},"url":{"type":"string"},"width":{"type":["integer","null"],"format":"int32"}}},"UpsertPushCmd":{"type":"object","required":["endpoint","p256dh_key","auth_key","platform"],"properties":{"auth_key":{"type":"string"},"endpoint":{"type":"string"},"p256dh_key":{"type":"string"},"platform":{"$ref":"#/components/schemas/PushPlatform"},"user_agent":{"type":["string","null"]}}},"UpsertWatchOption":{"type":"object","required":["mode"],"properties":{"mode":{"type":"string"}}},"UserMe":{"type":"object","required":["uid","username","display_name","avatar","is_active","is_admin","is_restricted"],"properties":{"avatar":{"type":"string"},"display_name":{"type":"string"},"is_active":{"type":"boolean"},"is_admin":{"type":"boolean"},"is_restricted":{"type":"boolean"},"language":{"type":["string","null"]},"locale":{"type":["string","null"]},"timezone":{"type":["string","null"]},"uid":{"type":"string"},"username":{"type":"string"}}},"UserMini":{"type":"object","required":["id","login"],"properties":{"avatar_url":{"type":["string","null"]},"email":{"type":["string","null"]},"full_name":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"login":{"type":"string"}}},"UserOverwriteView":{"type":"object","required":["channel_id","user_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"channel_id":{"type":"string","format":"uuid"},"deny_mask":{"type":"integer","format":"int64"},"user_id":{"type":"string","format":"uuid"}}},"UserPreferences":{"type":"object","required":["user_id","theme_mode","in_app_flags","email_flags","push_flags","email_digest","allow_dms_from","allow_mentions_from","show_online_status","created_at","updated_at"],"properties":{"allow_dms_from":{"$ref":"#/components/schemas/Audience"},"allow_mentions_from":{"$ref":"#/components/schemas/Audience"},"created_at":{"type":"string"},"diff_view_style":{"type":["string","null"]},"email_digest":{"type":"boolean"},"email_flags":{"type":"integer","format":"int32"},"in_app_flags":{"type":"integer","format":"int32"},"mute_until":{"type":["string","null"]},"push_flags":{"type":"integer","format":"int32"},"show_online_status":{"type":"boolean"},"theme_mode":{"type":"string"},"theme_token":{"type":["string","null"]},"theme_version":{"type":["integer","null"],"format":"int64"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"UserPublic":{"type":"object","required":["uid","username","display_name","avatar"],"properties":{"avatar":{"type":"string"},"display_name":{"type":"string"},"language":{"type":["string","null"]},"locale":{"type":["string","null"]},"timezone":{"type":["string","null"]},"uid":{"type":"string"},"username":{"type":"string"}}},"UserSummary":{"type":"object","required":["id","name","login"],"properties":{"email":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"login":{"type":"string"},"name":{"type":"string"}}},"VerifyCodeCmd":{"type":"object","required":["email","purpose","code","temp_key_value"],"properties":{"code":{"type":"string"},"email":{"type":"string"},"purpose":{"type":"string"},"temp_key_value":{"type":"string"},"user_id":{"type":["string","null"]}}},"VerifyCodeResult":{"type":"object","required":["code_row_id"],"properties":{"code_row_id":{"type":"string"}}},"ViewPage":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ViewView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"ViewView":{"type":"object","required":["id","project_id","creator_id","name","filter","sort_by","layout","is_shared","sort_order","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"creator_id":{"type":"string","format":"uuid"},"description":{"type":["string","null"]},"filter":{},"group_by":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_shared":{"type":"boolean"},"layout":{"type":"string"},"name":{"type":"string"},"project_id":{"type":"string","format":"uuid"},"sort_by":{"type":"string"},"sort_order":{"type":"integer","format":"int32"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"WatchView":{"type":"object","required":["id","user_id","mode","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":["string","null"],"format":"uuid"},"mode":{"type":"string"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}}}},"tags":[{"name":"auth","description":"Authentication endpoints"},{"name":"issues","description":"Issue tracking (lib/issues)"},{"name":"project","description":"Project lifecycle, members, views, documents, links, favorites, activities."},{"name":"repo","description":"Repository service (lib/repo)"},{"name":"space","description":"Space, membership, roles, invites, bans, channels, channel members and overwrite endpoints."},{"name":"user","description":"User profile, account, sessions and notifications endpoints."}]}
No newline at end of file
1{"openapi":"3.1.0","info":{"title":"Untitled API","description":"Unified HTTP API for the untitled platform","license":{"name":""},"version":"1.94.0"},"paths":{"/api/v1/auth/agreements":{"get":{"tags":["auth"],"operationId":"handler","responses":{"200":{"description":"List of agreement documents (terms, privacy).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_AgreementDoc"}}}}}}},"/api/v1/auth/agreements/accept":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AcceptAgreementCmd"}}},"required":true},"responses":{"200":{"description":"Agreement acceptance recorded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_AcceptAgreementResp"}}}},"400":{"description":"Unknown agreement key or version mismatch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"Missing or invalid access token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"User not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/auth/email/reclaim":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ReclaimCmd"}}},"required":true},"responses":{"200":{"description":"A Signup verification code was issued to the mailbox if the account is inactive; otherwise a constant-shaped no-op is returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReclaimResp"}}}},"400":{"description":"Validation / PoW failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/email/resend":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ResendCodeCmd"}}},"required":true},"responses":{"200":{"description":"New code issued (or silently no-op if the email is unknown).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ResendCodeResp"}}}},"400":{"description":"Validation / PoW failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/email/verify":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_VerifyCodeCmd"}}},"required":true},"responses":{"200":{"description":"Code verified; the verification-code row id is returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_VerifyCodeResult"}}}},"400":{"description":"Invalid code, missing temp_key cookie, or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_LoginCmd"}}},"required":true},"responses":{"200":{"description":"Authenticated. Returns access/refresh tokens and a public user view.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LoginResp"}}}},"400":{"description":"Validation / PoW failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"Invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"Account forbidden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_LogoutCmd"}}},"required":true},"responses":{"200":{"description":"Refresh token revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LogoutResp"}}}},"401":{"description":"Invalid or expired refresh token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/me":{"get":{"tags":["auth"],"operationId":"handler","responses":{"200":{"description":"Authenticated user profile (full view, including privileged fields).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UserMe"}}}},"401":{"description":"Missing or invalid access token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"User not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/auth/oauth/authorize":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AuthorizeCmd"}}},"required":true},"responses":{"200":{"description":"Authorization URL. The state-cookie carries the OAuth state value for the callback.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_AuthorizationUrlResp"}}}},"400":{"description":"Validation / PoW failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"Unknown provider.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/oauth/callback":{"get":{"tags":["auth"],"operationId":"handler","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OAuthProvider"}},{"name":"code","in":"path","required":true,"schema":{"type":"string"}},{"name":"state","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OAuth login completed. Returns token pair and the resolved user_id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_OAuthLoginResp"}}}},"400":{"description":"Missing state cookie or invalid state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"OAuth flow rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/oauth/providers":{"get":{"tags":["auth"],"operationId":"handler","responses":{"200":{"description":"List of enabled OAuth providers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_OAuthProviderInfo"}}}}}}},"/api/v1/auth/password/forgot":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ForgotPasswordCmd"}}},"required":true},"responses":{"200":{"description":"Request accepted. The response shape is constant whether or not the email is known; the temp_key cookie carries the token for the subsequent reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ForgotPasswordResp"}}}},"400":{"description":"Validation / PoW failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/password/reset":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ResetPasswordCmd"}}},"required":true},"responses":{"200":{"description":"Password updated; all sessions revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ResetPasswordResp"}}}},"400":{"description":"Missing temp_key cookie, weak password, or invalid token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/pow/challenge":{"get":{"tags":["auth"],"operationId":"handler","responses":{"200":{"description":"A fresh PoW challenge bound to this client.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PowChallengeResp"}}}},"400":{"description":"PoW not configured.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/refresh":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_RefreshCmd"}}},"required":true},"responses":{"200":{"description":"Rotated token pair.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RefreshResp"}}}},"401":{"description":"Invalid or expired refresh token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/auth/register":{"post":{"tags":["auth"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_RegisterCmd"}}},"required":true},"responses":{"200":{"description":"Account created (possibly pending email verification).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RegisterResp"}}}},"400":{"description":"Validation / PoW failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"Email or username already taken.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/health/live":{"get":{"tags":["system"],"operationId":"liveness","responses":{"200":{"description":"Process is alive","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthStatus"}}}}}}},"/api/v1/health/ready":{"get":{"tags":["system"],"operationId":"readiness","responses":{"200":{"description":"Service is ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthStatus"}}}}}}},"/api/v1/issues":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"q","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List issue boards (collections)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_CollectionView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateCollectionOption"}}},"required":true},"responses":{"201":{"description":"Create an issue board (collection)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CollectionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"Default issue board OR issue list (when query.state/q/author_id/milestone_id is set)"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateIssueOption"}}},"required":true},"responses":{"201":{"description":"Create an issue in this channel's board","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_IssueView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete default issue board"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateCollectionOption"}}},"required":true},"responses":{"200":{"description":"Update default issue board","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CollectionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/attachments/{owner_type}/{owner_id}":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List attachments"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UploadAttachmentInput"}}},"required":true},"responses":{"201":{"description":"Upload attachment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_AttachmentView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/attachments/{owner_type}/{owner_id}/{att_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete attachment"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/labels":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"q","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"is_archived","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List labels"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateLabelOption"}}},"required":true},"responses":{"201":{"description":"Create label","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LabelView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/labels/{label_id}":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"Get label","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LabelView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete label"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateLabelOption"}}},"required":true},"responses":{"200":{"description":"Update label","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LabelView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/milestones":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"is_closed","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"q","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List milestones"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateMilestoneOption"}}},"required":true},"responses":{"201":{"description":"Create milestone","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MilestoneView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/milestones/{milestone_id}":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"Get milestone","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MilestoneView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete milestone"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateMilestoneOption"}}},"required":true},"responses":{"200":{"description":"Update milestone","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MilestoneView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/pins":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"List pinned issues"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreatePinOption"}}},"required":true},"responses":{"201":{"description":"Pin issue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PinView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/pins/{pin_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Unpin issue"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"Get issue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_IssueView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete issue"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateIssueOption"}}},"required":true},"responses":{"200":{"description":"Update issue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_IssueView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/close":{"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CloseIssueOption"}}},"required":true},"responses":{"200":{"description":"Open/close issue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_IssueView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/comments":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"parent_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List comments"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateCommentOption"}}},"required":true},"responses":{"201":{"description":"Create comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommentView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/comments/{comment_id}":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"Get comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommentView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete comment"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateCommentOption"}}},"required":true},"responses":{"200":{"description":"Update comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommentView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/comments/{comment_id}/reactions":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"List comment reactions"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateReactionOption"}}},"required":true},"responses":{"201":{"description":"React to comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReactionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/content_history":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"comment_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List content history"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/dependencies":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"List dependencies"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateDependencyOption"}}},"required":true},"responses":{"201":{"description":"Create dependency","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DependencyView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/dependencies/{dep_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete dependency"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/events":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List issue events"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/labels":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"List labels for issue"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/labels/{label_id}":{"post":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Bind label to issue"}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Unbind label from issue"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/members":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List members"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateMemberOption"}}},"required":true},"responses":{"201":{"description":"Create member","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MemberView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/members/{member_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete member"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/reactions":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"List issue reactions"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateReactionOption"}}},"required":true},"responses":{"201":{"description":"React to issue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReactionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/reactions/{reaction_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete reaction"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/repo_relations":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"List repo relations"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateRepoRelOption"}}},"required":true},"responses":{"201":{"description":"Link repo to issue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoRelView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/repo_relations/{rel_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Unlink repo from issue"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/stopwatch":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"Get my stopwatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_StopwatchView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["issues"],"operationId":"handler","responses":{"201":{"description":"Start stopwatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_StopwatchView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Stop stopwatch"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/tracked_time":{"get":{"tags":["issues"],"operationId":"handler","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List tracked time"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/users":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"List issue users"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/users/{uid}":{"patch":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateIssueUserOption"}}},"required":true},"responses":{"200":{"description":"Update issue user","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_IssueUserView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{space_name}/{issue_id}/watch":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"Get my watch state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_WatchView"}}}}},"security":[{"bearer_auth":[]}]},"put":{"tags":["issues"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpsertWatchOption"}}},"required":true},"responses":{"200":{"description":"Upsert watch state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_WatchView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete watch state"}},"security":[{"bearer_auth":[]}]}},"/api/v1/posts/{space_name}":{"get":{"tags":["posts"],"operationId":"handler","responses":{"200":{"description":"Posts board view OR post list (when query.status/q/author_id is set)"}},"security":[{"bearer_auth":[]}]},"post":{"tags":["posts"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreatePostOption"}}},"required":true},"responses":{"201":{"description":"Create a post (thread)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PostView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/posts/{space_name}/boards":{"post":{"tags":["posts"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreatePostBoardOption"}}},"required":true},"responses":{"201":{"description":"Create a posts board (collection)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PostBoardView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/posts/{space_name}/labels":{"get":{"tags":["posts"],"operationId":"handler","parameters":[{"name":"q","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"is_archived","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List board labels","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PostLabelPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["posts"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreatePostLabelOption"}}},"required":true},"responses":{"201":{"description":"Create a board label","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PostLabelView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/posts/{space_name}/labels/{label_id}":{"get":{"tags":["posts"],"operationId":"handler","responses":{"200":{"description":"Get a board label","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PostLabelView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["posts"],"operationId":"handler","responses":{"200":{"description":"Delete a board label"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["posts"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdatePostLabelOption"}}},"required":true},"responses":{"200":{"description":"Update a board label","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PostLabelView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/posts/{space_name}/{number}":{"get":{"tags":["posts"],"operationId":"handler","responses":{"200":{"description":"Get a post","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PostView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["posts"],"operationId":"handler","responses":{"200":{"description":"Delete a post"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["posts"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdatePostOption"}}},"required":true},"responses":{"200":{"description":"Update a post","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PostView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/posts/{space_name}/{number}/archive":{"post":{"tags":["posts"],"operationId":"handler","responses":{"200":{"description":"Archive a post","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PostView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/posts/{space_name}/{number}/close":{"post":{"tags":["posts"],"operationId":"handler","responses":{"200":{"description":"Close a post","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PostView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/posts/{space_name}/{number}/labels":{"get":{"tags":["posts"],"operationId":"handler","responses":{"200":{"description":"List labels bound to a post","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_PostLabelView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/posts/{space_name}/{number}/labels/{label_id}":{"post":{"tags":["posts"],"operationId":"handler","responses":{"200":{"description":"Bind a label to a post"}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["posts"],"operationId":"handler","responses":{"200":{"description":"Unbind a label from a post"}},"security":[{"bearer_auth":[]}]}},"/api/v1/posts/{space_name}/{number}/mentions":{"get":{"tags":["posts"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List mentions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_PostMentionView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["posts"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateMentionOption"}}},"required":true},"responses":{"201":{"description":"Mention a user/role in a post","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PostMentionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/posts/{space_name}/{number}/reactions":{"get":{"tags":["posts"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List reactions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_PostReactionView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["posts"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreatePostReactionOption"}}},"required":true},"responses":{"201":{"description":"React to a post","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PostReactionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/posts/{space_name}/{number}/reactions/{reaction_id}":{"delete":{"tags":["posts"],"operationId":"handler","responses":{"200":{"description":"Remove a reaction"}},"security":[{"bearer_auth":[]}]}},"/api/v1/posts/{space_name}/{number}/reopen":{"post":{"tags":["posts"],"operationId":"handler","responses":{"200":{"description":"Reopen a post","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PostView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/posts/{space_name}/{number}/replies":{"get":{"tags":["posts"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List replies","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PostReplyPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["posts"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateReplyOption"}}},"required":true},"responses":{"201":{"description":"Create a reply","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PostReplyView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/posts/{space_name}/{number}/watch":{"get":{"tags":["posts"],"operationId":"handler","responses":{"200":{"description":"Get my watch state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PostWatchView"}}}}},"security":[{"bearer_auth":[]}]},"put":{"tags":["posts"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpsertPostWatchOption"}}},"required":true},"responses":{"200":{"description":"Upsert watch state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PostWatchView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["posts"],"operationId":"handler","responses":{"200":{"description":"Delete my watch state"}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"List projects","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ProjectPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateProjectCmd"}}},"required":true},"responses":{"201":{"description":"Create a project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ProjectView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"Get a project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ProjectView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["project"],"operationId":"handler","responses":{"204":{"description":"Delete a project"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateProjectCmd"}}},"required":true},"responses":{"200":{"description":"Update a project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ProjectView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/activities":{"get":{"tags":["project"],"operationId":"handler","parameters":[{"name":"verb","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"page","in":"path","required":true,"schema":{"type":"integer","format":"int64","minimum":0}},{"name":"per_page","in":"path","required":true,"schema":{"type":"integer","format":"int64","minimum":0}}],"responses":{"200":{"description":"List activities","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ActivityPage"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/documents":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"List documents","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DocumentPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateDocumentCmd"}}},"required":true},"responses":{"201":{"description":"Create a document","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DocumentView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/documents/{doc_id}":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"Get a document","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DocumentView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["project"],"operationId":"handler","responses":{"204":{"description":"Delete a document"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateDocumentCmd"}}},"required":true},"responses":{"200":{"description":"Update a document","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DocumentView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/favorites":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"List favorites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_FavoritePage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AddFavoriteCmd"}}},"required":true},"responses":{"201":{"description":"Add a favorite","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_FavoriteView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/favorites/{favorite_id}":{"delete":{"tags":["project"],"operationId":"handler","responses":{"204":{"description":"Remove a favorite"}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/links":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"List links","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LinkPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AddLinkCmd"}}},"required":true},"responses":{"201":{"description":"Add a link","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LinkView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/links/{link_id}":{"delete":{"tags":["project"],"operationId":"handler","responses":{"204":{"description":"Remove a link"}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/members":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"List members","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MemberPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AddMemberCmd"}}},"required":true},"responses":{"201":{"description":"Add a member","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MemberView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/members/{user_id}":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"Get a member","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MemberView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["project"],"operationId":"handler","responses":{"204":{"description":"Remove a member"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateMemberCmd"}}},"required":true},"responses":{"200":{"description":"Update a member","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MemberView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/views":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"List views","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ViewPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateViewCmd"}}},"required":true},"responses":{"201":{"description":"Create a view","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ViewView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/projects/{space_name}/{project_id}/views/{view_id}":{"get":{"tags":["project"],"operationId":"handler","responses":{"200":{"description":"Get a view","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ViewView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["project"],"operationId":"handler","responses":{"204":{"description":"Delete a view"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["project"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateViewCmd"}}},"required":true},"responses":{"200":{"description":"Update a view","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ViewView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"owner_user_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"is_private","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"is_archived","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"q","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List repositories","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateRepoOption"}}},"required":true},"responses":{"201":{"description":"Create a repository","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/search":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"q","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"topic","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"include_desc","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"uid","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"priority_owner_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"team_id","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64"}},{"name":"starred_by","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"private","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"is_private","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"template","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"archived","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"mode","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"exclusive","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"sort","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"order","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"Search repositories","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SearchResults"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a repository","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Delete a repository"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateRepoOption"}}},"required":true},"responses":{"200":{"description":"Update a repository","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/archive":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ArchiveRepoOption"}}},"required":true},"responses":{"200":{"description":"Archive / unarchive a repository","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/archive/{archive_format}/{ref_name}":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"format","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"ref_name","in":"path","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Download an archive"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/assignees/{assignee}":{"get":{"tags":["repo"],"operationId":"check_handler","responses":{"204":{"description":"User is a valid assignee"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/avatar":{"post":{"tags":["repo"],"operationId":"post_handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateAvatarOption"}}},"required":true},"responses":{"204":{"description":"Update repo avatar"}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"delete_handler","responses":{"204":{"description":"Delete repo avatar"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/branch_protections":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List branch protections","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchProtectionPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateBranchProtectionOption"}}},"required":true},"responses":{"201":{"description":"Create a branch protection","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchProtectionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/branch_protections/priority":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateBranchProtectionPriorities"}}},"required":true},"responses":{"204":{"description":"Update branch protection priorities"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/branch_protections/{policy_id}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a branch protection","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchProtectionView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Delete a branch protection"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_EditBranchProtectionOption"}}},"required":true},"responses":{"200":{"description":"Edit a branch protection","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchProtectionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/branches":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"keyword","in":"path","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"List branches","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateBranchOption"}}},"required":true},"responses":{"201":{"description":"Create a branch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/branches/{branch_name}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a branch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchView"}}}}},"security":[{"bearer_auth":[]}]},"put":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateBranchOption"}}},"required":true},"responses":{"200":{"description":"Update a branch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Delete a branch"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/branches/{branch_name}/rename":{"patch":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_RenameBranchOption"}}},"required":true},"responses":{"200":{"description":"Rename a branch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BranchView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/collaborators":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List collaborators","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CollaboratorPage"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/collaborators/{user_id}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"User is a collaborator"}},"security":[{"bearer_auth":[]}]},"put":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AddCollaboratorOption"}}},"required":true},"responses":{"204":{"description":"Add or update a collaborator"}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Remove a collaborator"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/collaborators/{user_id}/permission":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get collaborator permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoCollaboratorPermission"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/commits":{"get":{"tags":["repo"],"operationId":"list_handler","parameters":[{"name":"sha","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"path","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"since","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"until","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"stat","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"verification","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"files","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"not","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List commits","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommitsResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/commits/{ref}/status":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get combined status by ref","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CombinedStatusView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/commits/{ref}/statuses":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"sort","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"state","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List commit statuses by ref","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommitStatusPage"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/compare/{base}...{head}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Compare two refs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CompareView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/contents":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"List contents at root","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ContentsListResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/contents-ext":{"get":{"tags":["repo"],"operationId":"list_handler","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"List contents (ext form)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentsExtResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/contents-ext/{path:path}":{"get":{"tags":["repo"],"operationId":"get_handler","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Get contents (ext form)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentsExtResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/contents/change":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ChangeFilesOptions"}}},"required":true},"responses":{"200":{"description":"Multi-file change","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ContentsListResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/contents/{path}":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Get a file or directory","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ContentsResponse"}}}}},"security":[{"bearer_auth":[]}]},"put":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateFileOption"}}},"required":true},"responses":{"200":{"description":"Update a file","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ContentsResponse"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateFileOption"}}},"required":true},"responses":{"201":{"description":"Create a file","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ContentsResponse"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_DeleteFileOption"}}},"required":true},"responses":{"204":{"description":"Delete a file"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/diffpatch":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ApplyDiffPatchFileOptions"}}},"required":true},"responses":{"200":{"description":"Apply a diff patch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ContentsResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/editorconfig/{filename:path}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get EditorConfig","content":{"text/plain":{}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/file-contents":{"get":{"tags":["repo"],"operationId":"get_handler","responses":{"200":{"description":"Batch read files","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_FilesResponse"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"post_handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_Vec_String"}}},"required":true},"responses":{"200":{"description":"Batch read files","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_FileDeleteResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/forks":{"get":{"tags":["repo"],"operationId":"list_handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List forks","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ForksResponse"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ForkRepoOption"}}},"required":true},"responses":{"201":{"description":"Fork a repository","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/generate":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_GenerateRepoOption"}}},"required":true},"responses":{"201":{"description":"Generate a repository from template","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/blobs/{sha}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a blob","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_BlobView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/commits/diff/{sha}":{"get":{"tags":["repo"],"operationId":"diff_handler","responses":{"200":{"description":"Get commit diff or patch","content":{"text/plain":{}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/commits/{sha}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a commit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommitView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/commits/{sha}.{diff_type}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get commit diff or patch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommitDiffPayload"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/notes/{sha}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a note","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_NoteView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/refs":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"List git refs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_GitRef"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/refs/{filter}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Filter git refs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_GitRef"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/tags/{sha}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get an annotated tag","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommitView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/git/trees/{sha}":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"recursive","in":"path","required":true,"schema":{"type":["boolean","null"]}}],"responses":{"200":{"description":"Get a tree","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TreeView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/issue_config":{"get":{"tags":["repo"],"operationId":"get_handler","responses":{"200":{"description":"Get issue config","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_IssueConfig"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/issue_config/validate":{"get":{"tags":["repo"],"operationId":"validate_handler","responses":{"200":{"description":"Validate issue config","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_IssueConfigValidation"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/issue_templates":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"List issue templates","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_IssueTemplate"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/keys":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"fingerprint","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List deploy keys","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DeployKeyPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateDeployKeyOption"}}},"required":true},"responses":{"201":{"description":"Create a deploy key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DeployKeyView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/keys/{key_id}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a deploy key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DeployKeyView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Delete a deploy key"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/languages":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get repo language stats","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LanguagesResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/licenses":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"List detected licenses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_LicensesResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/media/{filepath:path}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get media (raw or LFS pointer)","content":{"application/octet-stream":{}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/merge-upstream":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_MergeUpstreamRequest"}}},"required":true},"responses":{"200":{"description":"Merge upstream","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MergeUpstreamResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/new_pin_allowed":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Whether new issue pins are allowed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_NewPinAllowedResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"state","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"keyword","in":"path","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"List pull requests","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreatePullRequestOption"}}},"required":true},"responses":{"201":{"description":"Create a pull request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a pull request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestView"}}}}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdatePullRequestOption"}}},"required":true},"responses":{"200":{"description":"Update a pull request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}/close":{"post":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Close a pull request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}/comments":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"List pull request comments","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_PullRequestCommentView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreatePullRequestCommentOption"}}},"required":true},"responses":{"201":{"description":"Create a pull request comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestCommentView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}/events":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"List pull request events","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_PullRequestEventView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}/lock":{"post":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Lock a pull request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}/merge":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_MergePullRequestOption"}}},"required":true},"responses":{"200":{"description":"Merge a pull request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MergeView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}/reopen":{"post":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Reopen a pull request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}/reviews":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"List pull request reviews","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_PullRequestReviewView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_SubmitPullRequestReviewOption"}}},"required":true},"responses":{"201":{"description":"Submit a pull request review","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestReviewView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/pulls/{number}/unlock":{"post":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Unlock a pull request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PullRequestView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/raw/{filepath:path}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get raw file content","content":{"application/octet-stream":{}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/releases":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"draft","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"prerelease","in":"path","required":true,"schema":{"type":["boolean","null"]}},{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List releases","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReleasePage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateReleaseOption"}}},"required":true},"responses":{"201":{"description":"Create a release","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReleaseView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/releases/latest":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get the latest release","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReleaseView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/releases/tags/{tag}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a release by tag","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReleaseView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Delete a release by tag"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/releases/{release_id}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a release","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReleaseView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Delete a release"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_EditReleaseOption"}}},"required":true},"responses":{"200":{"description":"Edit a release","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReleaseView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/releases/{release_id}/assets":{"get":{"tags":["repo"],"operationId":"list_handler","responses":{"200":{"description":"List release attachments","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReleaseAttachmentListResponse"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/releases/{release_id}/assets/{attachment_id}":{"get":{"tags":["repo"],"operationId":"get_handler","responses":{"200":{"description":"Get a release attachment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReleaseAttachmentView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/rename":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_RenameRepoOption"}}},"required":true},"responses":{"200":{"description":"Rename a repository","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/reviewers":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"List reviewers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_UserMini"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/signing-key.gpg":{"get":{"tags":["repo"],"operationId":"gpg_handler","responses":{"200":{"description":"GPG signing key","content":{"text/plain":{}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/signing-key.pub":{"get":{"tags":["repo"],"operationId":"ssh_handler","responses":{"200":{"description":"SSH signing key","content":{"text/plain":{}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/stargazers":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List stargazers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_UserMini"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/statuses/{sha}":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"sort","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"state","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List commit statuses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommitStatusPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateStatusOption"}}},"required":true},"responses":{"201":{"description":"Create a commit status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CommitStatusView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/subscribers":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List subscribers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SubscriberPage"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/subscription":{"get":{"tags":["repo"],"operationId":"get_handler","responses":{"200":{"description":"Get current user's subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Subscription"}}}}},"security":[{"bearer_auth":[]}]},"put":{"tags":["repo"],"operationId":"put_handler","responses":{"204":{"description":"Watch the repo"}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"delete_handler","responses":{"204":{"description":"Unwatch the repo"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/sync":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get repo metadata sync status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SyncStatus"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/sync/run":{"post":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Trigger a metadata sync","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SyncResult"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/tag_protections":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List tag protections","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TagProtectionPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateTagProtectionOption"}}},"required":true},"responses":{"201":{"description":"Create a tag protection","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TagProtectionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/tag_protections/{policy_id}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a tag protection","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TagProtectionView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Delete a tag protection"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_EditTagProtectionOption"}}},"required":true},"responses":{"200":{"description":"Edit a tag protection","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TagProtectionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/tags":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List tags","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TagPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateTagOption"}}},"required":true},"responses":{"201":{"description":"Create a tag","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TagView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/tags/{tag_name}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a tag","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TagView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Delete a tag"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/topics":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"List repo topics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TopicList"}}}}},"security":[{"bearer_auth":[]}]},"put":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_RepoTopicOptions"}}},"required":true},"responses":{"204":{"description":"Replace repo topics"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/topics/{topic}":{"put":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Add a topic"}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["repo"],"operationId":"handler","responses":{"204":{"description":"Remove a topic"}},"security":[{"bearer_auth":[]}]}},"/api/v1/repos/{space_name}/{repo_id}/transfer":{"post":{"tags":["repo"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_TransferRepoOption"}}},"required":true},"responses":{"200":{"description":"Transfer a repository","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/repositories/{id}":{"get":{"tags":["repo"],"operationId":"handler","responses":{"200":{"description":"Get a repository by id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RepoSummary"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces":{"get":{"tags":["space"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List spaces owned by the caller","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpacePage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateSpaceCmd"}}},"required":true},"responses":{"200":{"description":"Create a new space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/invites/accept":{"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AcceptInviteCmd"}}},"required":true},"responses":{"200":{"description":"Accept an invite"}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}":{"get":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Get a space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceView"}}}}}},"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Delete a space"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateSpaceCmd"}}},"required":true},"responses":{"200":{"description":"Update a space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/bans":{"get":{"tags":["space"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List bans in a space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceBanPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateBanCmd"}}},"required":true},"responses":{"200":{"description":"Ban a user from a space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceBanView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/bans/{uid}":{"get":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Get a ban","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceBanView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Unban a user from a space"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateBanCmd"}}},"required":true},"responses":{"200":{"description":"Update a ban","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceBanView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/channels":{"get":{"tags":["space"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List channels in a space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ChannelPage"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/channels/{cid}":{"get":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Get a channel","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ChannelView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/channels/{cid}/overwrites/roles":{"get":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"List role overwrites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_RoleOverwriteView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_SetRoleOverwriteCmd"}}},"required":true},"responses":{"200":{"description":"Set a role overwrite","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RoleOverwriteView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/channels/{cid}/overwrites/roles/{rid}":{"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Remove a role overwrite"}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/channels/{cid}/overwrites/users":{"get":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"List user overwrites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_UserOverwriteView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_SetUserOverwriteCmd"}}},"required":true},"responses":{"200":{"description":"Set a user overwrite","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UserOverwriteView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/channels/{cid}/overwrites/users/{uid}":{"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Remove a user overwrite"}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/invites":{"get":{"tags":["space"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List invites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceInvitePage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateInviteCmd"}}},"required":true},"responses":{"200":{"description":"Create an invite","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceInviteView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/invites/{iid}":{"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Revoke an invite","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceInviteView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/members":{"get":{"tags":["space"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List members of a space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceMemberPage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AddMemberCmd"}}},"required":true},"responses":{"200":{"description":"Add a member to a space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceMemberView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/members/{uid}":{"get":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Get a space member","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceMemberView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Remove a member from a space"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateMemberCmd"}}},"required":true},"responses":{"200":{"description":"Update a space member","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SpaceMemberView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/members/{uid}/roles":{"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AssignRoleCmd"}}},"required":true},"responses":{"200":{"description":"Assign a role to a member"}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/members/{uid}/roles/{rid}":{"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Unassign a role from a member"}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/roles":{"get":{"tags":["space"],"operationId":"handler","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"List roles in a space","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RolePage"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateRoleCmd"}}},"required":true},"responses":{"200":{"description":"Create a role","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RoleView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{space_name}/roles/{rid}":{"get":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Get a role","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RoleView"}}}}}},"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Delete a role"}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["space"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateRoleCmd"}}},"required":true},"responses":{"200":{"description":"Update a role","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RoleView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/topics/search":{"get":{"tags":["repo"],"operationId":"handler","parameters":[{"name":"q","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":0}}],"responses":{"200":{"description":"Search topics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_TopicSearchResult"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/admin/deletions":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"List pending and scheduled deletion requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_DeletionRequestView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/admin/deletions/{id}/complete":{"post":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"Deletion request id.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Deletion completed; sessions revoked."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/admin/suspensions":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"include_revoked","in":"query","description":"Include revoked suspensions (default false).","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"All suspensions (admin view).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_SuspensionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/admin/suspensions/{id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"Suspension id.","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_RevokeSuspensionCmd"}}},"required":true},"responses":{"204":{"description":"Suspension revoked."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/admin/users/{uid}/profile":{"patch":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateProfileCmd"}}},"required":true},"responses":{"200":{"description":"Admin-updated profile.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UserMe"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/admin/users/{uid}/suspensions":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"include_revoked","in":"query","description":"Include revoked suspensions (default false).","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Suspensions for the given user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_SuspensionView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_SuspendCmd"}}},"required":true},"responses":{"200":{"description":"Suspension created (also sets users.is_restricted = true).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SuspensionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Authenticated user profile (privileged view).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UserMe"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/access-keys":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"List access keys for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_AccessKeyView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_CreateAccessKeyCmd"}}},"required":true},"responses":{"200":{"description":"Access key created (token returned only once).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_CreateAccessKeyResp"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/access-keys/{id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"Access key identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Access key deleted."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/avatar":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Current avatar metadata (200 with empty body if none).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Option_AvatarView"}}}}},"security":[{"bearer_auth":[]}]},"put":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UploadAvatarCmd"}}},"required":true},"responses":{"200":{"description":"Avatar uploaded and bound to caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_AvatarView"}}}},"400":{"description":"Invalid content_type or base64 payload."}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["user"],"operationId":"handler","responses":{"204":{"description":"Avatar removed."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/blocks":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"limit","in":"query","description":"Maximum items (default 20).","required":false,"schema":{"type":"integer","minimum":0}},{"name":"cursor","in":"query","description":"Pagination cursor (id).","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Page of blocked users.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_BlockedSummary"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/blocks/{uid}":{"post":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Block succeeded (idempotent; also unfollows both directions)."},"404":{"description":"Target user not found."}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Unblock succeeded."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/deletion":{"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_RequestDeletionCmd"}}},"required":true},"responses":{"200":{"description":"Deletion request created or returned (idempotent).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DeletionRequestView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["user"],"operationId":"handler","responses":{"204":{"description":"Active deletion request cancelled."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/deletion/confirm":{"post":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Deletion request scheduled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DeletionRequestView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/devices":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"List devices registered to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_DeviceView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/devices/{id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"Device identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Device removed."}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"Device identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateDeviceCmd"}}},"required":true},"responses":{"200":{"description":"Device updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_DeviceView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/email-change":{"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_RequestChangeBody"}}},"required":true},"responses":{"200":{"description":"Email change ticket created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_EmailChangeTicketView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/email-change/confirm":{"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_ConfirmEmailChangeCmd"}}},"required":true},"responses":{"200":{"description":"Ticket status advanced.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_EmailChangeTicketView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/email-change/{ticket_id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"ticket_id","in":"path","description":"Ticket identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Ticket cancelled."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/emails":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"List active emails for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_EmailView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AddEmailCmd"}}},"required":true},"responses":{"200":{"description":"Email added (unverified).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_AddEmailResp"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/emails/{email_id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"email_id","in":"path","description":"Email identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Email soft-deleted."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/emails/{email_id}/primary":{"patch":{"tags":["user"],"operationId":"handler","parameters":[{"name":"email_id","in":"path","description":"Email identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Primary email changed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SetPrimaryEmailResp"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/memes":{"get":{"tags":["user"],"operationId":"list_handler","parameters":[{"name":"limit","in":"query","description":"Maximum items (default 20).","required":false,"schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"List the caller's favorite memes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_MemeView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["user"],"operationId":"create_handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpsertMemeCmd"}}},"required":true},"responses":{"200":{"description":"Meme created or updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MemeView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/memes/{id}":{"delete":{"tags":["user"],"operationId":"delete_handler","parameters":[{"name":"id","in":"path","description":"Meme identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Meme deleted."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/messages/saved":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Saved messages for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_SavedMessageView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_SaveMessageCmd"}}},"required":true},"responses":{"200":{"description":"Message saved (idempotent).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SavedMessageView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/messages/saved/{message_id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"message_id","in":"path","description":"Message identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Message removed from saved list."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/messages/scheduled":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Scheduled messages for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_ScheduledMessageView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/messages/scheduled/{id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"Scheduled message identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Scheduled message cancelled."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/notifications":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"unread_only","in":"query","description":"Only return unread notifications.","required":false,"schema":{"type":"boolean"}},{"name":"notification_type","in":"query","description":"Filter by notification type.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum items (default 20).","required":false,"schema":{"type":"integer","minimum":0}},{"name":"cursor","in":"query","description":"Pagination cursor (id).","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Notifications for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_NotificationView"}}}}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_MarkReadCmd"}}},"required":true},"responses":{"200":{"description":"Notifications marked as read.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MarkReadResp"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/notifications/mark-all-read":{"post":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"All notifications marked as read.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_MarkAllReadResp"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/notifications/unread-count":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Number of unread notifications for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UnreadCountResp"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/preferences":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"User preferences (auto-created if missing).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UserPreferences"}}}}},"security":[{"bearer_auth":[]}]},"patch":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdatePreferencesCmd"}}},"required":true},"responses":{"200":{"description":"Updated preferences.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UserPreferences"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/profile":{"patch":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpdateProfileCmd"}}},"required":true},"responses":{"200":{"description":"Updated self profile.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UserMe"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/push-subscriptions":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"List push subscriptions for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_PushSubscriptionView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_UpsertPushCmd"}}},"required":true},"responses":{"200":{"description":"Push subscription upserted (endpoint-keyed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_PushSubscriptionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/push-subscriptions/{id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"Push subscription id.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Push subscription deleted."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/recent-mentions":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"limit","in":"query","description":"Maximum items (default 20).","required":false,"schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"Recent mentions for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_RecentMentionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/recovery-codes":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"List recovery codes for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_RecoveryCodeView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/recovery-codes/regenerate":{"post":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Recovery codes regenerated (plaintext returned once).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RegenerateRecoveryResp"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/reports":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Reports submitted by the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_ReportView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/sessions":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"app_id","in":"query","description":"Filter by app id.","required":false,"schema":{"type":"string"}},{"name":"include_revoked","in":"query","description":"Include revoked sessions (default false).","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"List active sessions for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_SessionView"}}}}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"All sessions revoked for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_RevokeAllResp"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/sessions/{id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"Session identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Session revoked."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/ssh-keys":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"List SSH keys for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_SshKeyView"}}}}},"security":[{"bearer_auth":[]}]},"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_AddSshKeyCmd"}}},"required":true},"responses":{"200":{"description":"SSH key added.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_SshKeyView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/ssh-keys/{id}":{"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"id","in":"path","description":"SSH key identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"SSH key deleted."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/me/suspensions":{"get":{"tags":["user"],"operationId":"handler","responses":{"200":{"description":"Active suspensions affecting the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_SuspensionView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/reports":{"post":{"tags":["user"],"operationId":"handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRequestData_SubmitReportCmd"}}},"required":true},"responses":{"200":{"description":"Report submitted (status = Open).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ReportView"}}}}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/users/{uid}":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"User identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Public view of the user (visibility-filtered).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_UserPublic"}}}},"404":{"description":"User not found."}}}},"/api/v1/user/users/{uid}/follow":{"post":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Follow succeeded (idempotent)."},"404":{"description":"Target user not found."}},"security":[{"bearer_auth":[]}]},"delete":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Unfollow succeeded."}},"security":[{"bearer_auth":[]}]}},"/api/v1/user/users/{uid}/followers":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","description":"Maximum items (default 20).","required":false,"schema":{"type":"integer","minimum":0}},{"name":"cursor","in":"query","description":"Pagination cursor (id).","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Page of followers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_FollowerSummary"}}}}}}},"/api/v1/user/users/{uid}/following":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"Target user identifier.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","description":"Maximum items (default 20).","required":false,"schema":{"type":"integer","minimum":0}},{"name":"cursor","in":"query","description":"Pagination cursor (id).","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Page of accounts the user follows.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_Vec_FollowerSummary"}}}}}}},"/api/v1/user/users/{uid}/profile-detail":{"get":{"tags":["user"],"operationId":"handler","parameters":[{"name":"uid","in":"path","description":"User identifier.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Extended profile record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppResponseData_ProfileView"}}}},"404":{"description":"Profile not found."}}}}},"components":{"schemas":{"AcceptAgreementCmd":{"type":"object","required":["user_id","agreement_key","agreement_version"],"properties":{"agreement_key":{"type":"string"},"agreement_version":{"type":"string"},"user_id":{"type":"string"}}},"AcceptAgreementResp":{"type":"object","required":["recorded"],"properties":{"recorded":{"type":"boolean"}}},"AcceptInviteCmd":{"type":"object","required":["accept_code"],"properties":{"accept_code":{"type":"string"}}},"AccessKeyScope":{"type":"string","enum":["read","write","repo","admin","all"]},"AccessKeyView":{"type":"object","required":["id","name","token_last_eight","scope","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"scope":{"$ref":"#/components/schemas/AccessKeyScope"},"token_last_eight":{"type":"string"},"updated_at":{"type":"string"}}},"ActivityPage":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ActivityView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"ActivityView":{"type":"object","required":["id","project_id","actor_id","verb","target_kind","created_at"],"properties":{"actor_id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time"},"id":{"type":"string","format":"uuid"},"payload":{},"project_id":{"type":"string","format":"uuid"},"target_id":{"type":["string","null"],"format":"uuid"},"target_kind":{"type":"string"},"verb":{"type":"string"}}},"AddCollaboratorOption":{"type":"object","required":["permission"],"properties":{"permission":{"type":"string"}}},"AddEmailCmd":{"type":"object","required":["email"],"properties":{"email":{"type":"string"}}},"AddEmailResp":{"type":"object","required":["email_id"],"properties":{"email_id":{"type":"string","format":"uuid"}}},"AddFavoriteCmd":{"type":"object","properties":{"folder":{"type":["string","null"]}}},"AddLinkCmd":{"type":"object","required":["related_project_id","kind"],"properties":{"kind":{"$ref":"#/components/schemas/LinkKind"},"related_project_id":{"type":"string","format":"uuid"}}},"AddMemberCmd":{"type":"object","required":["user_id"],"properties":{"role":{"$ref":"#/components/schemas/MemberRole"},"user_id":{"type":"string","format":"uuid"}}},"AddSshKeyCmd":{"type":"object","required":["name","content"],"properties":{"content":{"type":"string"},"key_type":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SshKeyType"}]},"name":{"type":"string"}}},"AgreementDoc":{"type":"object","required":["key","version","updated_at","title","content_md"],"properties":{"content_md":{"type":"string"},"key":{"type":"string"},"title":{"type":"string"},"updated_at":{"type":"string"},"version":{"type":"string"}}},"AppRequestData_AcceptAgreementCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["user_id","agreement_key","agreement_version"],"properties":{"agreement_key":{"type":"string"},"agreement_version":{"type":"string"},"user_id":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_AcceptInviteCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["accept_code"],"properties":{"accept_code":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_AddCollaboratorOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["permission"],"properties":{"permission":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_AddEmailCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["email"],"properties":{"email":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_AddFavoriteCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"folder":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_AddLinkCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["related_project_id","kind"],"properties":{"kind":{"$ref":"#/components/schemas/LinkKind"},"related_project_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_AddMemberCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["user_id"],"properties":{"role":{"$ref":"#/components/schemas/MemberRole"},"user_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_AddSshKeyCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name","content"],"properties":{"content":{"type":"string"},"key_type":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SshKeyType"}]},"name":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_ApplyDiffPatchFileOptions":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["content"],"properties":{"content":{"type":"string"},"sha":{"type":["string","null"]}}}]},"request_id":{"type":"string"}}},"AppRequestData_ArchiveRepoOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["archived"],"properties":{"archived":{"type":"boolean"}}},"request_id":{"type":"string"}}},"AppRequestData_AssignRoleCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["role_id"],"properties":{"role_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_AuthorizeCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["provider","code_verifier"],"properties":{"app_id":{"type":["string","null"]},"code_verifier":{"type":"string"},"provider":{"$ref":"#/components/schemas/OAuthProvider"}}},"request_id":{"type":"string"}}},"AppRequestData_ChangeFilesOptions":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["files"],"properties":{"files":{"type":"array","items":{"$ref":"#/components/schemas/ChangeFileEntry"}}}}]},"request_id":{"type":"string"}}},"AppRequestData_CloseIssueOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["closed"],"properties":{"closed":{"type":"boolean"}}},"request_id":{"type":"string"}}},"AppRequestData_ConfirmEmailChangeCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["ticket_id"],"properties":{"ticket_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateAccessKeyCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name","scope"],"properties":{"name":{"type":"string"},"scope":{"$ref":"#/components/schemas/AccessKeyScope"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateBanCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["user_id"],"properties":{"allow_agent_join":{"type":["boolean","null"]},"allow_comment_any":{"type":["boolean","null"]},"allow_push_repo":{"type":["boolean","null"]},"allow_speak":{"type":["boolean","null"]},"expires_at":{"type":["string","null"]},"reason":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateBranchOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["new_branch_name"],"properties":{"new_branch_name":{"type":"string"},"old_branch_name":{"type":["string","null"]},"old_ref_name":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_CreateBranchProtectionOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["branch_name"],"properties":{"approvals_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"approvals_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"block_admin_merge_override":{"type":["boolean","null"]},"block_on_change_requested_reviews":{"type":["boolean","null"]},"block_on_outdated_branch":{"type":["boolean","null"]},"block_on_rejected_reviews":{"type":["boolean","null"]},"branch_name":{"type":"string"},"branch_pattern":{"type":["string","null"]},"bypass_allowlist_teams":{"type":["array","null"],"items":{"type":"string"}},"bypass_allowlist_usernames":{"type":["array","null"],"items":{"type":"string"}},"dismiss_stale_approvals":{"type":["boolean","null"]},"enable_approvals_whitelist":{"type":["boolean","null"]},"enable_bypass_allowlist":{"type":["boolean","null"]},"enable_force_push":{"type":["boolean","null"]},"enable_force_push_allowlist":{"type":["boolean","null"]},"enable_merge_whitelist":{"type":["boolean","null"]},"enable_push":{"type":["boolean","null"]},"enable_push_whitelist":{"type":["boolean","null"]},"force_push_allowlist_deploy_keys":{"type":["boolean","null"]},"force_push_allowlist_teams":{"type":["array","null"],"items":{"type":"string"}},"force_push_allowlist_usernames":{"type":["array","null"],"items":{"type":"string"}},"ignore_stale_approvals":{"type":["boolean","null"]},"merge_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"merge_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"priority":{"type":["integer","null"],"format":"int64"},"protected_file_patterns":{"type":["string","null"]},"push_whitelist_deploy_keys":{"type":["boolean","null"]},"push_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"push_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"require_signed_commits":{"type":["boolean","null"]},"required_approvals":{"type":["integer","null"],"format":"int32"},"rule_name":{"type":["string","null"]},"unprotected_file_patterns":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_CreateCollectionOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["space_id","name"],"properties":{"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"name":{"type":"string"},"parent_dir":{"type":["string","null"],"format":"uuid"},"space_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateCommentOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["content"],"properties":{"content":{"type":"string"},"parent_id":{"type":["string","null"],"format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateDependencyOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["dependency_id"],"properties":{"dependency_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateDeployKeyOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["title","key"],"properties":{"key":{"type":"string"},"read_only":{"type":["boolean","null"]},"title":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateDocumentCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["title","slug"],"properties":{"content":{"type":"string"},"icon":{"type":["string","null"]},"parent_id":{"type":["string","null"],"format":"uuid"},"slug":{"type":"string"},"title":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateFileOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["content"],"properties":{"content":{"type":"string"}}}]},"request_id":{"type":"string"}}},"AppRequestData_CreateInviteCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["role_ids"],"properties":{"email":{"type":["string","null"]},"expires_at":{"type":["string","null"]},"role_ids":{"type":"array","items":{"type":"string","format":"uuid"}},"user_id":{"type":["string","null"],"format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateIssueOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["title","body"],"properties":{"body":{"type":"string"},"description":{"type":["string","null"]},"milestone_id":{"type":["string","null"],"format":"uuid"},"title":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateLabelOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name","color"],"properties":{"color":{"type":"string"},"description":{"type":["string","null"]},"exclusive":{"type":["boolean","null"]},"exclusive_order":{"type":["integer","null"],"format":"int32"},"name":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateMemberOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["user_id","kind"],"properties":{"kind":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateMentionOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["is_everyone","is_here"],"properties":{"is_everyone":{"type":"boolean"},"is_here":{"type":"boolean"},"role_id":{"type":["string","null"],"format":"uuid"},"user_id":{"type":["string","null"],"format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateMilestoneOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name"],"properties":{"description":{"type":["string","null"]},"due_at":{"type":["string","null"]},"name":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreatePinOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["issue_id","pin_order"],"properties":{"issue_id":{"type":"string","format":"uuid"},"pin_order":{"type":"integer","format":"int32"}}},"request_id":{"type":"string"}}},"AppRequestData_CreatePostBoardOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name"],"properties":{"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"name":{"type":"string"},"parent_dir":{"type":["string","null"],"format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreatePostLabelOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name","color"],"properties":{"color":{"type":"string"},"name":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreatePostOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["title","body"],"properties":{"body":{"type":"string"},"title":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreatePostReactionOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["emoji"],"properties":{"emoji":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateProjectCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["space_id","name"],"properties":{"color":{"type":["string","null"]},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"lead_id":{"type":["string","null"],"format":"uuid"},"name":{"type":"string"},"parent_dir":{"type":["string","null"],"format":"uuid"},"space_id":{"type":"string","format":"uuid"},"target_date":{"type":["string","null"],"format":"date"}}},"request_id":{"type":"string"}}},"AppRequestData_CreatePullRequestCommentOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["body"],"properties":{"body":{"type":"string"},"commit_sha":{"type":["string","null"]},"line":{"type":["integer","null"],"format":"int32"},"path":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_CreatePullRequestOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["title","head","base"],"properties":{"base":{"type":"string"},"body":{"type":["string","null"]},"head":{"type":"string"},"title":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateReactionOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["emoji"],"properties":{"emoji":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateReleaseOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["tag_name","title"],"properties":{"content":{"type":["string","null"]},"is_draft":{"type":["boolean","null"]},"is_prerelease":{"type":["boolean","null"]},"tag_message":{"type":["string","null"]},"tag_name":{"type":"string"},"target":{"type":["string","null"]},"title":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateReplyOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["body"],"properties":{"body":{"type":"string"},"parent_reply_id":{"type":["string","null"],"format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateRepoOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["space_id","name"],"properties":{"auto_init":{"type":["boolean","null"]},"default_branch":{"type":["string","null"]},"description":{"type":["string","null"]},"enable_lfs":{"type":["boolean","null"]},"gitignores":{"type":["string","null"]},"is_private":{"type":["boolean","null"]},"issue_labels":{"type":["string","null"]},"license_name":{"type":["string","null"]},"name":{"type":"string"},"object_format":{"type":["string","null"]},"parent_dir":{"type":["string","null"],"format":"uuid"},"readme":{"type":["string","null"]},"space_id":{"type":"string","format":"uuid"},"template":{"type":["boolean","null"]},"website":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_CreateRepoRelOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["repo_id"],"properties":{"repo_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_CreateRoleCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name","permissions"],"properties":{"color":{"type":["string","null"]},"icon_hash":{"type":["string","null"]},"name":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}},"position":{"type":["integer","null"],"format":"int64"},"unicode_emoji":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_CreateSpaceCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name"],"properties":{"allow_invite":{"type":"boolean"},"allow_join":{"type":"boolean"},"allow_join_level":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SpaceAllowJoinLevel"}]},"avatar_url":{"type":["string","null"]},"description":{"type":["string","null"]},"member_must_enable_2fa":{"type":"boolean"},"name":{"type":"string"},"public":{"type":"boolean"},"welcome_message":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_CreateStatusOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["state","context"],"properties":{"context":{"type":"string"},"description":{"type":["string","null"]},"state":{"type":"string"},"target_url":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_CreateTagOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["tag_name"],"properties":{"message":{"type":["string","null"]},"tag_name":{"type":"string"},"target":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_CreateTagProtectionOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name_pattern"],"properties":{"name_pattern":{"type":"string"},"whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"whitelist_usernames":{"type":["array","null"],"items":{"type":"string","format":"uuid"}}}},"request_id":{"type":"string"}}},"AppRequestData_CreateViewCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name"],"properties":{"description":{"type":["string","null"]},"filter":{},"group_by":{"type":["string","null"]},"is_shared":{"type":"boolean"},"layout":{"type":"string"},"name":{"type":"string"},"sort_by":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_DeleteFileOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["sha"],"properties":{"sha":{"type":"string"}}}]},"request_id":{"type":"string"}}},"AppRequestData_EditBranchProtectionOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"approvals_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"approvals_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"block_admin_merge_override":{"type":["boolean","null"]},"block_on_change_requested_reviews":{"type":["boolean","null"]},"block_on_outdated_branch":{"type":["boolean","null"]},"block_on_rejected_reviews":{"type":["boolean","null"]},"branch_pattern":{"type":["string","null"]},"bypass_allowlist_teams":{"type":["array","null"],"items":{"type":"string"}},"bypass_allowlist_usernames":{"type":["array","null"],"items":{"type":"string"}},"dismiss_stale_approvals":{"type":["boolean","null"]},"enable_approvals_whitelist":{"type":["boolean","null"]},"enable_bypass_allowlist":{"type":["boolean","null"]},"enable_force_push":{"type":["boolean","null"]},"enable_force_push_allowlist":{"type":["boolean","null"]},"enable_merge_whitelist":{"type":["boolean","null"]},"enable_push":{"type":["boolean","null"]},"enable_push_whitelist":{"type":["boolean","null"]},"force_push_allowlist_deploy_keys":{"type":["boolean","null"]},"force_push_allowlist_teams":{"type":["array","null"],"items":{"type":"string"}},"force_push_allowlist_usernames":{"type":["array","null"],"items":{"type":"string"}},"ignore_stale_approvals":{"type":["boolean","null"]},"merge_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"merge_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"priority":{"type":["integer","null"],"format":"int64"},"protected_file_patterns":{"type":["string","null"]},"push_whitelist_deploy_keys":{"type":["boolean","null"]},"push_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"push_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"require_signed_commits":{"type":["boolean","null"]},"required_approvals":{"type":["integer","null"],"format":"int32"},"unprotected_file_patterns":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_EditReleaseOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"content":{"type":["string","null"]},"is_draft":{"type":["boolean","null"]},"is_prerelease":{"type":["boolean","null"]},"tag_name":{"type":["string","null"]},"target":{"type":["string","null"]},"title":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_EditTagProtectionOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"name_pattern":{"type":["string","null"]},"whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"whitelist_usernames":{"type":["array","null"],"items":{"type":"string","format":"uuid"}}}},"request_id":{"type":"string"}}},"AppRequestData_ForgotPasswordCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["email","pow"],"properties":{"email":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"}}},"request_id":{"type":"string"}}},"AppRequestData_ForkRepoOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["to_channel_id"],"properties":{"description":{"type":["string","null"]},"name":{"type":["string","null"]},"to_channel_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_GenerateRepoOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["to_channel_id","name"],"properties":{"description":{"type":["string","null"]},"is_private":{"type":["boolean","null"]},"name":{"type":"string"},"to_channel_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_LoginCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["identifier","password","pow"],"properties":{"app_id":{"type":["string","null"]},"identifier":{"type":"string"},"password":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"}}},"request_id":{"type":"string"}}},"AppRequestData_LogoutCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["refresh_token"],"properties":{"refresh_token":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_MarkReadCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["notification_ids"],"properties":{"notification_ids":{"type":"array","items":{"type":"string","format":"uuid"}}}},"request_id":{"type":"string"}}},"AppRequestData_MergePullRequestOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["style"],"properties":{"commit_message":{"type":["string","null"]},"commit_title":{"type":["string","null"]},"delete_branch_after_merge":{"type":"boolean"},"style":{"$ref":"#/components/schemas/MergeStyle"}}},"request_id":{"type":"string"}}},"AppRequestData_MergeUpstreamRequest":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["branch"],"properties":{"branch":{"type":"string"},"ff_only":{"type":["boolean","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_ReclaimCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["email","pow"],"properties":{"email":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"}}},"request_id":{"type":"string"}}},"AppRequestData_RefreshCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["refresh_token"],"properties":{"app_id":{"type":["string","null"]},"refresh_token":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_RegisterCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["email","password","pow"],"properties":{"accept_agreements":{"type":"array","items":{"type":"string"}},"email":{"type":"string"},"password":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"},"username":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_RenameBranchOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["new_name"],"properties":{"new_name":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_RenameRepoOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["new_name"],"properties":{"new_name":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_RepoTopicOptions":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["topics"],"properties":{"topics":{"type":"array","items":{"type":"string"}}}},"request_id":{"type":"string"}}},"AppRequestData_RequestChangeBody":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["new_email"],"properties":{"new_email":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_RequestDeletionCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"reason":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_ResendCodeCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["email","pow","purpose"],"properties":{"email":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"},"purpose":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_ResetPasswordCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["email","token","new_password","temp_key_value"],"properties":{"email":{"type":"string"},"new_password":{"type":"string"},"temp_key_value":{"type":"string"},"token":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_RevokeSuspensionCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"reason":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_SaveMessageCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["channel_id","message_id"],"properties":{"channel_id":{"type":"string","format":"uuid"},"message_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_SetRoleOverwriteCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["role_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"deny_mask":{"type":"integer","format":"int64"},"role_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_SetUserOverwriteCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["user_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"deny_mask":{"type":"integer","format":"int64"},"user_id":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_SubmitPullRequestReviewOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["state"],"properties":{"commit_sha":{"type":["string","null"]},"content":{"type":["string","null"]},"state":{"$ref":"#/components/schemas/ReviewState"}}},"request_id":{"type":"string"}}},"AppRequestData_SubmitReportCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["reported_uid","reason"],"properties":{"evidence":{"type":["string","null"]},"reason":{"type":"string"},"reported_uid":{"type":"string","format":"uuid"}}},"request_id":{"type":"string"}}},"AppRequestData_SuspendCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["suspension_type"],"properties":{"ends_at":{"type":["string","null"]},"reason":{"type":["string","null"]},"suspension_type":{"$ref":"#/components/schemas/SuspensionType"}}},"request_id":{"type":"string"}}},"AppRequestData_TransferRepoOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["new_channel_id"],"properties":{"new_channel_id":{"type":"string","format":"uuid"},"new_name":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateAvatarOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["image"],"properties":{"image":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateBanCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"allow_agent_join":{"type":["boolean","null"]},"allow_comment_any":{"type":["boolean","null"]},"allow_push_repo":{"type":["boolean","null"]},"allow_speak":{"type":["boolean","null"]},"expires_at":{"type":["string","null"]},"reason":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateBranchOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["new_commit_id"],"properties":{"force":{"type":["boolean","null"]},"new_commit_id":{"type":"string"},"old_commit_id":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateBranchProtectionPriorities":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["ids"],"properties":{"ids":{"type":"array","items":{"type":"string","format":"uuid"}}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateCollectionOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"name":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateCommentOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["content"],"properties":{"content":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateDeviceCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"device_name":{"type":["string","null"]},"is_trusted":{"type":["boolean","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateDocumentCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"content":{"type":["string","null"]},"icon":{"type":["string","null"]},"parent_id":{"type":["string","null"],"format":"uuid"},"slug":{"type":["string","null"]},"title":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateFileOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["content"],"properties":{"content":{"type":"string"},"from_path":{"type":["string","null"]},"sha":{"type":["string","null"]}}}]},"request_id":{"type":"string"}}},"AppRequestData_UpdateIssueOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"body":{"type":["string","null"]},"description":{"type":["string","null"]},"milestone_id":{"type":["string","null"],"format":"uuid"},"title":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateIssueUserOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"is_mentioned":{"type":["boolean","null"]},"is_read":{"type":["boolean","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateLabelOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"color":{"type":["string","null"]},"description":{"type":["string","null"]},"exclusive":{"type":["boolean","null"]},"exclusive_order":{"type":["integer","null"],"format":"int32"},"is_archived":{"type":["boolean","null"]},"name":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateMemberCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["role"],"properties":{"role":{"$ref":"#/components/schemas/MemberRole"}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateMilestoneOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"description":{"type":["string","null"]},"due_at":{"type":["string","null"]},"is_closed":{"type":["boolean","null"]},"name":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdatePostLabelOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"color":{"type":["string","null"]},"is_archived":{"type":["boolean","null"]},"name":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdatePostOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"body":{"type":["string","null"]},"status":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/PostStatusView"}]},"title":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdatePreferencesCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"allow_dms_from":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Audience"}]},"allow_mentions_from":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Audience"}]},"diff_view_style":{"type":["string","null"]},"email_digest":{"type":["boolean","null"]},"email_flags":{"type":["integer","null"],"format":"int32"},"in_app_flags":{"type":["integer","null"],"format":"int32"},"mute_until":{"type":["string","null"]},"push_flags":{"type":["integer","null"],"format":"int32"},"show_online_status":{"type":["boolean","null"]},"theme_mode":{"type":["string","null"]},"theme_token":{"type":["string","null"]},"theme_version":{"type":["integer","null"],"format":"int64"}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateProfileCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"avatar":{"type":["string","null"]},"display_name":{"type":["string","null"]},"language":{"type":["string","null"]},"locale":{"type":["string","null"]},"profile":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/UpdateProfileFields"}]},"timezone":{"type":["string","null"]},"visibility":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProfileVisibility"}]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateProjectCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"color":{"type":["string","null"]},"description":{"type":["string","null"]},"health":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProjectHealth"}]},"icon":{"type":["string","null"]},"lead_id":{"type":["string","null"],"format":"uuid"},"name":{"type":["string","null"]},"sort_order":{"type":["integer","null"],"format":"int32"},"state":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProjectState"}]},"target_date":{"type":["string","null"],"format":"date"}}},"request_id":{"type":"string"}}},"AppRequestData_UpdatePullRequestOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"base":{"type":["string","null"]},"body":{"type":["string","null"]},"head":{"type":["string","null"]},"title":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateRepoOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"allow_fast_forward_only_merge":{"type":["boolean","null"]},"allow_manual_merge":{"type":["boolean","null"]},"allow_merge_commits":{"type":["boolean","null"]},"allow_merge_update":{"type":["boolean","null"]},"allow_rebase":{"type":["boolean","null"]},"allow_rebase_explicit":{"type":["boolean","null"]},"allow_rebase_update":{"type":["boolean","null"]},"allow_squash_merge":{"type":["boolean","null"]},"archived":{"type":["boolean","null"]},"autodetect_manual_merge":{"type":["boolean","null"]},"default_allow_maintainer_edit":{"type":["boolean","null"]},"default_branch":{"type":["string","null"]},"default_delete_branch_after_merge":{"type":["boolean","null"]},"default_merge_style":{"type":["string","null"]},"default_update_style":{"type":["string","null"]},"description":{"type":["string","null"]},"enable_lfs":{"type":["boolean","null"]},"external_tracker":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExternalTracker"}]},"external_wiki":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExternalWiki"}]},"has_actions":{"type":["boolean","null"]},"has_code":{"type":["boolean","null"]},"has_issues":{"type":["boolean","null"]},"has_packages":{"type":["boolean","null"]},"has_projects":{"type":["boolean","null"]},"has_pull_requests":{"type":["boolean","null"]},"has_releases":{"type":["boolean","null"]},"has_wiki":{"type":["boolean","null"]},"ignore_whitespace_conflicts":{"type":["boolean","null"]},"internal_tracker":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/InternalTracker"}]},"is_private":{"type":["boolean","null"]},"license_name":{"type":["string","null"]},"name":{"type":["string","null"]},"projects_mode":{"type":["string","null"]},"template":{"type":["boolean","null"]},"website":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateRoleCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"color":{"type":["string","null"]},"icon_hash":{"type":["string","null"]},"name":{"type":["string","null"]},"permissions":{"type":["array","null"],"items":{"type":"string"}},"position":{"type":["integer","null"],"format":"int64"},"unicode_emoji":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateSpaceCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"allow_invite":{"type":["boolean","null"]},"allow_join":{"type":["boolean","null"]},"allow_join_level":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SpaceAllowJoinLevel"}]},"avatar_url":{"type":["string","null"]},"description":{"type":["string","null"]},"member_must_enable_2fa":{"type":["boolean","null"]},"name":{"type":["string","null"]},"public":{"type":["boolean","null"]},"welcome_message":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpdateViewCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","properties":{"description":{"type":["string","null"]},"filter":{},"group_by":{"type":["string","null"]},"is_shared":{"type":["boolean","null"]},"layout":{"type":["string","null"]},"name":{"type":["string","null"]},"sort_by":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UploadAttachmentInput":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["filename","content_type","data"],"properties":{"content_type":{"type":"string"},"data":{"type":"array","items":{"type":"integer","format":"int32","minimum":0}},"filename":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_UploadAvatarCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["content_type","data_base64"],"properties":{"content_type":{"type":"string"},"data_base64":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_UpsertMemeCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["name","content_type","url","size"],"properties":{"content_type":{"type":"string"},"height":{"type":["integer","null"],"format":"int32"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"},"url":{"type":"string"},"width":{"type":["integer","null"],"format":"int32"}}},"request_id":{"type":"string"}}},"AppRequestData_UpsertPostWatchOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["mode"],"properties":{"mode":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_UpsertPushCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["endpoint","p256dh_key","auth_key","platform"],"properties":{"auth_key":{"type":"string"},"endpoint":{"type":"string"},"p256dh_key":{"type":"string"},"platform":{"$ref":"#/components/schemas/PushPlatform"},"user_agent":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppRequestData_UpsertWatchOption":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["mode"],"properties":{"mode":{"type":"string"}}},"request_id":{"type":"string"}}},"AppRequestData_Vec_String":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"array","items":{"type":"string"}},"request_id":{"type":"string"}}},"AppRequestData_VerifyCodeCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["email","purpose","code","temp_key_value"],"properties":{"code":{"type":"string"},"email":{"type":"string"},"purpose":{"type":"string"},"temp_key_value":{"type":"string"},"user_id":{"type":["string","null"]}}},"request_id":{"type":"string"}}},"AppResponseData_AcceptAgreementResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["recorded"],"properties":{"recorded":{"type":"boolean"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ActivityPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ActivityView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_AddEmailResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["email_id"],"properties":{"email_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_AttachmentView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","owner_type","owner_id","filename","content_type","size","url","created_at"],"properties":{"content_type":{"type":"string"},"created_at":{"type":"string"},"filename":{"type":"string"},"id":{"type":"string","format":"uuid"},"owner_id":{"type":"string","format":"uuid"},"owner_type":{"type":"string"},"size":{"type":"integer","format":"int64"},"uploaded_by":{"type":["string","null"],"format":"uuid"},"url":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_AuthorizationUrlResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["url","temp_key"],"properties":{"temp_key":{"$ref":"#/components/schemas/TempKey"},"url":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_AvatarView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["uid","url","format","bytes","updated_at"],"properties":{"bytes":{"type":"integer","format":"int64","minimum":0},"format":{"$ref":"#/components/schemas/AvatarFormat"},"uid":{"type":"string","format":"uuid"},"updated_at":{"type":"string"},"url":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_BlobView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sha","size","encoding","content"],"properties":{"content":{"type":"string"},"encoding":{"type":"string"},"sha":{"type":"string"},"size":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_BranchPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BranchView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_BranchProtectionPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BranchProtectionView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_BranchProtectionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","repo_id","branch_name","rule_name","priority","enable_push","enable_push_whitelist","push_whitelist_usernames","push_whitelist_teams","push_whitelist_deploy_keys","enable_force_push","enable_force_push_allowlist","force_push_allowlist_usernames","force_push_allowlist_teams","force_push_allowlist_deploy_keys","enable_merge_whitelist","merge_whitelist_usernames","merge_whitelist_teams","enable_bypass_allowlist","bypass_allowlist_usernames","bypass_allowlist_teams","enable_approvals_whitelist","approvals_whitelist_usernames","approvals_whitelist_teams","required_approvals","block_on_rejected_reviews","block_on_change_requested_reviews","block_on_outdated_branch","dismiss_stale_approvals","ignore_stale_approvals","require_signed_commits","block_admin_merge_override","protected_file_patterns","unprotected_file_patterns","created_at","updated_at"],"properties":{"approvals_whitelist_teams":{"type":"array","items":{"type":"string"}},"approvals_whitelist_usernames":{"type":"array","items":{"type":"string"}},"block_admin_merge_override":{"type":"boolean"},"block_on_change_requested_reviews":{"type":"boolean"},"block_on_outdated_branch":{"type":"boolean"},"block_on_rejected_reviews":{"type":"boolean"},"branch_name":{"type":"string"},"branch_pattern":{"type":["string","null"]},"bypass_allowlist_teams":{"type":"array","items":{"type":"string"}},"bypass_allowlist_usernames":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"dismiss_stale_approvals":{"type":"boolean"},"enable_approvals_whitelist":{"type":"boolean"},"enable_bypass_allowlist":{"type":"boolean"},"enable_force_push":{"type":"boolean"},"enable_force_push_allowlist":{"type":"boolean"},"enable_merge_whitelist":{"type":"boolean"},"enable_push":{"type":"boolean"},"enable_push_whitelist":{"type":"boolean"},"force_push_allowlist_deploy_keys":{"type":"boolean"},"force_push_allowlist_teams":{"type":"array","items":{"type":"string"}},"force_push_allowlist_usernames":{"type":"array","items":{"type":"string"}},"id":{"type":"string","format":"uuid"},"ignore_stale_approvals":{"type":"boolean"},"merge_whitelist_teams":{"type":"array","items":{"type":"string"}},"merge_whitelist_usernames":{"type":"array","items":{"type":"string"}},"priority":{"type":"integer","format":"int64"},"protected_file_patterns":{"type":"string"},"push_whitelist_deploy_keys":{"type":"boolean"},"push_whitelist_teams":{"type":"array","items":{"type":"string"}},"push_whitelist_usernames":{"type":"array","items":{"type":"string"}},"repo_id":{"type":"string","format":"uuid"},"require_signed_commits":{"type":"boolean"},"required_approvals":{"type":"integer","format":"int32"},"rule_name":{"type":"string"},"unprotected_file_patterns":{"type":"string"},"updated_at":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_BranchView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","repo_id","name","commit_sha","is_protected","protected","required_approvals","enable_status_check","status_check_contexts","user_can_push","user_can_merge","effective_branch_protection_name","is_deleted","created_at","updated_at"],"properties":{"commit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CommitMeta"}]},"commit_sha":{"type":"string"},"created_at":{"type":"string"},"deleted_at":{"type":["string","null"]},"effective_branch_protection_name":{"type":"string"},"enable_status_check":{"type":"boolean"},"id":{"type":"string","format":"uuid"},"is_deleted":{"type":"boolean"},"is_protected":{"type":"boolean"},"name":{"type":"string"},"protected":{"type":"boolean"},"repo_id":{"type":"string","format":"uuid"},"required_approvals":{"type":"integer","format":"int64"},"status_check_contexts":{"type":"array","items":{"type":"string"}},"updated_at":{"type":"string"},"user_can_merge":{"type":"boolean"},"user_can_push":{"type":"boolean"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ChannelPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ChannelView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ChannelView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","name","kind","position","is_archived","created_at","updated_at","created_by"],"properties":{"archived_at":{"type":["string","null"]},"archived_by":{"type":["string","null"],"format":"uuid"},"color":{"type":["string","null"]},"created_at":{"type":"string"},"created_by":{"type":"string","format":"uuid"},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_archived":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"parent_id":{"type":["string","null"],"format":"uuid"},"position":{"type":"integer","format":"int32"},"purpose":{"type":["string","null"]},"space_id":{"type":["string","null"],"format":"uuid"},"topic":{"type":["string","null"]},"updated_at":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CollaboratorPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CollaboratorView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CollectionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","channel_id","name","nums_open_issue","nums_closed_issue","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"nums_closed_issue":{"type":"integer","format":"int64"},"nums_open_issue":{"type":"integer","format":"int64"},"updated_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CombinedStatusView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sha","state","statuses","total_count"],"properties":{"sha":{"type":"string"},"state":{"type":"string"},"statuses":{"type":"array","items":{"$ref":"#/components/schemas/CommitStatusView"}},"total_count":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CommentView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","poster_id","content","created_at"],"properties":{"content":{"type":"string"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":["string","null"],"format":"uuid"},"parent_id":{"type":["string","null"],"format":"uuid"},"poster_id":{"type":"string","format":"uuid"},"updated_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CommitStatusPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CommitStatusView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CommitStatusView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","repo_id","sha","state","context","url","creator","created_at"],"properties":{"context":{"type":"string"},"created_at":{"type":"string"},"creator":{"$ref":"#/components/schemas/CommitUserSummary"},"description":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"repo_id":{"type":"string","format":"uuid"},"sha":{"type":"string"},"state":{"type":"string"},"target_url":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"url":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CommitView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sha","message","parent_shas","tree_sha"],"properties":{"author_email":{"type":["string","null"]},"author_name":{"type":["string","null"]},"authored_at":{"type":["string","null"]},"committed_at":{"type":["string","null"]},"committer_email":{"type":["string","null"]},"committer_name":{"type":["string","null"]},"message":{"type":"string"},"parent_shas":{"type":"array","items":{"type":"string"}},"sha":{"type":"string"},"tree_sha":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CommitsResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CommitSummary"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CompareView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["base","head","total_commits","ahead_by","behind_by","files"],"properties":{"ahead_by":{"type":"integer","format":"int64"},"base":{"type":"string"},"behind_by":{"type":"integer","format":"int64"},"files":{"type":"array","items":{"$ref":"#/components/schemas/CompareFileDiff"}},"head":{"type":"string"},"merge_base":{"type":["string","null"]},"total_commits":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ContentsListResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ContentsResponse"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ContentsResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["name","path","sha","type","size"],"properties":{"content":{"type":["string","null"]},"download_url":{"type":["string","null"]},"encoding":{"type":["string","null"]},"git_url":{"type":["string","null"]},"html_url":{"type":["string","null"]},"last_author_date":{"type":["string","null"]},"last_commit_message":{"type":["string","null"]},"last_commit_sha":{"type":["string","null"]},"last_committer_date":{"type":["string","null"]},"lfs_oid":{"type":["string","null"]},"lfs_size":{"type":["integer","null"],"format":"int64"},"links":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/FileLinksResponse"}]},"name":{"type":"string"},"path":{"type":"string"},"sha":{"type":"string"},"size":{"type":"integer","format":"int64"},"submodule_git_url":{"type":["string","null"]},"target":{"type":["string","null"]},"type":{"type":"string"},"url":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_CreateAccessKeyResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["key","token"],"properties":{"key":{"$ref":"#/components/schemas/AccessKeyView"},"token":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_DeletionRequestView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","user_id","status","created_at","updated_at"],"properties":{"cancelled_at":{"type":["string","null"]},"completed_at":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"reason":{"type":["string","null"]},"scheduled_for":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/DeletionStatus"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_DependencyView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","issue_id","dependency_id","created_at"],"properties":{"created_at":{"type":"string"},"dependency_id":{"type":"string","format":"uuid"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_DeployKeyPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DeployKeyView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_DeployKeyView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","key_id","repo_id","title","key_type","fingerprint","content","url","read_only","created_at"],"properties":{"content":{"type":"string"},"created_at":{"type":"string"},"fingerprint":{"type":"string"},"id":{"type":"string","format":"uuid"},"key_id":{"type":"integer","format":"int64"},"key_type":{"type":"string"},"last_used_at":{"type":["string","null"]},"read_only":{"type":"boolean"},"repo_id":{"type":"string","format":"uuid"},"title":{"type":"string"},"url":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_DeviceView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","is_trusted","first_seen_at","last_seen_at","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"device_name":{"type":["string","null"]},"device_type":{"type":["string","null"]},"first_seen_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_trusted":{"type":"boolean"},"last_seen_at":{"type":"string"},"os":{"type":["string","null"]},"updated_at":{"type":"string"},"user_agent":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_DocumentPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DocumentView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_DocumentView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","project_id","creator_id","title","slug","content","created_at"],"properties":{"content":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"creator_id":{"type":"string","format":"uuid"},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"last_editor_id":{"type":["string","null"],"format":"uuid"},"parent_id":{"type":["string","null"],"format":"uuid"},"project_id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"title":{"type":"string"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_EmailChangeTicketView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","new_email","status","expires_at","created_at"],"properties":{"created_at":{"type":"string"},"expires_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"new_email":{"type":"string"},"status":{"$ref":"#/components/schemas/EmailChangeTicketStatus"},"used_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_FavoritePage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/FavoriteView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_FavoriteView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","project_id","user_id","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"folder":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"project_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_FileDeleteResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","properties":{"commit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CommitSummary"}]},"content":{}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_FilesResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["files"],"properties":{"commit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CommitSummary"}]},"files":{"type":"array","items":{"$ref":"#/components/schemas/ContentsResponse"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ForgotPasswordResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sent","temp_key"],"properties":{"sent":{"type":"boolean"},"temp_key":{"$ref":"#/components/schemas/TempKey"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ForksResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ForkView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_IssueConfig":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["blank_issues_enabled"],"properties":{"blank_issues_enabled":{"type":"boolean"},"contact_links":{}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_IssueConfigValidation":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["valid"],"properties":{"message":{"type":["string","null"]},"valid":{"type":"boolean"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_IssueUserView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","user_id","issue_id","is_read","is_mentioned","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_mentioned":{"type":"boolean"},"is_read":{"type":"boolean"},"issue_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_IssueView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","collection_id","autoincrement_id","author_id","title","body","state","created_at"],"properties":{"author_id":{"type":"string","format":"uuid"},"autoincrement_id":{"type":"integer","format":"int32"},"body":{"type":"string"},"closed_at":{"type":["string","null"]},"collection_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"milestone_id":{"type":["string","null"],"format":"uuid"},"state":{"$ref":"#/components/schemas/IssueState"},"title":{"type":"string"},"updated_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_LabelView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","channel_id","name","exclusive","exclusive_order","color","is_archived","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"color":{"type":"string"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"exclusive":{"type":"boolean"},"exclusive_order":{"type":"integer","format":"int32"},"id":{"type":"string","format":"uuid"},"is_archived":{"type":"boolean"},"name":{"type":"string"},"updated_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_LanguagesResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["languages"],"properties":{"languages":{"type":"object","additionalProperties":{"type":"integer","format":"int64"},"propertyNames":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_LicensesResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["licenses"],"properties":{"licenses":{"type":"array","items":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_LinkPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/LinkView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_LinkView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","project_id","related_project_id","kind","created_by","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"created_by":{"type":"string","format":"uuid"},"id":{"type":"string","format":"uuid"},"kind":{"$ref":"#/components/schemas/LinkKind"},"project_id":{"type":"string","format":"uuid"},"related_project_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_LoginResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["access_token","refresh_token","token_type","expires_in","user"],"properties":{"access_token":{"type":"string"},"expires_in":{"type":"integer","format":"int64"},"refresh_token":{"type":"string"},"token_type":{"type":"string"},"user":{"$ref":"#/components/schemas/UserPublic"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_LogoutResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["revoked"],"properties":{"revoked":{"type":"boolean"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_MarkAllReadResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["marked"],"properties":{"marked":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_MarkReadResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["marked"],"properties":{"marked":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_MemberPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/MemberView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_MemberView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","issue_id","user_id","kind","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"},"kind":{"type":"string"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_MemeView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","name","content_type","url","size","created_at"],"properties":{"content_type":{"type":"string"},"created_at":{"type":"string"},"height":{"type":["integer","null"],"format":"int32"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"},"url":{"type":"string"},"width":{"type":["integer","null"],"format":"int32"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_MergeUpstreamResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["merge_type"],"properties":{"merge_type":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_MergeView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sha","merged"],"properties":{"merged":{"type":"boolean"},"message":{"type":["string","null"]},"sha":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_MilestoneView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","collection_id","name","is_closed","num_issues","num_closed_issues","created_at"],"properties":{"collection_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"due_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_closed":{"type":"boolean"},"name":{"type":"string"},"num_closed_issues":{"type":"integer","format":"int32"},"num_issues":{"type":"integer","format":"int32"},"updated_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_NewPinAllowedResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["allowed"],"properties":{"allowed":{"type":"boolean"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_NoteView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sha","message"],"properties":{"message":{"type":"string"},"sha":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_OAuthLoginResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["access_token","refresh_token","token_type","expires_in","user_id","auto_registered"],"properties":{"access_token":{"type":"string"},"auto_registered":{"type":"boolean"},"expires_in":{"type":"integer","format":"int64"},"refresh_token":{"type":"string"},"token_type":{"type":"string"},"user_id":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Option_AvatarView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"oneOf":[{"type":"null"},{"type":"object","required":["uid","url","format","bytes","updated_at"],"properties":{"bytes":{"type":"integer","format":"int64","minimum":0},"format":{"$ref":"#/components/schemas/AvatarFormat"},"uid":{"type":"string","format":"uuid"},"updated_at":{"type":"string"},"url":{"type":"string"}}}]},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PinView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","collection_id","pin_order","created_at"],"properties":{"collection_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":["string","null"],"format":"uuid"},"pin_order":{"type":"integer","format":"int32"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PostBoardView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","description":"A post board (collection) hosting posts for a space.","required":["id","channel_id","name","nums_open_post","nums_closed_post","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"nums_closed_post":{"type":"integer","format":"int64"},"nums_open_post":{"type":"integer","format":"int64"},"updated_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PostLabelPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PostLabelView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PostLabelView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","channel_id","name","color","is_archived","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"color":{"type":"string"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_archived":{"type":"boolean"},"name":{"type":"string"},"updated_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PostMentionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","target","target_id","is_everyone","is_here","created_at"],"properties":{"channel_id":{"type":["string","null"],"format":"uuid"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_everyone":{"type":"boolean"},"is_here":{"type":"boolean"},"role_id":{"type":["string","null"],"format":"uuid"},"target":{"$ref":"#/components/schemas/PostTargetView"},"target_id":{"type":"string","format":"uuid"},"user_id":{"type":["string","null"],"format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PostReactionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","target","target_id","user_id","emoji","created_at"],"properties":{"created_at":{"type":"string"},"emoji":{"type":"string"},"id":{"type":"string","format":"uuid"},"target":{"$ref":"#/components/schemas/PostTargetView"},"target_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PostReplyPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PostReplyView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PostReplyView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","post_id","author_id","body","is_pinned","created_at"],"properties":{"author_id":{"type":"string","format":"uuid"},"body":{"type":"string"},"created_at":{"type":"string"},"deleted_at":{"type":["string","null"]},"deleted_by":{"type":["string","null"],"format":"uuid"},"edited_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_pinned":{"type":"boolean"},"parent_reply_id":{"type":["string","null"],"format":"uuid"},"post_id":{"type":"string","format":"uuid"},"updated_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PostView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","description":"A single post (thread).","required":["id","collection_id","number","author_id","title","body","status","is_pinned","reply_count","created_at"],"properties":{"archived_at":{"type":["string","null"]},"author_id":{"type":"string","format":"uuid"},"body":{"type":"string"},"closed_at":{"type":["string","null"]},"collection_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_pinned":{"type":"boolean"},"last_reply_at":{"type":["string","null"]},"last_reply_by":{"type":["string","null"],"format":"uuid"},"number":{"type":"integer","format":"int64"},"reply_count":{"type":"integer","format":"int32"},"status":{"$ref":"#/components/schemas/PostStatusView"},"title":{"type":"string"},"updated_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PostWatchView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","post_id","user_id","mode","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"mode":{"type":"string"},"post_id":{"type":"string","format":"uuid"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PowChallengeResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["challenge","ttl_seconds"],"properties":{"challenge":{"type":"string"},"ttl_seconds":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ProfileView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["user_id","show_email","show_location","show_real_name","show_activity","updated_at"],"properties":{"accent_color":{"type":["string","null"]},"banner_color":{"type":["integer","null"],"format":"int32"},"banner_url":{"type":["string","null"]},"bio":{"type":["string","null"]},"company":{"type":["string","null"]},"date_of_birth":{"type":["string","null"],"format":"date"},"location":{"type":["string","null"]},"pronouns":{"type":["string","null"]},"pronouns_privacy":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProfileVisibility"}]},"real_name":{"type":["string","null"]},"show_activity":{"type":"boolean"},"show_email":{"type":"boolean"},"show_location":{"type":"boolean"},"show_real_name":{"type":"boolean"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"},"website":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ProjectPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ProjectView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ProjectView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","space_id","creator_id","name","state","health","sort_order","starred","created_at"],"properties":{"cancelled_at":{"type":["string","null"],"format":"date-time"},"color":{"type":["string","null"]},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"creator_id":{"type":"string","format":"uuid"},"description":{"type":["string","null"]},"health":{"$ref":"#/components/schemas/ProjectHealth"},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"lead_id":{"type":["string","null"],"format":"uuid"},"name":{"type":"string"},"sort_order":{"type":"integer","format":"int32"},"space_id":{"type":"string","format":"uuid"},"starred":{"type":"integer","format":"int32"},"started_at":{"type":["string","null"],"format":"date-time"},"state":{"$ref":"#/components/schemas/ProjectState"},"target_date":{"type":["string","null"],"format":"date"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PullRequestCommentView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","pull_request_id","user_id","body","created_at"],"properties":{"body":{"type":"string"},"commit_sha":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"line":{"type":["integer","null"],"format":"int32"},"path":{"type":["string","null"]},"pull_request_id":{"type":"string","format":"uuid"},"review_id":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PullRequestPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PullRequestView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PullRequestReviewView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","pull_request_id","user_id","official","state","created_at"],"properties":{"commit_sha":{"type":["string","null"]},"content":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"official":{"type":"boolean"},"pull_request_id":{"type":"string","format":"uuid"},"state":{"$ref":"#/components/schemas/ReviewState"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PullRequestView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","repo_id","number","title","head_branch","base_branch","author_id","state","is_locked","has_merged","created_at","comments_count","reviews_count"],"properties":{"author_id":{"type":"string","format":"uuid"},"base_branch":{"type":"string"},"base_sha":{"type":["string","null"]},"body":{"type":["string","null"]},"closed_at":{"type":["string","null"]},"comments_count":{"type":"integer","format":"int64"},"created_at":{"type":"string"},"has_merged":{"type":"boolean"},"head_branch":{"type":"string"},"head_sha":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_locked":{"type":"boolean"},"mergeable":{"type":["boolean","null"]},"mergeable_state":{"type":["string","null"]},"merged_at":{"type":["string","null"]},"merged_commit_sha":{"type":["string","null"]},"merger_id":{"type":["string","null"]},"number":{"type":"integer","format":"int64"},"repo_id":{"type":"string","format":"uuid"},"reviews_count":{"type":"integer","format":"int64"},"state":{"$ref":"#/components/schemas/PrState"},"title":{"type":"string"},"updated_at":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_PushSubscriptionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","platform","endpoint","created_at"],"properties":{"created_at":{"type":"string"},"endpoint":{"type":"string"},"id":{"type":"string","format":"uuid"},"platform":{"$ref":"#/components/schemas/PushPlatform"},"user_agent":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ReactionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","scope","target_id","user_id","emoji","created_at"],"properties":{"created_at":{"type":"string"},"emoji":{"type":"string"},"id":{"type":"string","format":"uuid"},"scope":{"$ref":"#/components/schemas/ReactionScope"},"target_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ReclaimResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sent","temp_key"],"properties":{"sent":{"type":"boolean"},"temp_key":{"$ref":"#/components/schemas/TempKey"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RefreshResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["access_token","refresh_token","token_type","expires_in"],"properties":{"access_token":{"type":"string"},"expires_in":{"type":"integer","format":"int64"},"refresh_token":{"type":"string"},"token_type":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RegenerateRecoveryResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["codes"],"properties":{"codes":{"type":"array","items":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RegisterResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["uid","pending","temp_key","purpose"],"properties":{"pending":{"type":"boolean"},"purpose":{"type":"string"},"temp_key":{"$ref":"#/components/schemas/TempKey"},"uid":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ReleaseAttachmentListResponse":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ReleaseAttachmentView"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ReleaseAttachmentView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","name","size","download_url","created_at"],"properties":{"created_at":{"type":"string"},"download_url":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ReleasePage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ReleaseView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ReleaseView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","repo_id","tag_name","target","title","sha","num_commits","is_draft","is_prerelease","is_tag","url","html_url","tarball_url","zipball_url","upload_url","publisher","attachments","created_at","updated_at"],"properties":{"attachments":{"type":"array","items":{"$ref":"#/components/schemas/ReleaseAttachment"}},"content":{"type":["string","null"]},"created_at":{"type":"string"},"html_url":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_draft":{"type":"boolean"},"is_prerelease":{"type":"boolean"},"is_tag":{"type":"boolean"},"num_commits":{"type":"integer","format":"int32"},"publisher":{"$ref":"#/components/schemas/UserSummary"},"repo_id":{"type":"string","format":"uuid"},"sha":{"type":"string"},"tag_name":{"type":"string"},"tarball_url":{"type":"string"},"target":{"type":"string"},"title":{"type":"string"},"updated_at":{"type":"string"},"upload_url":{"type":"string"},"url":{"type":"string"},"zipball_url":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RepoCollaboratorPermission":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["permission","role","user"],"properties":{"permission":{"type":"string"},"role":{"type":"string"},"user":{"$ref":"#/components/schemas/UserSummary"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RepoPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/RepoView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RepoRelView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","issue_id","repo_id","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"},"repo_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RepoSummary":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","name","full_name","empty","private","fork","template","mirror","size","stars_count","forks_count","watchers_count","open_issues_count"],"properties":{"description":{"type":["string","null"]},"empty":{"type":"boolean"},"fork":{"type":"boolean"},"forks_count":{"type":"integer","format":"int32"},"full_name":{"type":"string"},"id":{"type":"string","format":"uuid"},"mirror":{"type":"boolean"},"name":{"type":"string"},"open_issues_count":{"type":"integer","format":"int32"},"private":{"type":"boolean"},"size":{"type":"integer","format":"int64"},"stars_count":{"type":"integer","format":"int32"},"template":{"type":"boolean"},"watchers_count":{"type":"integer","format":"int32"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RepoView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","channel_id","space_id","name","lower_name","full_name","default_branch","enable_lfs","is_private","is_archived","is_fork","is_template","is_mirror","empty","size","git_size","lfs_size","nums_watch","nums_star","nums_pr","nums_commits","nums_branches","nums_tags","allow_rebase","allow_rebase_explicit","allow_squash_merge","allow_merge_commits","allow_fast_forward_only_merge","allow_rebase_update","allow_merge_update","allow_manual_merge","autodetect_manual_merge","default_delete_branch_after_merge","default_allow_maintainer_edit","ignore_whitespace_conflicts","object_format","has_code","has_issues","has_wiki","has_pull_requests","has_projects","has_releases","has_packages","has_actions","projects_mode","languages","licenses","topics","html_url","url","link","ssh_url","clone_url","created_at","updated_at"],"properties":{"allow_fast_forward_only_merge":{"type":"boolean"},"allow_manual_merge":{"type":"boolean"},"allow_merge_commits":{"type":"boolean"},"allow_merge_update":{"type":"boolean"},"allow_rebase":{"type":"boolean"},"allow_rebase_explicit":{"type":"boolean"},"allow_rebase_update":{"type":"boolean"},"allow_squash_merge":{"type":"boolean"},"archived_at":{"type":["string","null"]},"autodetect_manual_merge":{"type":"boolean"},"avatar_url":{"type":["string","null"]},"channel":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ChannelSummary"}]},"channel_id":{"type":"string","format":"uuid"},"clone_url":{"type":"string"},"created_at":{"type":"string"},"default_allow_maintainer_edit":{"type":"boolean"},"default_branch":{"type":"string"},"default_delete_branch_after_merge":{"type":"boolean"},"description":{"type":["string","null"]},"empty":{"type":"boolean"},"enable_lfs":{"type":"boolean"},"full_name":{"type":"string"},"git_size":{"type":"integer","format":"int64"},"has_actions":{"type":"boolean"},"has_code":{"type":"boolean"},"has_issues":{"type":"boolean"},"has_packages":{"type":"boolean"},"has_projects":{"type":"boolean"},"has_pull_requests":{"type":"boolean"},"has_releases":{"type":"boolean"},"has_wiki":{"type":"boolean"},"html_url":{"type":"string"},"id":{"type":"string","format":"uuid"},"ignore_whitespace_conflicts":{"type":"boolean"},"is_archived":{"type":"boolean"},"is_fork":{"type":"boolean"},"is_mirror":{"type":"boolean"},"is_private":{"type":"boolean"},"is_template":{"type":"boolean"},"languages":{"type":"array","items":{"type":"string"}},"last_pushed_at":{"type":["string","null"]},"lfs_size":{"type":"integer","format":"int64"},"license_name":{"type":["string","null"]},"licenses":{"type":"array","items":{"type":"string"}},"link":{"type":"string"},"lower_name":{"type":"string"},"name":{"type":"string"},"nums_branches":{"type":"integer","format":"int32"},"nums_commits":{"type":"integer","format":"int32"},"nums_pr":{"type":"integer","format":"int32"},"nums_star":{"type":"integer","format":"int32"},"nums_tags":{"type":"integer","format":"int32"},"nums_watch":{"type":"integer","format":"int32"},"object_format":{"type":"string"},"parent":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/RepoView"}]},"primary_language":{"type":["string","null"]},"projects_mode":{"type":"string"},"size":{"type":"integer","format":"int64"},"space":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SpaceSummary"}]},"space_id":{"type":"string","format":"uuid"},"ssh_url":{"type":"string"},"storage_limit_size":{"type":["integer","null"],"format":"int64"},"topics":{"type":"array","items":{"type":"string"}},"updated_at":{"type":"string"},"url":{"type":"string"},"website":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ReportView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","reported_uid","reason","status","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"evidence":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"reason":{"type":"string"},"reported_uid":{"type":"string","format":"uuid"},"reporter_uid":{"type":["string","null"],"format":"uuid"},"resolution_note":{"type":["string","null"]},"resolver_uid":{"type":["string","null"],"format":"uuid"},"status":{"$ref":"#/components/schemas/ReportStatus"},"updated_at":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ResendCodeResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sent","temp_key"],"properties":{"sent":{"type":"boolean"},"temp_key":{"$ref":"#/components/schemas/TempKey"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ResetPasswordResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RevokeAllResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["revoked"],"properties":{"revoked":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RoleOverwriteView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","space_id","channel_id","role_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"channel_id":{"type":"string","format":"uuid"},"deny_mask":{"type":"integer","format":"int64"},"id":{"type":"string","format":"uuid"},"role_id":{"type":"string","format":"uuid"},"space_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RolePage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/RoleView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_RoleView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","space_id","name","position","color","version","created_at","created_by","permissions"],"properties":{"color":{"type":"string"},"created_at":{"type":"string"},"created_by":{"type":"string","format":"uuid"},"icon_hash":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}},"position":{"type":"integer","format":"int64"},"space_id":{"type":"string","format":"uuid"},"unicode_emoji":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"version":{"type":"integer","format":"int32"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SavedMessageView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","channel_id","message_id","saved_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"id":{"type":"string","format":"uuid"},"message_id":{"type":"string","format":"uuid"},"saved_at":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SearchResults":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["data","ok"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RepoSummary"}},"ok":{"type":"boolean"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SetPrimaryEmailResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["email"],"properties":{"email":{"$ref":"#/components/schemas/EmailView"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SpaceBanPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SpaceBanView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SpaceBanView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["space_id","user_id","banned_by","created_at","updated_at","allow_agent_join","allow_speak","allow_push_repo","allow_comment_any"],"properties":{"allow_agent_join":{"type":"boolean"},"allow_comment_any":{"type":"boolean"},"allow_push_repo":{"type":"boolean"},"allow_speak":{"type":"boolean"},"banned_by":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"reason":{"type":["string","null"]},"space_id":{"type":"string","format":"uuid"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SpaceInvitePage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SpaceInviteView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SpaceInviteView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","space_id","user_id","email","role_ids","created_at"],"properties":{"accepted_at":{"type":["string","null"]},"created_at":{"type":"string"},"email":{"type":"string"},"expires_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"revoked_at":{"type":["string","null"]},"role_ids":{"type":"array","items":{"type":"string","format":"uuid"}},"space_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SpaceMemberPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SpaceMemberView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SpaceMemberView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["space_id","user_id","status","joined_at","created_at","message_notifications","muted","mobile_push","suppress_everyone","suppress_roles","hide_muted_channels"],"properties":{"alias_avatar_url":{"type":["string","null"]},"alias_name":{"type":["string","null"]},"created_at":{"type":"string"},"hide_muted_channels":{"type":"boolean"},"invited_at":{"type":["string","null"]},"invited_by":{"type":["string","null"],"format":"uuid"},"joined_at":{"type":"string"},"last_active_at":{"type":["string","null"]},"left_at":{"type":["string","null"]},"message_notifications":{"$ref":"#/components/schemas/MessageNotifications"},"mobile_push":{"type":"boolean"},"mute_until":{"type":["string","null"]},"muted":{"type":"boolean"},"space_id":{"type":"string","format":"uuid"},"status":{"$ref":"#/components/schemas/SpaceMemberStatus"},"suppress_everyone":{"type":"boolean"},"suppress_roles":{"type":"boolean"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SpacePage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SpaceView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SpaceView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","name","owner_id","public","is_active","allow_join","allow_invite","member_count","allow_join_level","member_must_enable_2fa","created_at","updated_at"],"properties":{"allow_invite":{"type":"boolean"},"allow_join":{"type":"boolean"},"allow_join_level":{"$ref":"#/components/schemas/SpaceAllowJoinLevel"},"avatar_url":{"type":["string","null"]},"created_at":{"type":"string"},"description":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"member_count":{"type":"integer","format":"int64"},"member_must_enable_2fa":{"type":"boolean"},"name":{"type":"string"},"owner_id":{"type":"string","format":"uuid"},"public":{"type":"boolean"},"updated_at":{"type":"string"},"welcome_message":{"type":["string","null"]}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SshKeyView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","name","key_type","fingerprint","created_at"],"properties":{"created_at":{"type":"string"},"fingerprint":{"type":"string"},"id":{"type":"string","format":"uuid"},"key_type":{"$ref":"#/components/schemas/SshKeyType"},"last_used_at":{"type":["string","null"]},"name":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_StopwatchView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","issue_id","user_id","started_at","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"},"started_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SubscriberPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SubscriberView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Subscription":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["user_id","repo_id","mode","created_at"],"properties":{"created_at":{"type":"string"},"mode":{"type":"string"},"repo_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SuspensionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","user_id","suspension_type","starts_at","created_at"],"properties":{"created_at":{"type":"string"},"ends_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"reason":{"type":["string","null"]},"revoked_at":{"type":["string","null"]},"revoked_by":{"type":["string","null"],"format":"uuid"},"starts_at":{"type":"string"},"suspended_by":{"type":["string","null"],"format":"uuid"},"suspension_type":{"$ref":"#/components/schemas/SuspensionType"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SyncResult":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["repo_id","branches_added","tags_added","commits_added","size_bytes"],"properties":{"branches_added":{"type":"integer","format":"int64"},"commits_added":{"type":"integer","format":"int64"},"repo_id":{"type":"string","format":"uuid"},"size_bytes":{"type":"integer","format":"int64"},"tags_added":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_SyncStatus":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["repo_id","branches_total","tags_total","commits_total","size","synced_at"],"properties":{"branches_total":{"type":"integer","format":"int64"},"commits_total":{"type":"integer","format":"int64"},"last_pushed_at":{"type":["string","null"]},"primary_language":{"type":["string","null"]},"repo_id":{"type":"string","format":"uuid"},"size":{"type":"integer","format":"int64"},"synced_at":{"type":"string"},"tags_total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_TagPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/TagView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_TagProtectionPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/TagProtectionView"}},"total":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_TagProtectionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","repo_id","name_pattern","whitelist_usernames","whitelist_teams","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"name_pattern":{"type":"string"},"repo_id":{"type":"string","format":"uuid"},"updated_at":{"type":"string"},"whitelist_teams":{"type":"array","items":{"type":"string"}},"whitelist_usernames":{"type":"array","items":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_TagView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","repo_id","name","tag_type","commit_sha","commit","message","zipball_url","tarball_url","created_at"],"properties":{"commit":{"$ref":"#/components/schemas/CommitMeta"},"commit_sha":{"type":"string"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"message":{"type":"string"},"name":{"type":"string"},"repo_id":{"type":"string","format":"uuid"},"tag_type":{"type":"string"},"tarball_url":{"type":"string"},"zipball_url":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_TopicList":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["topics"],"properties":{"topics":{"type":"array","items":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_TopicSearchResult":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["topics"],"properties":{"topics":{"type":"array","items":{"$ref":"#/components/schemas/TopicView"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_TreeView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["sha","entries"],"properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/TreeEntryView"}},"sha":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_UnreadCountResp":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["count"],"properties":{"count":{"type":"integer","format":"int64"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_UserMe":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["uid","username","display_name","avatar","is_active","is_admin","is_restricted"],"properties":{"avatar":{"type":"string"},"display_name":{"type":"string"},"is_active":{"type":"boolean"},"is_admin":{"type":"boolean"},"is_restricted":{"type":"boolean"},"language":{"type":["string","null"]},"locale":{"type":["string","null"]},"timezone":{"type":["string","null"]},"uid":{"type":"string"},"username":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_UserOverwriteView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["channel_id","user_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"channel_id":{"type":"string","format":"uuid"},"deny_mask":{"type":"integer","format":"int64"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_UserPreferences":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["user_id","theme_mode","in_app_flags","email_flags","push_flags","email_digest","allow_dms_from","allow_mentions_from","show_online_status","created_at","updated_at"],"properties":{"allow_dms_from":{"$ref":"#/components/schemas/Audience"},"allow_mentions_from":{"$ref":"#/components/schemas/Audience"},"created_at":{"type":"string"},"diff_view_style":{"type":["string","null"]},"email_digest":{"type":"boolean"},"email_flags":{"type":"integer","format":"int32"},"in_app_flags":{"type":"integer","format":"int32"},"mute_until":{"type":["string","null"]},"push_flags":{"type":"integer","format":"int32"},"show_online_status":{"type":"boolean"},"theme_mode":{"type":"string"},"theme_token":{"type":["string","null"]},"theme_version":{"type":["integer","null"],"format":"int64"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_UserPublic":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["uid","username","display_name","avatar","visibility","bot","system","created_at"],"properties":{"avatar":{"type":"string"},"bot":{"type":"boolean"},"created_at":{"type":"string"},"display_name":{"type":"string"},"language":{"type":["string","null"]},"locale":{"type":["string","null"]},"system":{"type":"boolean"},"timezone":{"type":["string","null"]},"uid":{"type":"string","format":"uuid"},"username":{"type":"string"},"visibility":{"$ref":"#/components/schemas/ProfileVisibility"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_AccessKeyView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","name","token_last_eight","scope","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"scope":{"$ref":"#/components/schemas/AccessKeyScope"},"token_last_eight":{"type":"string"},"updated_at":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_AgreementDoc":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["key","version","updated_at","title","content_md"],"properties":{"content_md":{"type":"string"},"key":{"type":"string"},"title":{"type":"string"},"updated_at":{"type":"string"},"version":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_BlockedSummary":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["user","since"],"properties":{"since":{"type":"string"},"user":{"$ref":"#/components/schemas/UserPublic"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_CollectionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","channel_id","name","nums_open_issue","nums_closed_issue","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"nums_closed_issue":{"type":"integer","format":"int64"},"nums_open_issue":{"type":"integer","format":"int64"},"updated_at":{"type":["string","null"]}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_DeletionRequestView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","user_id","status","created_at","updated_at"],"properties":{"cancelled_at":{"type":["string","null"]},"completed_at":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"reason":{"type":["string","null"]},"scheduled_for":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/DeletionStatus"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_DeviceView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","is_trusted","first_seen_at","last_seen_at","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"device_name":{"type":["string","null"]},"device_type":{"type":["string","null"]},"first_seen_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_trusted":{"type":"boolean"},"last_seen_at":{"type":"string"},"os":{"type":["string","null"]},"updated_at":{"type":"string"},"user_agent":{"type":["string","null"]}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_EmailView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","email","is_activated","is_primary","created_at","updated_at"],"properties":{"activated_at":{"type":["string","null"]},"created_at":{"type":"string"},"email":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_activated":{"type":"boolean"},"is_primary":{"type":"boolean"},"updated_at":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_FollowerSummary":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["user","since"],"properties":{"since":{"type":"string"},"user":{"$ref":"#/components/schemas/UserPublic"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_GitRef":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["name","sha","type_"],"properties":{"name":{"type":"string"},"sha":{"type":"string"},"type_":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_IssueTemplate":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["name","title","content","fields"],"properties":{"content":{"type":"string"},"description":{"type":["string","null"]},"fields":{"type":"array","items":{"$ref":"#/components/schemas/IssueTemplateField"}},"name":{"type":"string"},"title":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_MemeView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","name","content_type","url","size","created_at"],"properties":{"content_type":{"type":"string"},"created_at":{"type":"string"},"height":{"type":["integer","null"],"format":"int32"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"},"url":{"type":"string"},"width":{"type":["integer","null"],"format":"int32"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_NotificationView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","notification_type","title","created_at"],"properties":{"actor_uid":{"type":["string","null"],"format":"uuid"},"body":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"notification_type":{"$ref":"#/components/schemas/NotificationType"},"read_at":{"type":["string","null"]},"title":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_OAuthProviderInfo":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["name","display_name","authorize_url"],"properties":{"authorize_url":{"type":"string"},"display_name":{"type":"string"},"name":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_PostLabelView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","channel_id","name","color","is_archived","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"color":{"type":"string"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_archived":{"type":"boolean"},"name":{"type":"string"},"updated_at":{"type":["string","null"]}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_PostMentionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","target","target_id","is_everyone","is_here","created_at"],"properties":{"channel_id":{"type":["string","null"],"format":"uuid"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_everyone":{"type":"boolean"},"is_here":{"type":"boolean"},"role_id":{"type":["string","null"],"format":"uuid"},"target":{"$ref":"#/components/schemas/PostTargetView"},"target_id":{"type":"string","format":"uuid"},"user_id":{"type":["string","null"],"format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_PostReactionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","target","target_id","user_id","emoji","created_at"],"properties":{"created_at":{"type":"string"},"emoji":{"type":"string"},"id":{"type":"string","format":"uuid"},"target":{"$ref":"#/components/schemas/PostTargetView"},"target_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_PullRequestCommentView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","pull_request_id","user_id","body","created_at"],"properties":{"body":{"type":"string"},"commit_sha":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"line":{"type":["integer","null"],"format":"int32"},"path":{"type":["string","null"]},"pull_request_id":{"type":"string","format":"uuid"},"review_id":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_PullRequestEventView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","pull_request_id","user_id","event_type","created_at"],"properties":{"commit_sha":{"type":["string","null"]},"content":{"type":["string","null"]},"created_at":{"type":"string"},"event_type":{"type":"string"},"id":{"type":"string","format":"uuid"},"pull_request_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_PullRequestReviewView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","pull_request_id","user_id","official","state","created_at"],"properties":{"commit_sha":{"type":["string","null"]},"content":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"official":{"type":"boolean"},"pull_request_id":{"type":"string","format":"uuid"},"state":{"$ref":"#/components/schemas/ReviewState"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_PushSubscriptionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","platform","endpoint","created_at"],"properties":{"created_at":{"type":"string"},"endpoint":{"type":"string"},"id":{"type":"string","format":"uuid"},"platform":{"$ref":"#/components/schemas/PushPlatform"},"user_agent":{"type":["string","null"]}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_RecentMentionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","channel_id","message_id","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"message_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_RecoveryCodeView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","created_at"],"properties":{"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"used_at":{"type":["string","null"]}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_ReportView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","reported_uid","reason","status","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"evidence":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"reason":{"type":"string"},"reported_uid":{"type":"string","format":"uuid"},"reporter_uid":{"type":["string","null"],"format":"uuid"},"resolution_note":{"type":["string","null"]},"resolver_uid":{"type":["string","null"],"format":"uuid"},"status":{"$ref":"#/components/schemas/ReportStatus"},"updated_at":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_RoleOverwriteView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","space_id","channel_id","role_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"channel_id":{"type":"string","format":"uuid"},"deny_mask":{"type":"integer","format":"int64"},"id":{"type":"string","format":"uuid"},"role_id":{"type":"string","format":"uuid"},"space_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_SavedMessageView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","channel_id","message_id","saved_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"id":{"type":"string","format":"uuid"},"message_id":{"type":"string","format":"uuid"},"saved_at":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_ScheduledMessageView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","target_channel_id","payload","scheduled_at","status","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"payload":{"type":"string"},"scheduled_at":{"type":"string"},"status":{"$ref":"#/components/schemas/ScheduledMessageStatus"},"target_channel_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_SessionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","kind","is_revoked","created_at","expires_at"],"properties":{"app_id":{"type":["string","null"]},"client_ip_hash":{"type":["string","null"]},"created_at":{"type":"string"},"expires_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_revoked":{"type":"boolean"},"kind":{"$ref":"#/components/schemas/SessionKind"},"replaced_at":{"type":["string","null"]},"user_agent_hash":{"type":["string","null"]}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_SshKeyView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","name","key_type","fingerprint","created_at"],"properties":{"created_at":{"type":"string"},"fingerprint":{"type":"string"},"id":{"type":"string","format":"uuid"},"key_type":{"$ref":"#/components/schemas/SshKeyType"},"last_used_at":{"type":["string","null"]},"name":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_SuspensionView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","user_id","suspension_type","starts_at","created_at"],"properties":{"created_at":{"type":"string"},"ends_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"reason":{"type":["string","null"]},"revoked_at":{"type":["string","null"]},"revoked_by":{"type":["string","null"],"format":"uuid"},"starts_at":{"type":"string"},"suspended_by":{"type":["string","null"],"format":"uuid"},"suspension_type":{"$ref":"#/components/schemas/SuspensionType"},"user_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_UserMini":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["id","login"],"properties":{"avatar_url":{"type":["string","null"]},"email":{"type":["string","null"]},"full_name":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"login":{"type":"string"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_Vec_UserOverwriteView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"array","items":{"type":"object","required":["channel_id","user_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"channel_id":{"type":"string","format":"uuid"},"deny_mask":{"type":"integer","format":"int64"},"user_id":{"type":"string","format":"uuid"}}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_VerifyCodeResult":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["code_row_id"],"properties":{"code_row_id":{"type":"string"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ViewPage":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ViewView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_ViewView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","project_id","creator_id","name","filter","sort_by","layout","is_shared","sort_order","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"creator_id":{"type":"string","format":"uuid"},"description":{"type":["string","null"]},"filter":{},"group_by":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_shared":{"type":"boolean"},"layout":{"type":"string"},"name":{"type":"string"},"project_id":{"type":"string","format":"uuid"},"sort_by":{"type":"string"},"sort_order":{"type":"integer","format":"int32"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"AppResponseData_WatchView":{"type":"object","required":["code","message","duration","request_id","at","log_id"],"properties":{"at":{"type":"string"},"code":{"type":"integer","format":"int32"},"data":{"type":"object","required":["id","user_id","mode","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":["string","null"],"format":"uuid"},"mode":{"type":"string"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"duration":{"type":"string"},"error":{"type":["string","null"]},"log_id":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}},"ApplyDiffPatchFileOptions":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["content"],"properties":{"content":{"type":"string"},"sha":{"type":["string","null"]}}}]},"ArchiveFormatQuery":{"type":"object","properties":{"format":{"type":["string","null"]},"ref_name":{"type":["string","null"]}}},"ArchiveRepoOption":{"type":"object","required":["archived"],"properties":{"archived":{"type":"boolean"}}},"AssignRoleCmd":{"type":"object","required":["role_id"],"properties":{"role_id":{"type":"string","format":"uuid"}}},"AttachmentPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/AttachmentView"}},"total":{"type":"integer","format":"int64"}}},"AttachmentView":{"type":"object","required":["id","owner_type","owner_id","filename","content_type","size","url","created_at"],"properties":{"content_type":{"type":"string"},"created_at":{"type":"string"},"filename":{"type":"string"},"id":{"type":"string","format":"uuid"},"owner_id":{"type":"string","format":"uuid"},"owner_type":{"type":"string"},"size":{"type":"integer","format":"int64"},"uploaded_by":{"type":["string","null"],"format":"uuid"},"url":{"type":"string"}}},"Audience":{"type":"string","enum":["everyone","following_only","nobody"]},"AuthorizationUrlResp":{"type":"object","required":["url","temp_key"],"properties":{"temp_key":{"$ref":"#/components/schemas/TempKey"},"url":{"type":"string"}}},"AuthorizeCmd":{"type":"object","required":["provider","code_verifier"],"properties":{"app_id":{"type":["string","null"]},"code_verifier":{"type":"string"},"provider":{"$ref":"#/components/schemas/OAuthProvider"}}},"AvatarFormat":{"type":"string","enum":["jpg","png","webp","gif"]},"AvatarView":{"type":"object","required":["uid","url","format","bytes","updated_at"],"properties":{"bytes":{"type":"integer","format":"int64","minimum":0},"format":{"$ref":"#/components/schemas/AvatarFormat"},"uid":{"type":"string","format":"uuid"},"updated_at":{"type":"string"},"url":{"type":"string"}}},"BlobView":{"type":"object","required":["sha","size","encoding","content"],"properties":{"content":{"type":"string"},"encoding":{"type":"string"},"sha":{"type":"string"},"size":{"type":"integer","format":"int64"}}},"BlockedSummary":{"type":"object","required":["user","since"],"properties":{"since":{"type":"string"},"user":{"$ref":"#/components/schemas/UserPublic"}}},"BranchPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BranchView"}},"total":{"type":"integer","format":"int64"}}},"BranchProtectionPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BranchProtectionView"}},"total":{"type":"integer","format":"int64"}}},"BranchProtectionView":{"type":"object","required":["id","repo_id","branch_name","rule_name","priority","enable_push","enable_push_whitelist","push_whitelist_usernames","push_whitelist_teams","push_whitelist_deploy_keys","enable_force_push","enable_force_push_allowlist","force_push_allowlist_usernames","force_push_allowlist_teams","force_push_allowlist_deploy_keys","enable_merge_whitelist","merge_whitelist_usernames","merge_whitelist_teams","enable_bypass_allowlist","bypass_allowlist_usernames","bypass_allowlist_teams","enable_approvals_whitelist","approvals_whitelist_usernames","approvals_whitelist_teams","required_approvals","block_on_rejected_reviews","block_on_change_requested_reviews","block_on_outdated_branch","dismiss_stale_approvals","ignore_stale_approvals","require_signed_commits","block_admin_merge_override","protected_file_patterns","unprotected_file_patterns","created_at","updated_at"],"properties":{"approvals_whitelist_teams":{"type":"array","items":{"type":"string"}},"approvals_whitelist_usernames":{"type":"array","items":{"type":"string"}},"block_admin_merge_override":{"type":"boolean"},"block_on_change_requested_reviews":{"type":"boolean"},"block_on_outdated_branch":{"type":"boolean"},"block_on_rejected_reviews":{"type":"boolean"},"branch_name":{"type":"string"},"branch_pattern":{"type":["string","null"]},"bypass_allowlist_teams":{"type":"array","items":{"type":"string"}},"bypass_allowlist_usernames":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"dismiss_stale_approvals":{"type":"boolean"},"enable_approvals_whitelist":{"type":"boolean"},"enable_bypass_allowlist":{"type":"boolean"},"enable_force_push":{"type":"boolean"},"enable_force_push_allowlist":{"type":"boolean"},"enable_merge_whitelist":{"type":"boolean"},"enable_push":{"type":"boolean"},"enable_push_whitelist":{"type":"boolean"},"force_push_allowlist_deploy_keys":{"type":"boolean"},"force_push_allowlist_teams":{"type":"array","items":{"type":"string"}},"force_push_allowlist_usernames":{"type":"array","items":{"type":"string"}},"id":{"type":"string","format":"uuid"},"ignore_stale_approvals":{"type":"boolean"},"merge_whitelist_teams":{"type":"array","items":{"type":"string"}},"merge_whitelist_usernames":{"type":"array","items":{"type":"string"}},"priority":{"type":"integer","format":"int64"},"protected_file_patterns":{"type":"string"},"push_whitelist_deploy_keys":{"type":"boolean"},"push_whitelist_teams":{"type":"array","items":{"type":"string"}},"push_whitelist_usernames":{"type":"array","items":{"type":"string"}},"repo_id":{"type":"string","format":"uuid"},"require_signed_commits":{"type":"boolean"},"required_approvals":{"type":"integer","format":"int32"},"rule_name":{"type":"string"},"unprotected_file_patterns":{"type":"string"},"updated_at":{"type":"string"}}},"BranchView":{"type":"object","required":["id","repo_id","name","commit_sha","is_protected","protected","required_approvals","enable_status_check","status_check_contexts","user_can_push","user_can_merge","effective_branch_protection_name","is_deleted","created_at","updated_at"],"properties":{"commit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CommitMeta"}]},"commit_sha":{"type":"string"},"created_at":{"type":"string"},"deleted_at":{"type":["string","null"]},"effective_branch_protection_name":{"type":"string"},"enable_status_check":{"type":"boolean"},"id":{"type":"string","format":"uuid"},"is_deleted":{"type":"boolean"},"is_protected":{"type":"boolean"},"name":{"type":"string"},"protected":{"type":"boolean"},"repo_id":{"type":"string","format":"uuid"},"required_approvals":{"type":"integer","format":"int64"},"status_check_contexts":{"type":"array","items":{"type":"string"}},"updated_at":{"type":"string"},"user_can_merge":{"type":"boolean"},"user_can_push":{"type":"boolean"}}},"CallbackCmd":{"type":"object","required":["provider","code","state","temp_key_value"],"properties":{"app_id":{"type":["string","null"]},"code":{"type":"string"},"provider":{"$ref":"#/components/schemas/OAuthProvider"},"state":{"type":"string"},"temp_key_value":{"type":"string"}}},"ChangeFileEntry":{"type":"object","required":["operation","path"],"properties":{"content":{"type":["string","null"]},"from_path":{"type":["string","null"]},"operation":{"type":"string"},"path":{"type":"string"},"sha":{"type":["string","null"]}}},"ChangeFilesOptions":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["files"],"properties":{"files":{"type":"array","items":{"$ref":"#/components/schemas/ChangeFileEntry"}}}}]},"ChannelPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ChannelView"}},"total":{"type":"integer","format":"int64"}}},"ChannelSummary":{"type":"object","required":["id","space_id","name"],"properties":{"display_name":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"space_id":{"type":"string","format":"uuid"}}},"ChannelView":{"type":"object","required":["id","name","kind","position","is_archived","created_at","updated_at","created_by"],"properties":{"archived_at":{"type":["string","null"]},"archived_by":{"type":["string","null"],"format":"uuid"},"color":{"type":["string","null"]},"created_at":{"type":"string"},"created_by":{"type":"string","format":"uuid"},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_archived":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"parent_id":{"type":["string","null"],"format":"uuid"},"position":{"type":"integer","format":"int32"},"purpose":{"type":["string","null"]},"space_id":{"type":["string","null"],"format":"uuid"},"topic":{"type":["string","null"]},"updated_at":{"type":"string"}}},"CloseIssueOption":{"type":"object","required":["closed"],"properties":{"closed":{"type":"boolean"}}},"CollaboratorPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CollaboratorView"}},"total":{"type":"integer","format":"int64"}}},"CollaboratorView":{"type":"object","required":["id","repo_id","user_id","mode","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"mode":{"type":"string"},"repo_id":{"type":"string","format":"uuid"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"CollectionPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CollectionView"}},"total":{"type":"integer","format":"int64"}}},"CollectionView":{"type":"object","required":["id","channel_id","name","nums_open_issue","nums_closed_issue","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"nums_closed_issue":{"type":"integer","format":"int64"},"nums_open_issue":{"type":"integer","format":"int64"},"updated_at":{"type":["string","null"]}}},"CombinedStatusView":{"type":"object","required":["sha","state","statuses","total_count"],"properties":{"sha":{"type":"string"},"state":{"type":"string"},"statuses":{"type":"array","items":{"$ref":"#/components/schemas/CommitStatusView"}},"total_count":{"type":"integer","format":"int64"}}},"CommentPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CommentView"}},"total":{"type":"integer","format":"int64"}}},"CommentView":{"type":"object","required":["id","poster_id","content","created_at"],"properties":{"content":{"type":"string"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":["string","null"],"format":"uuid"},"parent_id":{"type":["string","null"],"format":"uuid"},"poster_id":{"type":"string","format":"uuid"},"updated_at":{"type":["string","null"]}}},"CommitDateOptions":{"type":"object","properties":{"author":{"type":["string","null"]},"committer":{"type":["string","null"]}}},"CommitDiffPayload":{"type":"object","required":["sha","format","content"],"properties":{"content":{"type":"string"},"format":{"type":"string"},"sha":{"type":"string"}}},"CommitMeta":{"type":"object","required":["sha","message"],"properties":{"author_email":{"type":["string","null"]},"author_name":{"type":["string","null"]},"authored_at":{"type":["string","null"]},"committed_at":{"type":["string","null"]},"committer_email":{"type":["string","null"]},"committer_name":{"type":["string","null"]},"message":{"type":"string"},"sha":{"type":"string"},"tree_sha":{"type":["string","null"]}}},"CommitStatusPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CommitStatusView"}},"total":{"type":"integer","format":"int64"}}},"CommitStatusView":{"type":"object","required":["id","repo_id","sha","state","context","url","creator","created_at"],"properties":{"context":{"type":"string"},"created_at":{"type":"string"},"creator":{"$ref":"#/components/schemas/CommitUserSummary"},"description":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"repo_id":{"type":"string","format":"uuid"},"sha":{"type":"string"},"state":{"type":"string"},"target_url":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"url":{"type":"string"}}},"CommitSummary":{"type":"object","required":["sha","message","parent_shas","tree_sha"],"properties":{"author":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/UserMini"}]},"authored_at":{"type":["string","null"]},"committed_at":{"type":["string","null"]},"committer":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/UserMini"}]},"message":{"type":"string"},"parent_shas":{"type":"array","items":{"type":"string"}},"sha":{"type":"string"},"tree_sha":{"type":"string"}}},"CommitUserSummary":{"type":"object","required":["id","login"],"properties":{"avatar_url":{"type":["string","null"]},"full_name":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"login":{"type":"string"}}},"CommitView":{"type":"object","required":["sha","message","parent_shas","tree_sha"],"properties":{"author_email":{"type":["string","null"]},"author_name":{"type":["string","null"]},"authored_at":{"type":["string","null"]},"committed_at":{"type":["string","null"]},"committer_email":{"type":["string","null"]},"committer_name":{"type":["string","null"]},"message":{"type":"string"},"parent_shas":{"type":"array","items":{"type":"string"}},"sha":{"type":"string"},"tree_sha":{"type":"string"}}},"CommitsResponse":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CommitSummary"}},"total":{"type":"integer","format":"int64"}}},"CompareFileDiff":{"type":"object","required":["path","additions","deletions","status"],"properties":{"additions":{"type":"integer","format":"int64"},"deletions":{"type":"integer","format":"int64"},"path":{"type":"string"},"status":{"type":"string"}}},"CompareView":{"type":"object","required":["base","head","total_commits","ahead_by","behind_by","files"],"properties":{"ahead_by":{"type":"integer","format":"int64"},"base":{"type":"string"},"behind_by":{"type":"integer","format":"int64"},"files":{"type":"array","items":{"$ref":"#/components/schemas/CompareFileDiff"}},"head":{"type":"string"},"merge_base":{"type":["string","null"]},"total_commits":{"type":"integer","format":"int64"}}},"ConfirmEmailChangeCmd":{"type":"object","required":["ticket_id"],"properties":{"ticket_id":{"type":"string","format":"uuid"}}},"ContentHistoryPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ContentHistoryView"}},"total":{"type":"integer","format":"int64"}}},"ContentHistoryView":{"type":"object","required":["id","issue_id","poster_id","edited_at","created_at"],"properties":{"comment_id":{"type":["string","null"],"format":"uuid"},"content_after":{"type":["string","null"]},"content_before":{"type":["string","null"]},"created_at":{"type":"string"},"edited_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"},"poster_id":{"type":"string","format":"uuid"}}},"ContentsExtResponse":{"type":"object","required":["dir_contents"],"properties":{"dir_contents":{"type":"array","items":{"$ref":"#/components/schemas/ContentsResponse"}},"file_contents":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ContentsResponse"}]}}},"ContentsListResponse":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ContentsResponse"}}}},"ContentsQuery":{"type":"object","properties":{"ref":{"type":["string","null"]}}},"ContentsResponse":{"type":"object","required":["name","path","sha","type","size"],"properties":{"content":{"type":["string","null"]},"download_url":{"type":["string","null"]},"encoding":{"type":["string","null"]},"git_url":{"type":["string","null"]},"html_url":{"type":["string","null"]},"last_author_date":{"type":["string","null"]},"last_commit_message":{"type":["string","null"]},"last_commit_sha":{"type":["string","null"]},"last_committer_date":{"type":["string","null"]},"lfs_oid":{"type":["string","null"]},"lfs_size":{"type":["integer","null"],"format":"int64"},"links":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/FileLinksResponse"}]},"name":{"type":"string"},"path":{"type":"string"},"sha":{"type":"string"},"size":{"type":"integer","format":"int64"},"submodule_git_url":{"type":["string","null"]},"target":{"type":["string","null"]},"type":{"type":"string"},"url":{"type":["string","null"]}}},"CreateAccessKeyCmd":{"type":"object","required":["name","scope"],"properties":{"name":{"type":"string"},"scope":{"$ref":"#/components/schemas/AccessKeyScope"}}},"CreateAccessKeyResp":{"type":"object","required":["key","token"],"properties":{"key":{"$ref":"#/components/schemas/AccessKeyView"},"token":{"type":"string"}}},"CreateBanCmd":{"type":"object","required":["user_id"],"properties":{"allow_agent_join":{"type":["boolean","null"]},"allow_comment_any":{"type":["boolean","null"]},"allow_push_repo":{"type":["boolean","null"]},"allow_speak":{"type":["boolean","null"]},"expires_at":{"type":["string","null"]},"reason":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"CreateBranchOption":{"type":"object","required":["new_branch_name"],"properties":{"new_branch_name":{"type":"string"},"old_branch_name":{"type":["string","null"]},"old_ref_name":{"type":["string","null"]}}},"CreateBranchProtectionOption":{"type":"object","required":["branch_name"],"properties":{"approvals_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"approvals_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"block_admin_merge_override":{"type":["boolean","null"]},"block_on_change_requested_reviews":{"type":["boolean","null"]},"block_on_outdated_branch":{"type":["boolean","null"]},"block_on_rejected_reviews":{"type":["boolean","null"]},"branch_name":{"type":"string"},"branch_pattern":{"type":["string","null"]},"bypass_allowlist_teams":{"type":["array","null"],"items":{"type":"string"}},"bypass_allowlist_usernames":{"type":["array","null"],"items":{"type":"string"}},"dismiss_stale_approvals":{"type":["boolean","null"]},"enable_approvals_whitelist":{"type":["boolean","null"]},"enable_bypass_allowlist":{"type":["boolean","null"]},"enable_force_push":{"type":["boolean","null"]},"enable_force_push_allowlist":{"type":["boolean","null"]},"enable_merge_whitelist":{"type":["boolean","null"]},"enable_push":{"type":["boolean","null"]},"enable_push_whitelist":{"type":["boolean","null"]},"force_push_allowlist_deploy_keys":{"type":["boolean","null"]},"force_push_allowlist_teams":{"type":["array","null"],"items":{"type":"string"}},"force_push_allowlist_usernames":{"type":["array","null"],"items":{"type":"string"}},"ignore_stale_approvals":{"type":["boolean","null"]},"merge_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"merge_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"priority":{"type":["integer","null"],"format":"int64"},"protected_file_patterns":{"type":["string","null"]},"push_whitelist_deploy_keys":{"type":["boolean","null"]},"push_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"push_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"require_signed_commits":{"type":["boolean","null"]},"required_approvals":{"type":["integer","null"],"format":"int32"},"rule_name":{"type":["string","null"]},"unprotected_file_patterns":{"type":["string","null"]}}},"CreateCollectionOption":{"type":"object","required":["space_id","name"],"properties":{"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"name":{"type":"string"},"parent_dir":{"type":["string","null"],"format":"uuid"},"space_id":{"type":"string","format":"uuid"}}},"CreateCommentOption":{"type":"object","required":["content"],"properties":{"content":{"type":"string"},"parent_id":{"type":["string","null"],"format":"uuid"}}},"CreateDependencyOption":{"type":"object","required":["dependency_id"],"properties":{"dependency_id":{"type":"string","format":"uuid"}}},"CreateDeployKeyOption":{"type":"object","required":["title","key"],"properties":{"key":{"type":"string"},"read_only":{"type":["boolean","null"]},"title":{"type":"string"}}},"CreateDocumentCmd":{"type":"object","required":["title","slug"],"properties":{"content":{"type":"string"},"icon":{"type":["string","null"]},"parent_id":{"type":["string","null"],"format":"uuid"},"slug":{"type":"string"},"title":{"type":"string"}}},"CreateFileOption":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["content"],"properties":{"content":{"type":"string"}}}]},"CreateInviteCmd":{"type":"object","required":["role_ids"],"properties":{"email":{"type":["string","null"]},"expires_at":{"type":["string","null"]},"role_ids":{"type":"array","items":{"type":"string","format":"uuid"}},"user_id":{"type":["string","null"],"format":"uuid"}}},"CreateIssueOption":{"type":"object","required":["title","body"],"properties":{"body":{"type":"string"},"description":{"type":["string","null"]},"milestone_id":{"type":["string","null"],"format":"uuid"},"title":{"type":"string"}}},"CreateLabelOption":{"type":"object","required":["name","color"],"properties":{"color":{"type":"string"},"description":{"type":["string","null"]},"exclusive":{"type":["boolean","null"]},"exclusive_order":{"type":["integer","null"],"format":"int32"},"name":{"type":"string"}}},"CreateMemberOption":{"type":"object","required":["user_id","kind"],"properties":{"kind":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"CreateMentionOption":{"type":"object","required":["is_everyone","is_here"],"properties":{"is_everyone":{"type":"boolean"},"is_here":{"type":"boolean"},"role_id":{"type":["string","null"],"format":"uuid"},"user_id":{"type":["string","null"],"format":"uuid"}}},"CreateMilestoneOption":{"type":"object","required":["name"],"properties":{"description":{"type":["string","null"]},"due_at":{"type":["string","null"]},"name":{"type":"string"}}},"CreatePinOption":{"type":"object","required":["issue_id","pin_order"],"properties":{"issue_id":{"type":"string","format":"uuid"},"pin_order":{"type":"integer","format":"int32"}}},"CreatePostBoardOption":{"type":"object","required":["name"],"properties":{"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"name":{"type":"string"},"parent_dir":{"type":["string","null"],"format":"uuid"}}},"CreatePostLabelOption":{"type":"object","required":["name","color"],"properties":{"color":{"type":"string"},"name":{"type":"string"}}},"CreatePostOption":{"type":"object","required":["title","body"],"properties":{"body":{"type":"string"},"title":{"type":"string"}}},"CreatePostReactionOption":{"type":"object","required":["emoji"],"properties":{"emoji":{"type":"string"}}},"CreateProjectCmd":{"type":"object","required":["space_id","name"],"properties":{"color":{"type":["string","null"]},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"lead_id":{"type":["string","null"],"format":"uuid"},"name":{"type":"string"},"parent_dir":{"type":["string","null"],"format":"uuid"},"space_id":{"type":"string","format":"uuid"},"target_date":{"type":["string","null"],"format":"date"}}},"CreatePullRequestCommentOption":{"type":"object","required":["body"],"properties":{"body":{"type":"string"},"commit_sha":{"type":["string","null"]},"line":{"type":["integer","null"],"format":"int32"},"path":{"type":["string","null"]}}},"CreatePullRequestOption":{"type":"object","required":["title","head","base"],"properties":{"base":{"type":"string"},"body":{"type":["string","null"]},"head":{"type":"string"},"title":{"type":"string"}}},"CreateReactionOption":{"type":"object","required":["emoji"],"properties":{"emoji":{"type":"string"}}},"CreateReleaseOption":{"type":"object","required":["tag_name","title"],"properties":{"content":{"type":["string","null"]},"is_draft":{"type":["boolean","null"]},"is_prerelease":{"type":["boolean","null"]},"tag_message":{"type":["string","null"]},"tag_name":{"type":"string"},"target":{"type":["string","null"]},"title":{"type":"string"}}},"CreateReplyOption":{"type":"object","required":["body"],"properties":{"body":{"type":"string"},"parent_reply_id":{"type":["string","null"],"format":"uuid"}}},"CreateRepoOption":{"type":"object","required":["space_id","name"],"properties":{"auto_init":{"type":["boolean","null"]},"default_branch":{"type":["string","null"]},"description":{"type":["string","null"]},"enable_lfs":{"type":["boolean","null"]},"gitignores":{"type":["string","null"]},"is_private":{"type":["boolean","null"]},"issue_labels":{"type":["string","null"]},"license_name":{"type":["string","null"]},"name":{"type":"string"},"object_format":{"type":["string","null"]},"parent_dir":{"type":["string","null"],"format":"uuid"},"readme":{"type":["string","null"]},"space_id":{"type":"string","format":"uuid"},"template":{"type":["boolean","null"]},"website":{"type":["string","null"]}}},"CreateRepoRelOption":{"type":"object","required":["repo_id"],"properties":{"repo_id":{"type":"string","format":"uuid"}}},"CreateRoleCmd":{"type":"object","required":["name","permissions"],"properties":{"color":{"type":["string","null"]},"icon_hash":{"type":["string","null"]},"name":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}},"position":{"type":["integer","null"],"format":"int64"},"unicode_emoji":{"type":["string","null"]}}},"CreateSpaceCmd":{"type":"object","required":["name"],"properties":{"allow_invite":{"type":"boolean"},"allow_join":{"type":"boolean"},"allow_join_level":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SpaceAllowJoinLevel"}]},"avatar_url":{"type":["string","null"]},"description":{"type":["string","null"]},"member_must_enable_2fa":{"type":"boolean"},"name":{"type":"string"},"public":{"type":"boolean"},"welcome_message":{"type":["string","null"]}}},"CreateStatusOption":{"type":"object","required":["state","context"],"properties":{"context":{"type":"string"},"description":{"type":["string","null"]},"state":{"type":"string"},"target_url":{"type":["string","null"]}}},"CreateTagOption":{"type":"object","required":["tag_name"],"properties":{"message":{"type":["string","null"]},"tag_name":{"type":"string"},"target":{"type":["string","null"]}}},"CreateTagProtectionOption":{"type":"object","required":["name_pattern"],"properties":{"name_pattern":{"type":"string"},"whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"whitelist_usernames":{"type":["array","null"],"items":{"type":"string","format":"uuid"}}}},"CreateViewCmd":{"type":"object","required":["name"],"properties":{"description":{"type":["string","null"]},"filter":{},"group_by":{"type":["string","null"]},"is_shared":{"type":"boolean"},"layout":{"type":"string"},"name":{"type":"string"},"sort_by":{"type":"string"}}},"DeleteFileOption":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["sha"],"properties":{"sha":{"type":"string"}}}]},"DeletionRequestView":{"type":"object","required":["id","user_id","status","created_at","updated_at"],"properties":{"cancelled_at":{"type":["string","null"]},"completed_at":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"reason":{"type":["string","null"]},"scheduled_for":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/DeletionStatus"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"DeletionStatus":{"type":"string","enum":["pending","scheduled","completed","cancelled"]},"DependencyView":{"type":"object","required":["id","issue_id","dependency_id","created_at"],"properties":{"created_at":{"type":"string"},"dependency_id":{"type":"string","format":"uuid"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"}}},"DeployKeyPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DeployKeyView"}},"total":{"type":"integer","format":"int64"}}},"DeployKeyView":{"type":"object","required":["id","key_id","repo_id","title","key_type","fingerprint","content","url","read_only","created_at"],"properties":{"content":{"type":"string"},"created_at":{"type":"string"},"fingerprint":{"type":"string"},"id":{"type":"string","format":"uuid"},"key_id":{"type":"integer","format":"int64"},"key_type":{"type":"string"},"last_used_at":{"type":["string","null"]},"read_only":{"type":"boolean"},"repo_id":{"type":"string","format":"uuid"},"title":{"type":"string"},"url":{"type":"string"}}},"DeviceView":{"type":"object","required":["id","is_trusted","first_seen_at","last_seen_at","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"device_name":{"type":["string","null"]},"device_type":{"type":["string","null"]},"first_seen_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_trusted":{"type":"boolean"},"last_seen_at":{"type":"string"},"os":{"type":["string","null"]},"updated_at":{"type":"string"},"user_agent":{"type":["string","null"]}}},"DocumentPage":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DocumentView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"DocumentView":{"type":"object","required":["id","project_id","creator_id","title","slug","content","created_at"],"properties":{"content":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"creator_id":{"type":"string","format":"uuid"},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"last_editor_id":{"type":["string","null"],"format":"uuid"},"parent_id":{"type":["string","null"],"format":"uuid"},"project_id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"title":{"type":"string"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"EditBranchProtectionOption":{"type":"object","properties":{"approvals_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"approvals_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"block_admin_merge_override":{"type":["boolean","null"]},"block_on_change_requested_reviews":{"type":["boolean","null"]},"block_on_outdated_branch":{"type":["boolean","null"]},"block_on_rejected_reviews":{"type":["boolean","null"]},"branch_pattern":{"type":["string","null"]},"bypass_allowlist_teams":{"type":["array","null"],"items":{"type":"string"}},"bypass_allowlist_usernames":{"type":["array","null"],"items":{"type":"string"}},"dismiss_stale_approvals":{"type":["boolean","null"]},"enable_approvals_whitelist":{"type":["boolean","null"]},"enable_bypass_allowlist":{"type":["boolean","null"]},"enable_force_push":{"type":["boolean","null"]},"enable_force_push_allowlist":{"type":["boolean","null"]},"enable_merge_whitelist":{"type":["boolean","null"]},"enable_push":{"type":["boolean","null"]},"enable_push_whitelist":{"type":["boolean","null"]},"force_push_allowlist_deploy_keys":{"type":["boolean","null"]},"force_push_allowlist_teams":{"type":["array","null"],"items":{"type":"string"}},"force_push_allowlist_usernames":{"type":["array","null"],"items":{"type":"string"}},"ignore_stale_approvals":{"type":["boolean","null"]},"merge_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"merge_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"priority":{"type":["integer","null"],"format":"int64"},"protected_file_patterns":{"type":["string","null"]},"push_whitelist_deploy_keys":{"type":["boolean","null"]},"push_whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"push_whitelist_usernames":{"type":["array","null"],"items":{"type":"string"}},"require_signed_commits":{"type":["boolean","null"]},"required_approvals":{"type":["integer","null"],"format":"int32"},"unprotected_file_patterns":{"type":["string","null"]}}},"EditReleaseOption":{"type":"object","properties":{"content":{"type":["string","null"]},"is_draft":{"type":["boolean","null"]},"is_prerelease":{"type":["boolean","null"]},"tag_name":{"type":["string","null"]},"target":{"type":["string","null"]},"title":{"type":["string","null"]}}},"EditTagProtectionOption":{"type":"object","properties":{"name_pattern":{"type":["string","null"]},"whitelist_teams":{"type":["array","null"],"items":{"type":"string"}},"whitelist_usernames":{"type":["array","null"],"items":{"type":"string","format":"uuid"}}}},"EmailChangeTicketStatus":{"type":"string","enum":["pending","verified","completed","cancelled"]},"EmailChangeTicketView":{"type":"object","required":["id","new_email","status","expires_at","created_at"],"properties":{"created_at":{"type":"string"},"expires_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"new_email":{"type":"string"},"status":{"$ref":"#/components/schemas/EmailChangeTicketStatus"},"used_at":{"type":["string","null"]}}},"EmailView":{"type":"object","required":["id","email","is_activated","is_primary","created_at","updated_at"],"properties":{"activated_at":{"type":["string","null"]},"created_at":{"type":"string"},"email":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_activated":{"type":"boolean"},"is_primary":{"type":"boolean"},"updated_at":{"type":"string"}}},"ErrorBody":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}},"EventPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/EventView"}},"total":{"type":"integer","format":"int64"}}},"EventView":{"type":"object","required":["id","user_id","event_type","created_at"],"properties":{"comment_id":{"type":["string","null"],"format":"uuid"},"commit_sha":{"type":["string","null"]},"content":{"type":["string","null"]},"created_at":{"type":"string"},"event_type":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":["string","null"],"format":"uuid"},"new_ref":{"type":["string","null"]},"new_title":{"type":["string","null"]},"old_ref":{"type":["string","null"]},"old_title":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"ExternalTracker":{"type":"object","required":["external_tracker_url","external_tracker_format","external_tracker_style"],"properties":{"external_tracker_format":{"type":"string"},"external_tracker_style":{"type":"string"},"external_tracker_url":{"type":"string"}}},"ExternalWiki":{"type":"object","required":["external_wiki_url"],"properties":{"external_wiki_url":{"type":"string"}}},"FavoritePage":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/FavoriteView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"FavoriteView":{"type":"object","required":["id","project_id","user_id","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"folder":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"project_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"FileDeleteResponse":{"type":"object","properties":{"commit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CommitSummary"}]},"content":{}}},"FileLinksResponse":{"type":"object","properties":{"git":{"type":["string","null"]},"html":{"type":["string","null"]},"self":{"type":["string","null"]}}},"FileOptions":{"type":"object","properties":{"author":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/GitIdentity"}]},"branch":{"type":["string","null"]},"committer":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/GitIdentity"}]},"dates":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CommitDateOptions"}]},"force_push":{"type":["boolean","null"]},"message":{"type":["string","null"]},"new_branch":{"type":["string","null"]},"signoff":{"type":["boolean","null"]}}},"FilesResponse":{"type":"object","required":["files"],"properties":{"commit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CommitSummary"}]},"files":{"type":"array","items":{"$ref":"#/components/schemas/ContentsResponse"}}}},"FollowerSummary":{"type":"object","required":["user","since"],"properties":{"since":{"type":"string"},"user":{"$ref":"#/components/schemas/UserPublic"}}},"ForgotPasswordCmd":{"type":"object","required":["email","pow"],"properties":{"email":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"}}},"ForgotPasswordResp":{"type":"object","required":["sent","temp_key"],"properties":{"sent":{"type":"boolean"},"temp_key":{"$ref":"#/components/schemas/TempKey"}}},"ForkRepoOption":{"type":"object","required":["to_channel_id"],"properties":{"description":{"type":["string","null"]},"name":{"type":["string","null"]},"to_channel_id":{"type":"string","format":"uuid"}}},"ForkView":{"type":"object","required":["id","name","full_name","owner","private","fork","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"fork":{"type":"boolean"},"full_name":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"owner":{"$ref":"#/components/schemas/UserMini"},"private":{"type":"boolean"},"updated_at":{"type":"string"}}},"ForksResponse":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ForkView"}},"total":{"type":"integer","format":"int64"}}},"GenerateRepoOption":{"type":"object","required":["to_channel_id","name"],"properties":{"description":{"type":["string","null"]},"is_private":{"type":["boolean","null"]},"name":{"type":"string"},"to_channel_id":{"type":"string","format":"uuid"}}},"GitIdentity":{"type":"object","required":["name","email"],"properties":{"date":{"type":["string","null"]},"email":{"type":"string"},"name":{"type":"string"}}},"GitRef":{"type":"object","required":["name","sha","type_"],"properties":{"name":{"type":"string"},"sha":{"type":"string"},"type_":{"type":"string"}}},"HealthStatus":{"type":"object","required":["status","service"],"properties":{"service":{"type":"string"},"status":{"type":"string"}}},"InternalTracker":{"type":"object","required":["enable_time_tracker","allow_only_contributors_to_track_time","enable_issue_dependencies"],"properties":{"allow_only_contributors_to_track_time":{"type":"boolean"},"enable_issue_dependencies":{"type":"boolean"},"enable_time_tracker":{"type":"boolean"}}},"IssueConfig":{"type":"object","required":["blank_issues_enabled"],"properties":{"blank_issues_enabled":{"type":"boolean"},"contact_links":{}}},"IssueConfigValidation":{"type":"object","required":["valid"],"properties":{"message":{"type":["string","null"]},"valid":{"type":"boolean"}}},"IssuePage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/IssueView"}},"total":{"type":"integer","format":"int64"}}},"IssueState":{"type":"string","enum":["open","closed"]},"IssueTemplate":{"type":"object","required":["name","title","content","fields"],"properties":{"content":{"type":"string"},"description":{"type":["string","null"]},"fields":{"type":"array","items":{"$ref":"#/components/schemas/IssueTemplateField"}},"name":{"type":"string"},"title":{"type":"string"}}},"IssueTemplateField":{"type":"object","required":["type_","id","name"],"properties":{"description":{"type":["string","null"]},"id":{"type":"string"},"name":{"type":"string"},"required":{"type":["boolean","null"]},"type_":{"type":"string"},"validations":{}}},"IssueUserView":{"type":"object","required":["id","user_id","issue_id","is_read","is_mentioned","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_mentioned":{"type":"boolean"},"is_read":{"type":"boolean"},"issue_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"IssueView":{"type":"object","required":["id","collection_id","autoincrement_id","author_id","title","body","state","created_at"],"properties":{"author_id":{"type":"string","format":"uuid"},"autoincrement_id":{"type":"integer","format":"int32"},"body":{"type":"string"},"closed_at":{"type":["string","null"]},"collection_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"milestone_id":{"type":["string","null"],"format":"uuid"},"state":{"$ref":"#/components/schemas/IssueState"},"title":{"type":"string"},"updated_at":{"type":["string","null"]}}},"LabelPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/LabelView"}},"total":{"type":"integer","format":"int64"}}},"LabelView":{"type":"object","required":["id","channel_id","name","exclusive","exclusive_order","color","is_archived","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"color":{"type":"string"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"exclusive":{"type":"boolean"},"exclusive_order":{"type":"integer","format":"int32"},"id":{"type":"string","format":"uuid"},"is_archived":{"type":"boolean"},"name":{"type":"string"},"updated_at":{"type":["string","null"]}}},"LanguagesResponse":{"type":"object","required":["languages"],"properties":{"languages":{"type":"object","additionalProperties":{"type":"integer","format":"int64"},"propertyNames":{"type":"string"}}}},"LicensesResponse":{"type":"object","required":["licenses"],"properties":{"licenses":{"type":"array","items":{"type":"string"}}}},"LinkKind":{"type":"string","enum":["related","duplicate","blocks","blocked_by"]},"LinkPage":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/LinkView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"LinkView":{"type":"object","required":["id","project_id","related_project_id","kind","created_by","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"created_by":{"type":"string","format":"uuid"},"id":{"type":"string","format":"uuid"},"kind":{"$ref":"#/components/schemas/LinkKind"},"project_id":{"type":"string","format":"uuid"},"related_project_id":{"type":"string","format":"uuid"}}},"ListActivityQuery":{"type":"object","properties":{"page":{"type":"integer","format":"int64","minimum":0},"per_page":{"type":"integer","format":"int64","minimum":0},"verb":{"type":["string","null"]}}},"ListAttachmentQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListBlocksQuery":{"type":"object","properties":{"cursor":{"type":["string","null"],"format":"uuid"},"limit":{"type":"integer","minimum":0}}},"ListBranchProtectionQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListBranchQuery":{"type":"object","properties":{"keyword":{"type":["string","null"]},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListCollaboratorQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListCollectionQuery":{"type":"object","properties":{"channel_id":{"type":["string","null"],"format":"uuid"},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"q":{"type":["string","null"]}}},"ListCommentQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"parent_id":{"type":["string","null"],"format":"uuid"}}},"ListContentHistoryQuery":{"type":"object","properties":{"comment_id":{"type":["string","null"],"format":"uuid"},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListDeployKeyQuery":{"type":"object","properties":{"fingerprint":{"type":["string","null"]},"key_id":{"type":["string","null"],"format":"uuid"},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListEventQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListFollowersQuery":{"type":"object","required":["target_uid"],"properties":{"cursor":{"type":["string","null"],"format":"uuid"},"limit":{"type":"integer","minimum":0},"target_uid":{"type":"string","format":"uuid"}}},"ListFollowingQuery":{"type":"object","required":["user_uid"],"properties":{"cursor":{"type":["string","null"],"format":"uuid"},"limit":{"type":"integer","minimum":0},"user_uid":{"type":"string","format":"uuid"}}},"ListIssueQuery":{"type":"object","properties":{"author_id":{"type":["string","null"],"format":"uuid"},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"milestone_id":{"type":["string","null"],"format":"uuid"},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"q":{"type":["string","null"]},"state":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/IssueState"}]}}},"ListLabelQuery":{"type":"object","properties":{"is_archived":{"type":["boolean","null"]},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"q":{"type":["string","null"]}}},"ListMemberQuery":{"type":"object","properties":{"kind":{"type":["string","null"]},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListMilestoneQuery":{"type":"object","properties":{"is_closed":{"type":["boolean","null"]},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"q":{"type":["string","null"]}}},"ListNotificationsQuery":{"type":"object","properties":{"cursor":{"type":["string","null"],"format":"uuid"},"limit":{"type":"integer","minimum":0},"notification_type":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NotificationType"}]},"unread_only":{"type":["boolean","null"]}}},"ListPostQuery":{"type":"object","properties":{"author_id":{"type":["string","null"],"format":"uuid"},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"q":{"type":["string","null"]},"status":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/PostStatusView"}]}}},"ListProjectQuery":{"type":"object","required":["space_id"],"properties":{"lead_id":{"type":["string","null"],"format":"uuid"},"page":{"type":"integer","format":"int64","minimum":0},"per_page":{"type":"integer","format":"int64","minimum":0},"q":{"type":["string","null"]},"space_id":{"type":"string","format":"uuid"},"starred_only":{"type":["boolean","null"]},"state":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProjectState"}]}}},"ListPullRequestQuery":{"type":"object","properties":{"keyword":{"type":["string","null"]},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0},"state":{"type":["string","null"]}}},"ListReactionQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListReleaseQuery":{"type":"object","properties":{"draft":{"type":["boolean","null"]},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0},"prerelease":{"type":["boolean","null"]}}},"ListRepoQuery":{"type":"object","properties":{"channel_id":{"type":["string","null"],"format":"uuid"},"is_archived":{"type":["boolean","null"]},"is_private":{"type":["boolean","null"]},"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"owner_user_id":{"type":["string","null"],"format":"uuid"},"q":{"type":["string","null"]}}},"ListSessionsQuery":{"type":"object","properties":{"app_id":{"type":["string","null"]},"include_revoked":{"type":"boolean"}}},"ListStatusQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0},"sort":{"type":["string","null"]},"state":{"type":["string","null"]}}},"ListSubscriberQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListTagProtectionQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListTagQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0}}},"ListTrackedTimeQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"offset":{"type":["integer","null"],"format":"int64","minimum":0},"user_id":{"type":["string","null"],"format":"uuid"}}},"LoginCmd":{"type":"object","required":["identifier","password","pow"],"properties":{"app_id":{"type":["string","null"]},"identifier":{"type":"string"},"password":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"}}},"LoginResp":{"type":"object","required":["access_token","refresh_token","token_type","expires_in","user"],"properties":{"access_token":{"type":"string"},"expires_in":{"type":"integer","format":"int64"},"refresh_token":{"type":"string"},"token_type":{"type":"string"},"user":{"$ref":"#/components/schemas/UserPublic"}}},"LogoutCmd":{"type":"object","required":["refresh_token"],"properties":{"refresh_token":{"type":"string"}}},"LogoutResp":{"type":"object","required":["revoked"],"properties":{"revoked":{"type":"boolean"}}},"MarkAllReadResp":{"type":"object","required":["marked"],"properties":{"marked":{"type":"integer","format":"int64","minimum":0}}},"MarkReadCmd":{"type":"object","required":["notification_ids"],"properties":{"notification_ids":{"type":"array","items":{"type":"string","format":"uuid"}}}},"MarkReadResp":{"type":"object","required":["marked"],"properties":{"marked":{"type":"integer","format":"int64","minimum":0}}},"MemberPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/MemberView"}},"total":{"type":"integer","format":"int64"}}},"MemberRole":{"type":"string","enum":["owner","lead","contributor","viewer"]},"MemberView":{"type":"object","required":["id","issue_id","user_id","kind","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"},"kind":{"type":"string"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"MemeView":{"type":"object","required":["id","name","content_type","url","size","created_at"],"properties":{"content_type":{"type":"string"},"created_at":{"type":"string"},"height":{"type":["integer","null"],"format":"int32"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"},"url":{"type":"string"},"width":{"type":["integer","null"],"format":"int32"}}},"MergePullRequestOption":{"type":"object","required":["style"],"properties":{"commit_message":{"type":["string","null"]},"commit_title":{"type":["string","null"]},"delete_branch_after_merge":{"type":"boolean"},"style":{"$ref":"#/components/schemas/MergeStyle"}}},"MergeStyle":{"type":"string","enum":["fast_forward","rebase","rebase_merge","squash","merge","manually_merged"]},"MergeUpstreamRequest":{"type":"object","required":["branch"],"properties":{"branch":{"type":"string"},"ff_only":{"type":["boolean","null"]}}},"MergeUpstreamResponse":{"type":"object","required":["merge_type"],"properties":{"merge_type":{"type":"string"}}},"MergeView":{"type":"object","required":["sha","merged"],"properties":{"merged":{"type":"boolean"},"message":{"type":["string","null"]},"sha":{"type":"string"}}},"MessageNotifications":{"type":"string","enum":["all","mentions","nothing"]},"MilestonePage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/MilestoneView"}},"total":{"type":"integer","format":"int64"}}},"MilestoneView":{"type":"object","required":["id","collection_id","name","is_closed","num_issues","num_closed_issues","created_at"],"properties":{"collection_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"due_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_closed":{"type":"boolean"},"name":{"type":"string"},"num_closed_issues":{"type":"integer","format":"int32"},"num_issues":{"type":"integer","format":"int32"},"updated_at":{"type":["string","null"]}}},"NewPinAllowedResponse":{"type":"object","required":["allowed"],"properties":{"allowed":{"type":"boolean"}}},"NoteView":{"type":"object","required":["sha","message"],"properties":{"message":{"type":"string"},"sha":{"type":"string"}}},"NotificationType":{"type":"string","enum":["mention","reply","follow","invite","assignment","system"]},"NotificationView":{"type":"object","required":["id","notification_type","title","created_at"],"properties":{"actor_uid":{"type":["string","null"],"format":"uuid"},"body":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"notification_type":{"$ref":"#/components/schemas/NotificationType"},"read_at":{"type":["string","null"]},"title":{"type":"string"}}},"OAuthLoginResp":{"type":"object","required":["access_token","refresh_token","token_type","expires_in","user_id","auto_registered"],"properties":{"access_token":{"type":"string"},"auto_registered":{"type":"boolean"},"expires_in":{"type":"integer","format":"int64"},"refresh_token":{"type":"string"},"token_type":{"type":"string"},"user_id":{"type":"string"}}},"OAuthProvider":{"type":"string","enum":["google","github","apple"]},"OAuthProviderInfo":{"type":"object","required":["name","display_name","authorize_url"],"properties":{"authorize_url":{"type":"string"},"display_name":{"type":"string"},"name":{"type":"string"}}},"Permission":{"type":"object","required":["admin","push","pull"],"properties":{"admin":{"type":"boolean"},"pull":{"type":"boolean"},"push":{"type":"boolean"}}},"PinView":{"type":"object","required":["id","collection_id","pin_order","created_at"],"properties":{"collection_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":["string","null"],"format":"uuid"},"pin_order":{"type":"integer","format":"int32"}}},"PostBoardPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PostBoardView"}},"total":{"type":"integer","format":"int64"}}},"PostBoardView":{"type":"object","description":"A post board (collection) hosting posts for a space.","required":["id","channel_id","name","nums_open_post","nums_closed_post","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"nums_closed_post":{"type":"integer","format":"int64"},"nums_open_post":{"type":"integer","format":"int64"},"updated_at":{"type":["string","null"]}}},"PostLabelPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PostLabelView"}},"total":{"type":"integer","format":"int64"}}},"PostLabelView":{"type":"object","required":["id","channel_id","name","color","is_archived","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"color":{"type":"string"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_archived":{"type":"boolean"},"name":{"type":"string"},"updated_at":{"type":["string","null"]}}},"PostMentionView":{"type":"object","required":["id","target","target_id","is_everyone","is_here","created_at"],"properties":{"channel_id":{"type":["string","null"],"format":"uuid"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_everyone":{"type":"boolean"},"is_here":{"type":"boolean"},"role_id":{"type":["string","null"],"format":"uuid"},"target":{"$ref":"#/components/schemas/PostTargetView"},"target_id":{"type":"string","format":"uuid"},"user_id":{"type":["string","null"],"format":"uuid"}}},"PostPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PostView"}},"total":{"type":"integer","format":"int64"}}},"PostReactionView":{"type":"object","required":["id","target","target_id","user_id","emoji","created_at"],"properties":{"created_at":{"type":"string"},"emoji":{"type":"string"},"id":{"type":"string","format":"uuid"},"target":{"$ref":"#/components/schemas/PostTargetView"},"target_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"PostReplyPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PostReplyView"}},"total":{"type":"integer","format":"int64"}}},"PostReplyView":{"type":"object","required":["id","post_id","author_id","body","is_pinned","created_at"],"properties":{"author_id":{"type":"string","format":"uuid"},"body":{"type":"string"},"created_at":{"type":"string"},"deleted_at":{"type":["string","null"]},"deleted_by":{"type":["string","null"],"format":"uuid"},"edited_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_pinned":{"type":"boolean"},"parent_reply_id":{"type":["string","null"],"format":"uuid"},"post_id":{"type":"string","format":"uuid"},"updated_at":{"type":["string","null"]}}},"PostStatusView":{"type":"string","enum":["open","closed","archived","locked"]},"PostTargetView":{"type":"string","enum":["post","reply"]},"PostView":{"type":"object","description":"A single post (thread).","required":["id","collection_id","number","author_id","title","body","status","is_pinned","reply_count","created_at"],"properties":{"archived_at":{"type":["string","null"]},"author_id":{"type":"string","format":"uuid"},"body":{"type":"string"},"closed_at":{"type":["string","null"]},"collection_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_pinned":{"type":"boolean"},"last_reply_at":{"type":["string","null"]},"last_reply_by":{"type":["string","null"],"format":"uuid"},"number":{"type":"integer","format":"int64"},"reply_count":{"type":"integer","format":"int32"},"status":{"$ref":"#/components/schemas/PostStatusView"},"title":{"type":"string"},"updated_at":{"type":["string","null"]}}},"PostWatchView":{"type":"object","required":["id","post_id","user_id","mode","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"mode":{"type":"string"},"post_id":{"type":"string","format":"uuid"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"PowChallengeResp":{"type":"object","required":["challenge","ttl_seconds"],"properties":{"challenge":{"type":"string"},"ttl_seconds":{"type":"integer","format":"int64","minimum":0}}},"PowProof":{"type":"object","required":["challenge","solution"],"properties":{"challenge":{"type":"string"},"solution":{"type":"string"}}},"PrState":{"type":"string","enum":["open","closed","merged"]},"ProfileView":{"type":"object","required":["user_id","show_email","show_location","show_real_name","show_activity","updated_at"],"properties":{"accent_color":{"type":["string","null"]},"banner_color":{"type":["integer","null"],"format":"int32"},"banner_url":{"type":["string","null"]},"bio":{"type":["string","null"]},"company":{"type":["string","null"]},"date_of_birth":{"type":["string","null"],"format":"date"},"location":{"type":["string","null"]},"pronouns":{"type":["string","null"]},"pronouns_privacy":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProfileVisibility"}]},"real_name":{"type":["string","null"]},"show_activity":{"type":"boolean"},"show_email":{"type":"boolean"},"show_location":{"type":"boolean"},"show_real_name":{"type":"boolean"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"},"website":{"type":["string","null"]}}},"ProfileVisibility":{"type":"string","enum":["public","registered_only","members_only","private"]},"ProjectHealth":{"type":"string","enum":["on_track","at_risk","off_track","none"]},"ProjectPage":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ProjectView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"ProjectState":{"type":"string","enum":["backlog","planned","in_progress","paused","completed","cancelled"]},"ProjectView":{"type":"object","required":["id","space_id","creator_id","name","state","health","sort_order","starred","created_at"],"properties":{"cancelled_at":{"type":["string","null"],"format":"date-time"},"color":{"type":["string","null"]},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"creator_id":{"type":"string","format":"uuid"},"description":{"type":["string","null"]},"health":{"$ref":"#/components/schemas/ProjectHealth"},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"lead_id":{"type":["string","null"],"format":"uuid"},"name":{"type":"string"},"sort_order":{"type":"integer","format":"int32"},"space_id":{"type":"string","format":"uuid"},"starred":{"type":"integer","format":"int32"},"started_at":{"type":["string","null"],"format":"date-time"},"state":{"$ref":"#/components/schemas/ProjectState"},"target_date":{"type":["string","null"],"format":"date"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"PublisherSummary":{"type":"object","required":["id","name","login"],"properties":{"avatar_url":{"type":["string","null"]},"email":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"login":{"type":"string"},"name":{"type":"string"}}},"PullRequestCommentView":{"type":"object","required":["id","pull_request_id","user_id","body","created_at"],"properties":{"body":{"type":"string"},"commit_sha":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"line":{"type":["integer","null"],"format":"int32"},"path":{"type":["string","null"]},"pull_request_id":{"type":"string","format":"uuid"},"review_id":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"PullRequestEventView":{"type":"object","required":["id","pull_request_id","user_id","event_type","created_at"],"properties":{"commit_sha":{"type":["string","null"]},"content":{"type":["string","null"]},"created_at":{"type":"string"},"event_type":{"type":"string"},"id":{"type":"string","format":"uuid"},"pull_request_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"PullRequestPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PullRequestView"}},"total":{"type":"integer","format":"int64"}}},"PullRequestReviewView":{"type":"object","required":["id","pull_request_id","user_id","official","state","created_at"],"properties":{"commit_sha":{"type":["string","null"]},"content":{"type":["string","null"]},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"official":{"type":"boolean"},"pull_request_id":{"type":"string","format":"uuid"},"state":{"$ref":"#/components/schemas/ReviewState"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"PullRequestView":{"type":"object","required":["id","repo_id","number","title","head_branch","base_branch","author_id","state","is_locked","has_merged","created_at","comments_count","reviews_count"],"properties":{"author_id":{"type":"string","format":"uuid"},"base_branch":{"type":"string"},"base_sha":{"type":["string","null"]},"body":{"type":["string","null"]},"closed_at":{"type":["string","null"]},"comments_count":{"type":"integer","format":"int64"},"created_at":{"type":"string"},"has_merged":{"type":"boolean"},"head_branch":{"type":"string"},"head_sha":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_locked":{"type":"boolean"},"mergeable":{"type":["boolean","null"]},"mergeable_state":{"type":["string","null"]},"merged_at":{"type":["string","null"]},"merged_commit_sha":{"type":["string","null"]},"merger_id":{"type":["string","null"]},"number":{"type":"integer","format":"int64"},"repo_id":{"type":"string","format":"uuid"},"reviews_count":{"type":"integer","format":"int64"},"state":{"$ref":"#/components/schemas/PrState"},"title":{"type":"string"},"updated_at":{"type":["string","null"]}}},"PushPlatform":{"type":"string","enum":["web_push","android_fcm","ios_apns"]},"PushSubscriptionView":{"type":"object","required":["id","platform","endpoint","created_at"],"properties":{"created_at":{"type":"string"},"endpoint":{"type":"string"},"id":{"type":"string","format":"uuid"},"platform":{"$ref":"#/components/schemas/PushPlatform"},"user_agent":{"type":["string","null"]}}},"ReactionAggView":{"type":"object","required":["emoji","count","user_ids"],"properties":{"count":{"type":"integer","format":"int64"},"emoji":{"type":"string"},"user_ids":{"type":"array","items":{"type":"string","format":"uuid"}}}},"ReactionScope":{"type":"string","enum":["issue","comment"]},"ReactionView":{"type":"object","required":["id","scope","target_id","user_id","emoji","created_at"],"properties":{"created_at":{"type":"string"},"emoji":{"type":"string"},"id":{"type":"string","format":"uuid"},"scope":{"$ref":"#/components/schemas/ReactionScope"},"target_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"RecentMentionView":{"type":"object","required":["id","channel_id","message_id","created_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"message_id":{"type":"string","format":"uuid"}}},"ReclaimCmd":{"type":"object","required":["email","pow"],"properties":{"email":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"}}},"ReclaimResp":{"type":"object","required":["sent","temp_key"],"properties":{"sent":{"type":"boolean"},"temp_key":{"$ref":"#/components/schemas/TempKey"}}},"RecoveryCodeView":{"type":"object","required":["id","created_at"],"properties":{"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"used_at":{"type":["string","null"]}}},"RefreshCmd":{"type":"object","required":["refresh_token"],"properties":{"app_id":{"type":["string","null"]},"refresh_token":{"type":"string"}}},"RefreshResp":{"type":"object","required":["access_token","refresh_token","token_type","expires_in"],"properties":{"access_token":{"type":"string"},"expires_in":{"type":"integer","format":"int64"},"refresh_token":{"type":"string"},"token_type":{"type":"string"}}},"RegenerateRecoveryResp":{"type":"object","required":["codes"],"properties":{"codes":{"type":"array","items":{"type":"string"}}}},"RegisterCmd":{"type":"object","required":["email","password","pow"],"properties":{"accept_agreements":{"type":"array","items":{"type":"string"}},"email":{"type":"string"},"password":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"},"username":{"type":["string","null"]}}},"RegisterResp":{"type":"object","required":["uid","pending","temp_key","purpose"],"properties":{"pending":{"type":"boolean"},"purpose":{"type":"string"},"temp_key":{"$ref":"#/components/schemas/TempKey"},"uid":{"type":"string"}}},"ReleaseAttachment":{"type":"object","required":["id","name","size","download_url","created_at"],"properties":{"created_at":{"type":"string"},"download_url":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"}}},"ReleaseAttachmentListResponse":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ReleaseAttachmentView"}}}},"ReleaseAttachmentView":{"type":"object","required":["id","name","size","download_url","created_at"],"properties":{"created_at":{"type":"string"},"download_url":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"}}},"ReleasePage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ReleaseView"}},"total":{"type":"integer","format":"int64"}}},"ReleaseView":{"type":"object","required":["id","repo_id","tag_name","target","title","sha","num_commits","is_draft","is_prerelease","is_tag","url","html_url","tarball_url","zipball_url","upload_url","publisher","attachments","created_at","updated_at"],"properties":{"attachments":{"type":"array","items":{"$ref":"#/components/schemas/ReleaseAttachment"}},"content":{"type":["string","null"]},"created_at":{"type":"string"},"html_url":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_draft":{"type":"boolean"},"is_prerelease":{"type":"boolean"},"is_tag":{"type":"boolean"},"num_commits":{"type":"integer","format":"int32"},"publisher":{"$ref":"#/components/schemas/UserSummary"},"repo_id":{"type":"string","format":"uuid"},"sha":{"type":"string"},"tag_name":{"type":"string"},"tarball_url":{"type":"string"},"target":{"type":"string"},"title":{"type":"string"},"updated_at":{"type":"string"},"upload_url":{"type":"string"},"url":{"type":"string"},"zipball_url":{"type":"string"}}},"RenameBranchOption":{"type":"object","required":["new_name"],"properties":{"new_name":{"type":"string"}}},"RenameRepoOption":{"type":"object","required":["new_name"],"properties":{"new_name":{"type":"string"}}},"RepoCollaboratorPermission":{"type":"object","required":["permission","role","user"],"properties":{"permission":{"type":"string"},"role":{"type":"string"},"user":{"$ref":"#/components/schemas/UserSummary"}}},"RepoPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/RepoView"}},"total":{"type":"integer","format":"int64"}}},"RepoRelView":{"type":"object","required":["id","issue_id","repo_id","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"},"repo_id":{"type":"string","format":"uuid"}}},"RepoSummary":{"type":"object","required":["id","name","full_name","empty","private","fork","template","mirror","size","stars_count","forks_count","watchers_count","open_issues_count"],"properties":{"description":{"type":["string","null"]},"empty":{"type":"boolean"},"fork":{"type":"boolean"},"forks_count":{"type":"integer","format":"int32"},"full_name":{"type":"string"},"id":{"type":"string","format":"uuid"},"mirror":{"type":"boolean"},"name":{"type":"string"},"open_issues_count":{"type":"integer","format":"int32"},"private":{"type":"boolean"},"size":{"type":"integer","format":"int64"},"stars_count":{"type":"integer","format":"int32"},"template":{"type":"boolean"},"watchers_count":{"type":"integer","format":"int32"}}},"RepoTopicOptions":{"type":"object","required":["topics"],"properties":{"topics":{"type":"array","items":{"type":"string"}}}},"RepoView":{"type":"object","required":["id","channel_id","space_id","name","lower_name","full_name","default_branch","enable_lfs","is_private","is_archived","is_fork","is_template","is_mirror","empty","size","git_size","lfs_size","nums_watch","nums_star","nums_pr","nums_commits","nums_branches","nums_tags","allow_rebase","allow_rebase_explicit","allow_squash_merge","allow_merge_commits","allow_fast_forward_only_merge","allow_rebase_update","allow_merge_update","allow_manual_merge","autodetect_manual_merge","default_delete_branch_after_merge","default_allow_maintainer_edit","ignore_whitespace_conflicts","object_format","has_code","has_issues","has_wiki","has_pull_requests","has_projects","has_releases","has_packages","has_actions","projects_mode","languages","licenses","topics","html_url","url","link","ssh_url","clone_url","created_at","updated_at"],"properties":{"allow_fast_forward_only_merge":{"type":"boolean"},"allow_manual_merge":{"type":"boolean"},"allow_merge_commits":{"type":"boolean"},"allow_merge_update":{"type":"boolean"},"allow_rebase":{"type":"boolean"},"allow_rebase_explicit":{"type":"boolean"},"allow_rebase_update":{"type":"boolean"},"allow_squash_merge":{"type":"boolean"},"archived_at":{"type":["string","null"]},"autodetect_manual_merge":{"type":"boolean"},"avatar_url":{"type":["string","null"]},"channel":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ChannelSummary"}]},"channel_id":{"type":"string","format":"uuid"},"clone_url":{"type":"string"},"created_at":{"type":"string"},"default_allow_maintainer_edit":{"type":"boolean"},"default_branch":{"type":"string"},"default_delete_branch_after_merge":{"type":"boolean"},"description":{"type":["string","null"]},"empty":{"type":"boolean"},"enable_lfs":{"type":"boolean"},"full_name":{"type":"string"},"git_size":{"type":"integer","format":"int64"},"has_actions":{"type":"boolean"},"has_code":{"type":"boolean"},"has_issues":{"type":"boolean"},"has_packages":{"type":"boolean"},"has_projects":{"type":"boolean"},"has_pull_requests":{"type":"boolean"},"has_releases":{"type":"boolean"},"has_wiki":{"type":"boolean"},"html_url":{"type":"string"},"id":{"type":"string","format":"uuid"},"ignore_whitespace_conflicts":{"type":"boolean"},"is_archived":{"type":"boolean"},"is_fork":{"type":"boolean"},"is_mirror":{"type":"boolean"},"is_private":{"type":"boolean"},"is_template":{"type":"boolean"},"languages":{"type":"array","items":{"type":"string"}},"last_pushed_at":{"type":["string","null"]},"lfs_size":{"type":"integer","format":"int64"},"license_name":{"type":["string","null"]},"licenses":{"type":"array","items":{"type":"string"}},"link":{"type":"string"},"lower_name":{"type":"string"},"name":{"type":"string"},"nums_branches":{"type":"integer","format":"int32"},"nums_commits":{"type":"integer","format":"int32"},"nums_pr":{"type":"integer","format":"int32"},"nums_star":{"type":"integer","format":"int32"},"nums_tags":{"type":"integer","format":"int32"},"nums_watch":{"type":"integer","format":"int32"},"object_format":{"type":"string"},"parent":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/RepoView"}]},"primary_language":{"type":["string","null"]},"projects_mode":{"type":"string"},"size":{"type":"integer","format":"int64"},"space":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SpaceSummary"}]},"space_id":{"type":"string","format":"uuid"},"ssh_url":{"type":"string"},"storage_limit_size":{"type":["integer","null"],"format":"int64"},"topics":{"type":"array","items":{"type":"string"}},"updated_at":{"type":"string"},"url":{"type":"string"},"website":{"type":["string","null"]}}},"ReportStatus":{"type":"string","enum":["open","under_review","resolved","dismissed"]},"ReportView":{"type":"object","required":["id","reported_uid","reason","status","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"evidence":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"reason":{"type":"string"},"reported_uid":{"type":"string","format":"uuid"},"reporter_uid":{"type":["string","null"],"format":"uuid"},"resolution_note":{"type":["string","null"]},"resolver_uid":{"type":["string","null"],"format":"uuid"},"status":{"$ref":"#/components/schemas/ReportStatus"},"updated_at":{"type":"string"}}},"RequestChangeBody":{"type":"object","required":["new_email"],"properties":{"new_email":{"type":"string"}}},"RequestDeletionCmd":{"type":"object","properties":{"reason":{"type":["string","null"]}}},"ResendCodeCmd":{"type":"object","required":["email","pow","purpose"],"properties":{"email":{"type":"string"},"pow":{"$ref":"#/components/schemas/PowProof"},"purpose":{"type":"string"}}},"ResendCodeResp":{"type":"object","required":["sent","temp_key"],"properties":{"sent":{"type":"boolean"},"temp_key":{"$ref":"#/components/schemas/TempKey"}}},"ResetPasswordCmd":{"type":"object","required":["email","token","new_password","temp_key_value"],"properties":{"email":{"type":"string"},"new_password":{"type":"string"},"temp_key_value":{"type":"string"},"token":{"type":"string"}}},"ResetPasswordResp":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"}}},"ReviewState":{"type":"string","enum":["approved","changes_requested","commented"]},"RevokeAllResp":{"type":"object","required":["revoked"],"properties":{"revoked":{"type":"integer","format":"int64","minimum":0}}},"RevokeSuspensionCmd":{"type":"object","properties":{"reason":{"type":["string","null"]}}},"RoleOverwriteView":{"type":"object","required":["id","space_id","channel_id","role_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"channel_id":{"type":"string","format":"uuid"},"deny_mask":{"type":"integer","format":"int64"},"id":{"type":"string","format":"uuid"},"role_id":{"type":"string","format":"uuid"},"space_id":{"type":"string","format":"uuid"}}},"RolePage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/RoleView"}},"total":{"type":"integer","format":"int64"}}},"RoleView":{"type":"object","required":["id","space_id","name","position","color","version","created_at","created_by","permissions"],"properties":{"color":{"type":"string"},"created_at":{"type":"string"},"created_by":{"type":"string","format":"uuid"},"icon_hash":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}},"position":{"type":"integer","format":"int64"},"space_id":{"type":"string","format":"uuid"},"unicode_emoji":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"version":{"type":"integer","format":"int32"}}},"SaveMessageCmd":{"type":"object","required":["channel_id","message_id"],"properties":{"channel_id":{"type":"string","format":"uuid"},"message_id":{"type":"string","format":"uuid"}}},"SavedMessageView":{"type":"object","required":["id","channel_id","message_id","saved_at"],"properties":{"channel_id":{"type":"string","format":"uuid"},"id":{"type":"string","format":"uuid"},"message_id":{"type":"string","format":"uuid"},"saved_at":{"type":"string"}}},"ScheduledMessageStatus":{"type":"string","enum":["pending","sent","cancelled"]},"ScheduledMessageView":{"type":"object","required":["id","target_channel_id","payload","scheduled_at","status","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"payload":{"type":"string"},"scheduled_at":{"type":"string"},"status":{"$ref":"#/components/schemas/ScheduledMessageStatus"},"target_channel_id":{"type":"string","format":"uuid"}}},"SearchResults":{"type":"object","required":["data","ok"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RepoSummary"}},"ok":{"type":"boolean"}}},"SessionKind":{"type":"string","enum":["web_login","bearer_access"]},"SessionView":{"type":"object","required":["id","kind","is_revoked","created_at","expires_at"],"properties":{"app_id":{"type":["string","null"]},"client_ip_hash":{"type":["string","null"]},"created_at":{"type":"string"},"expires_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_revoked":{"type":"boolean"},"kind":{"$ref":"#/components/schemas/SessionKind"},"replaced_at":{"type":["string","null"]},"user_agent_hash":{"type":["string","null"]}}},"SetPrimaryEmailResp":{"type":"object","required":["email"],"properties":{"email":{"$ref":"#/components/schemas/EmailView"}}},"SetRoleOverwriteCmd":{"type":"object","required":["role_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"deny_mask":{"type":"integer","format":"int64"},"role_id":{"type":"string","format":"uuid"}}},"SetUserOverwriteCmd":{"type":"object","required":["user_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"deny_mask":{"type":"integer","format":"int64"},"user_id":{"type":"string","format":"uuid"}}},"SpaceAllowJoinLevel":{"type":"string","enum":["none","need_mail_active","need_mail_active_and_last_one_mid","need_mail_active_and_last_one_hours","need_mail_active_and_phone_active"]},"SpaceBanPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SpaceBanView"}},"total":{"type":"integer","format":"int64"}}},"SpaceBanView":{"type":"object","required":["space_id","user_id","banned_by","created_at","updated_at","allow_agent_join","allow_speak","allow_push_repo","allow_comment_any"],"properties":{"allow_agent_join":{"type":"boolean"},"allow_comment_any":{"type":"boolean"},"allow_push_repo":{"type":"boolean"},"allow_speak":{"type":"boolean"},"banned_by":{"type":"string","format":"uuid"},"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"reason":{"type":["string","null"]},"space_id":{"type":"string","format":"uuid"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"SpaceInvitePage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SpaceInviteView"}},"total":{"type":"integer","format":"int64"}}},"SpaceInviteView":{"type":"object","required":["id","space_id","user_id","email","role_ids","created_at"],"properties":{"accepted_at":{"type":["string","null"]},"created_at":{"type":"string"},"email":{"type":"string"},"expires_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"revoked_at":{"type":["string","null"]},"role_ids":{"type":"array","items":{"type":"string","format":"uuid"}},"space_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"SpaceMemberPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SpaceMemberView"}},"total":{"type":"integer","format":"int64"}}},"SpaceMemberStatus":{"type":"string","enum":["active","inactive","left","removed"]},"SpaceMemberView":{"type":"object","required":["space_id","user_id","status","joined_at","created_at","message_notifications","muted","mobile_push","suppress_everyone","suppress_roles","hide_muted_channels"],"properties":{"alias_avatar_url":{"type":["string","null"]},"alias_name":{"type":["string","null"]},"created_at":{"type":"string"},"hide_muted_channels":{"type":"boolean"},"invited_at":{"type":["string","null"]},"invited_by":{"type":["string","null"],"format":"uuid"},"joined_at":{"type":"string"},"last_active_at":{"type":["string","null"]},"left_at":{"type":["string","null"]},"message_notifications":{"$ref":"#/components/schemas/MessageNotifications"},"mobile_push":{"type":"boolean"},"mute_until":{"type":["string","null"]},"muted":{"type":"boolean"},"space_id":{"type":"string","format":"uuid"},"status":{"$ref":"#/components/schemas/SpaceMemberStatus"},"suppress_everyone":{"type":"boolean"},"suppress_roles":{"type":"boolean"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}},"SpacePage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SpaceView"}},"total":{"type":"integer","format":"int64"}}},"SpaceSummary":{"type":"object","required":["id","name"],"properties":{"display_name":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"SpaceView":{"type":"object","required":["id","name","owner_id","public","is_active","allow_join","allow_invite","member_count","allow_join_level","member_must_enable_2fa","created_at","updated_at"],"properties":{"allow_invite":{"type":"boolean"},"allow_join":{"type":"boolean"},"allow_join_level":{"$ref":"#/components/schemas/SpaceAllowJoinLevel"},"avatar_url":{"type":["string","null"]},"created_at":{"type":"string"},"description":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"member_count":{"type":"integer","format":"int64"},"member_must_enable_2fa":{"type":"boolean"},"name":{"type":"string"},"owner_id":{"type":"string","format":"uuid"},"public":{"type":"boolean"},"updated_at":{"type":"string"},"welcome_message":{"type":["string","null"]}}},"SshKeyType":{"type":"string","enum":["ssh_rsa","ssh_ed25519","ecdsa_sha2_nistp256"]},"SshKeyView":{"type":"object","required":["id","name","key_type","fingerprint","created_at"],"properties":{"created_at":{"type":"string"},"fingerprint":{"type":"string"},"id":{"type":"string","format":"uuid"},"key_type":{"$ref":"#/components/schemas/SshKeyType"},"last_used_at":{"type":["string","null"]},"name":{"type":"string"}}},"StopwatchView":{"type":"object","required":["id","issue_id","user_id","started_at","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"},"started_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"SubmitPullRequestReviewOption":{"type":"object","required":["state"],"properties":{"commit_sha":{"type":["string","null"]},"content":{"type":["string","null"]},"state":{"$ref":"#/components/schemas/ReviewState"}}},"SubmitReportCmd":{"type":"object","required":["reported_uid","reason"],"properties":{"evidence":{"type":["string","null"]},"reason":{"type":"string"},"reported_uid":{"type":"string","format":"uuid"}}},"SubscriberPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SubscriberView"}},"total":{"type":"integer","format":"int64"}}},"SubscriberView":{"type":"object","required":["user_id","repo_id","mode","created_at"],"properties":{"created_at":{"type":"string"},"mode":{"type":"string"},"repo_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"Subscription":{"type":"object","required":["user_id","repo_id","mode","created_at"],"properties":{"created_at":{"type":"string"},"mode":{"type":"string"},"repo_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"SuspendCmd":{"type":"object","required":["suspension_type"],"properties":{"ends_at":{"type":["string","null"]},"reason":{"type":["string","null"]},"suspension_type":{"$ref":"#/components/schemas/SuspensionType"}}},"SuspensionType":{"type":"string","enum":["temporary","permanent"]},"SuspensionView":{"type":"object","required":["id","user_id","suspension_type","starts_at","created_at"],"properties":{"created_at":{"type":"string"},"ends_at":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"reason":{"type":["string","null"]},"revoked_at":{"type":["string","null"]},"revoked_by":{"type":["string","null"],"format":"uuid"},"starts_at":{"type":"string"},"suspended_by":{"type":["string","null"],"format":"uuid"},"suspension_type":{"$ref":"#/components/schemas/SuspensionType"},"user_id":{"type":"string","format":"uuid"}}},"SyncResult":{"type":"object","required":["repo_id","branches_added","tags_added","commits_added","size_bytes"],"properties":{"branches_added":{"type":"integer","format":"int64"},"commits_added":{"type":"integer","format":"int64"},"repo_id":{"type":"string","format":"uuid"},"size_bytes":{"type":"integer","format":"int64"},"tags_added":{"type":"integer","format":"int64"}}},"SyncStatus":{"type":"object","required":["repo_id","branches_total","tags_total","commits_total","size","synced_at"],"properties":{"branches_total":{"type":"integer","format":"int64"},"commits_total":{"type":"integer","format":"int64"},"last_pushed_at":{"type":["string","null"]},"primary_language":{"type":["string","null"]},"repo_id":{"type":"string","format":"uuid"},"size":{"type":"integer","format":"int64"},"synced_at":{"type":"string"},"tags_total":{"type":"integer","format":"int64"}}},"TagPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/TagView"}},"total":{"type":"integer","format":"int64"}}},"TagProtectionPage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/TagProtectionView"}},"total":{"type":"integer","format":"int64"}}},"TagProtectionView":{"type":"object","required":["id","repo_id","name_pattern","whitelist_usernames","whitelist_teams","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"name_pattern":{"type":"string"},"repo_id":{"type":"string","format":"uuid"},"updated_at":{"type":"string"},"whitelist_teams":{"type":"array","items":{"type":"string"}},"whitelist_usernames":{"type":"array","items":{"type":"string"}}}},"TagView":{"type":"object","required":["id","repo_id","name","tag_type","commit_sha","commit","message","zipball_url","tarball_url","created_at"],"properties":{"commit":{"$ref":"#/components/schemas/CommitMeta"},"commit_sha":{"type":"string"},"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"message":{"type":"string"},"name":{"type":"string"},"repo_id":{"type":"string","format":"uuid"},"tag_type":{"type":"string"},"tarball_url":{"type":"string"},"zipball_url":{"type":"string"}}},"TempKey":{"type":"object","required":["name","value","ttl_seconds","secure","http_only","same_site"],"properties":{"domain":{"type":["string","null"]},"http_only":{"type":"boolean"},"name":{"type":"string"},"path":{"type":["string","null"]},"same_site":{"type":"string"},"secure":{"type":"boolean"},"ttl_seconds":{"type":"integer","format":"int64","minimum":0},"value":{"type":"string"}}},"TopicList":{"type":"object","required":["topics"],"properties":{"topics":{"type":"array","items":{"type":"string"}}}},"TopicSearchQuery":{"type":"object","properties":{"limit":{"type":["integer","null"],"format":"int64","minimum":0},"page":{"type":["integer","null"],"format":"int64","minimum":0},"q":{"type":["string","null"]}}},"TopicSearchResult":{"type":"object","required":["topics"],"properties":{"topics":{"type":"array","items":{"$ref":"#/components/schemas/TopicView"}}}},"TopicView":{"type":"object","required":["id","name","repo_count","created_at","updated_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"repo_count":{"type":"integer","format":"int32"},"updated_at":{"type":"string"}}},"TrackedTimePage":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/TrackedTimeView"}},"total":{"type":"integer","format":"int64"}}},"TrackedTimeView":{"type":"object","required":["id","issue_id","user_id","seconds","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":"string","format":"uuid"},"seconds":{"type":"integer","format":"int64"},"user_id":{"type":"string","format":"uuid"}}},"TransferRepoOption":{"type":"object","required":["new_channel_id"],"properties":{"new_channel_id":{"type":"string","format":"uuid"},"new_name":{"type":["string","null"]}}},"TreeEntryView":{"type":"object","required":["path","mode","type_","sha"],"properties":{"mode":{"type":"string"},"path":{"type":"string"},"sha":{"type":"string"},"size":{"type":["integer","null"],"format":"int64"},"type_":{"type":"string"}}},"TreeView":{"type":"object","required":["sha","entries"],"properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/TreeEntryView"}},"sha":{"type":"string"}}},"UnassignRoleCmd":{"type":"object","required":["role_id"],"properties":{"role_id":{"type":"string","format":"uuid"}}},"UnreadCountResp":{"type":"object","required":["count"],"properties":{"count":{"type":"integer","format":"int64"}}},"UpdateAvatarOption":{"type":"object","required":["image"],"properties":{"image":{"type":"string"}}},"UpdateBanCmd":{"type":"object","properties":{"allow_agent_join":{"type":["boolean","null"]},"allow_comment_any":{"type":["boolean","null"]},"allow_push_repo":{"type":["boolean","null"]},"allow_speak":{"type":["boolean","null"]},"expires_at":{"type":["string","null"]},"reason":{"type":["string","null"]}}},"UpdateBranchOption":{"type":"object","required":["new_commit_id"],"properties":{"force":{"type":["boolean","null"]},"new_commit_id":{"type":"string"},"old_commit_id":{"type":["string","null"]}}},"UpdateBranchProtectionPriorities":{"type":"object","required":["ids"],"properties":{"ids":{"type":"array","items":{"type":"string","format":"uuid"}}}},"UpdateCollectionOption":{"type":"object","properties":{"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"name":{"type":["string","null"]}}},"UpdateCommentOption":{"type":"object","required":["content"],"properties":{"content":{"type":"string"}}},"UpdateDeviceCmd":{"type":"object","properties":{"device_name":{"type":["string","null"]},"is_trusted":{"type":["boolean","null"]}}},"UpdateDocumentCmd":{"type":"object","properties":{"content":{"type":["string","null"]},"icon":{"type":["string","null"]},"parent_id":{"type":["string","null"],"format":"uuid"},"slug":{"type":["string","null"]},"title":{"type":["string","null"]}}},"UpdateFileOption":{"allOf":[{"$ref":"#/components/schemas/FileOptions"},{"type":"object","required":["content"],"properties":{"content":{"type":"string"},"from_path":{"type":["string","null"]},"sha":{"type":["string","null"]}}}]},"UpdateIssueOption":{"type":"object","properties":{"body":{"type":["string","null"]},"description":{"type":["string","null"]},"milestone_id":{"type":["string","null"],"format":"uuid"},"title":{"type":["string","null"]}}},"UpdateIssueUserOption":{"type":"object","properties":{"is_mentioned":{"type":["boolean","null"]},"is_read":{"type":["boolean","null"]}}},"UpdateLabelOption":{"type":"object","properties":{"color":{"type":["string","null"]},"description":{"type":["string","null"]},"exclusive":{"type":["boolean","null"]},"exclusive_order":{"type":["integer","null"],"format":"int32"},"is_archived":{"type":["boolean","null"]},"name":{"type":["string","null"]}}},"UpdateMemberCmd":{"type":"object","required":["role"],"properties":{"role":{"$ref":"#/components/schemas/MemberRole"}}},"UpdateMilestoneOption":{"type":"object","properties":{"description":{"type":["string","null"]},"due_at":{"type":["string","null"]},"is_closed":{"type":["boolean","null"]},"name":{"type":["string","null"]}}},"UpdatePostLabelOption":{"type":"object","properties":{"color":{"type":["string","null"]},"is_archived":{"type":["boolean","null"]},"name":{"type":["string","null"]}}},"UpdatePostOption":{"type":"object","properties":{"body":{"type":["string","null"]},"status":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/PostStatusView"}]},"title":{"type":["string","null"]}}},"UpdatePreferencesCmd":{"type":"object","properties":{"allow_dms_from":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Audience"}]},"allow_mentions_from":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Audience"}]},"diff_view_style":{"type":["string","null"]},"email_digest":{"type":["boolean","null"]},"email_flags":{"type":["integer","null"],"format":"int32"},"in_app_flags":{"type":["integer","null"],"format":"int32"},"mute_until":{"type":["string","null"]},"push_flags":{"type":["integer","null"],"format":"int32"},"show_online_status":{"type":["boolean","null"]},"theme_mode":{"type":["string","null"]},"theme_token":{"type":["string","null"]},"theme_version":{"type":["integer","null"],"format":"int64"}}},"UpdateProfileCmd":{"type":"object","properties":{"avatar":{"type":["string","null"]},"display_name":{"type":["string","null"]},"language":{"type":["string","null"]},"locale":{"type":["string","null"]},"profile":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/UpdateProfileFields"}]},"timezone":{"type":["string","null"]},"visibility":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProfileVisibility"}]}}},"UpdateProfileFields":{"type":"object","properties":{"accent_color":{"type":["string","null"]},"banner_color":{"type":["integer","null"],"format":"int32"},"banner_url":{"type":["string","null"]},"bio":{"type":["string","null"]},"company":{"type":["string","null"]},"date_of_birth":{"type":["string","null"],"format":"date"},"location":{"type":["string","null"]},"pronouns":{"type":["string","null"]},"pronouns_privacy":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProfileVisibility"}]},"real_name":{"type":["string","null"]},"show_activity":{"type":["boolean","null"]},"show_email":{"type":["boolean","null"]},"show_location":{"type":["boolean","null"]},"show_real_name":{"type":["boolean","null"]},"website":{"type":["string","null"]}}},"UpdateProjectCmd":{"type":"object","properties":{"color":{"type":["string","null"]},"description":{"type":["string","null"]},"health":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProjectHealth"}]},"icon":{"type":["string","null"]},"lead_id":{"type":["string","null"],"format":"uuid"},"name":{"type":["string","null"]},"sort_order":{"type":["integer","null"],"format":"int32"},"state":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProjectState"}]},"target_date":{"type":["string","null"],"format":"date"}}},"UpdatePullRequestOption":{"type":"object","properties":{"base":{"type":["string","null"]},"body":{"type":["string","null"]},"head":{"type":["string","null"]},"title":{"type":["string","null"]}}},"UpdateRepoOption":{"type":"object","properties":{"allow_fast_forward_only_merge":{"type":["boolean","null"]},"allow_manual_merge":{"type":["boolean","null"]},"allow_merge_commits":{"type":["boolean","null"]},"allow_merge_update":{"type":["boolean","null"]},"allow_rebase":{"type":["boolean","null"]},"allow_rebase_explicit":{"type":["boolean","null"]},"allow_rebase_update":{"type":["boolean","null"]},"allow_squash_merge":{"type":["boolean","null"]},"archived":{"type":["boolean","null"]},"autodetect_manual_merge":{"type":["boolean","null"]},"default_allow_maintainer_edit":{"type":["boolean","null"]},"default_branch":{"type":["string","null"]},"default_delete_branch_after_merge":{"type":["boolean","null"]},"default_merge_style":{"type":["string","null"]},"default_update_style":{"type":["string","null"]},"description":{"type":["string","null"]},"enable_lfs":{"type":["boolean","null"]},"external_tracker":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExternalTracker"}]},"external_wiki":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExternalWiki"}]},"has_actions":{"type":["boolean","null"]},"has_code":{"type":["boolean","null"]},"has_issues":{"type":["boolean","null"]},"has_packages":{"type":["boolean","null"]},"has_projects":{"type":["boolean","null"]},"has_pull_requests":{"type":["boolean","null"]},"has_releases":{"type":["boolean","null"]},"has_wiki":{"type":["boolean","null"]},"ignore_whitespace_conflicts":{"type":["boolean","null"]},"internal_tracker":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/InternalTracker"}]},"is_private":{"type":["boolean","null"]},"license_name":{"type":["string","null"]},"name":{"type":["string","null"]},"projects_mode":{"type":["string","null"]},"template":{"type":["boolean","null"]},"website":{"type":["string","null"]}}},"UpdateReportCmd":{"type":"object","required":["status"],"properties":{"resolution_note":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/ReportStatus"}}},"UpdateRoleCmd":{"type":"object","properties":{"color":{"type":["string","null"]},"icon_hash":{"type":["string","null"]},"name":{"type":["string","null"]},"permissions":{"type":["array","null"],"items":{"type":"string"}},"position":{"type":["integer","null"],"format":"int64"},"unicode_emoji":{"type":["string","null"]}}},"UpdateSpaceCmd":{"type":"object","properties":{"allow_invite":{"type":["boolean","null"]},"allow_join":{"type":["boolean","null"]},"allow_join_level":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SpaceAllowJoinLevel"}]},"avatar_url":{"type":["string","null"]},"description":{"type":["string","null"]},"member_must_enable_2fa":{"type":["boolean","null"]},"name":{"type":["string","null"]},"public":{"type":["boolean","null"]},"welcome_message":{"type":["string","null"]}}},"UpdateViewCmd":{"type":"object","properties":{"description":{"type":["string","null"]},"filter":{},"group_by":{"type":["string","null"]},"is_shared":{"type":["boolean","null"]},"layout":{"type":["string","null"]},"name":{"type":["string","null"]},"sort_by":{"type":["string","null"]}}},"UploadAttachmentInput":{"type":"object","required":["filename","content_type","data"],"properties":{"content_type":{"type":"string"},"data":{"type":"array","items":{"type":"integer","format":"int32","minimum":0}},"filename":{"type":"string"}}},"UploadAvatarCmd":{"type":"object","required":["content_type","data_base64"],"properties":{"content_type":{"type":"string"},"data_base64":{"type":"string"}}},"UpsertMemeCmd":{"type":"object","required":["name","content_type","url","size"],"properties":{"content_type":{"type":"string"},"height":{"type":["integer","null"],"format":"int32"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"},"url":{"type":"string"},"width":{"type":["integer","null"],"format":"int32"}}},"UpsertPostWatchOption":{"type":"object","required":["mode"],"properties":{"mode":{"type":"string"}}},"UpsertPushCmd":{"type":"object","required":["endpoint","p256dh_key","auth_key","platform"],"properties":{"auth_key":{"type":"string"},"endpoint":{"type":"string"},"p256dh_key":{"type":"string"},"platform":{"$ref":"#/components/schemas/PushPlatform"},"user_agent":{"type":["string","null"]}}},"UpsertWatchOption":{"type":"object","required":["mode"],"properties":{"mode":{"type":"string"}}},"UserMe":{"type":"object","required":["uid","username","display_name","avatar","is_active","is_admin","is_restricted"],"properties":{"avatar":{"type":"string"},"display_name":{"type":"string"},"is_active":{"type":"boolean"},"is_admin":{"type":"boolean"},"is_restricted":{"type":"boolean"},"language":{"type":["string","null"]},"locale":{"type":["string","null"]},"timezone":{"type":["string","null"]},"uid":{"type":"string"},"username":{"type":"string"}}},"UserMini":{"type":"object","required":["id","login"],"properties":{"avatar_url":{"type":["string","null"]},"email":{"type":["string","null"]},"full_name":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"login":{"type":"string"}}},"UserOverwriteView":{"type":"object","required":["channel_id","user_id","allow_mask","deny_mask"],"properties":{"allow_mask":{"type":"integer","format":"int64"},"channel_id":{"type":"string","format":"uuid"},"deny_mask":{"type":"integer","format":"int64"},"user_id":{"type":"string","format":"uuid"}}},"UserPreferences":{"type":"object","required":["user_id","theme_mode","in_app_flags","email_flags","push_flags","email_digest","allow_dms_from","allow_mentions_from","show_online_status","created_at","updated_at"],"properties":{"allow_dms_from":{"$ref":"#/components/schemas/Audience"},"allow_mentions_from":{"$ref":"#/components/schemas/Audience"},"created_at":{"type":"string"},"diff_view_style":{"type":["string","null"]},"email_digest":{"type":"boolean"},"email_flags":{"type":"integer","format":"int32"},"in_app_flags":{"type":"integer","format":"int32"},"mute_until":{"type":["string","null"]},"push_flags":{"type":"integer","format":"int32"},"show_online_status":{"type":"boolean"},"theme_mode":{"type":"string"},"theme_token":{"type":["string","null"]},"theme_version":{"type":["integer","null"],"format":"int64"},"updated_at":{"type":"string"},"user_id":{"type":"string","format":"uuid"}}},"UserPublic":{"type":"object","required":["uid","username","display_name","avatar"],"properties":{"avatar":{"type":"string"},"display_name":{"type":"string"},"language":{"type":["string","null"]},"locale":{"type":["string","null"]},"timezone":{"type":["string","null"]},"uid":{"type":"string"},"username":{"type":"string"}}},"UserSummary":{"type":"object","required":["id","name","login"],"properties":{"email":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"login":{"type":"string"},"name":{"type":"string"}}},"VerifyCodeCmd":{"type":"object","required":["email","purpose","code","temp_key_value"],"properties":{"code":{"type":"string"},"email":{"type":"string"},"purpose":{"type":"string"},"temp_key_value":{"type":"string"},"user_id":{"type":["string","null"]}}},"VerifyCodeResult":{"type":"object","required":["code_row_id"],"properties":{"code_row_id":{"type":"string"}}},"ViewPage":{"type":"object","required":["total","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ViewView"}},"total":{"type":"integer","format":"int64","minimum":0}}},"ViewView":{"type":"object","required":["id","project_id","creator_id","name","filter","sort_by","layout","is_shared","sort_order","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"creator_id":{"type":"string","format":"uuid"},"description":{"type":["string","null"]},"filter":{},"group_by":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_shared":{"type":"boolean"},"layout":{"type":"string"},"name":{"type":"string"},"project_id":{"type":"string","format":"uuid"},"sort_by":{"type":"string"},"sort_order":{"type":"integer","format":"int32"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"WatchView":{"type":"object","required":["id","user_id","mode","created_at"],"properties":{"created_at":{"type":"string"},"id":{"type":"string","format":"uuid"},"issue_id":{"type":["string","null"],"format":"uuid"},"mode":{"type":"string"},"updated_at":{"type":["string","null"]},"user_id":{"type":"string","format":"uuid"}}}}},"tags":[{"name":"auth","description":"Authentication endpoints"},{"name":"issues","description":"Issue tracking (lib/issues)"},{"name":"posts","description":"Post discussion (lib/post)"},{"name":"project","description":"Project lifecycle, members, views, documents, links, favorites, activities."},{"name":"repo","description":"Repository service (lib/repo)"},{"name":"space","description":"Space, membership, roles, invites, bans, channels, channel members and overwrite endpoints."},{"name":"user","description":"User profile, account, sessions and notifications endpoints."}]}
No newline at end of file