chore: snapshot pending route/config/schema changes and add wiki refactor roadmap
zhenyi committed
Modified config/default.yaml config/default.yaml +79 −184 View config/default.yaml
@@ -1,139 +1,95 @@
1# =============================================================================
2# Default configuration for the untitled workspace.
3#
4# File format / loader:
5# * This file is loaded by `config_rs::Config::File::with_name(...)`. The
6# workspace's `config-rs` dependency is currently enabled with `features
7# = ["toml"]` only, so to consume this YAML you must either:
8# - enable the `yaml` feature on the `config-rs` crate in the workspace
9# Cargo.toml (preferred), and pass the path to a loader, e.g.
10# ConfigLoader::new().config_file("config/default.yaml").load()
11# - or convert this file to TOML and load `config.toml` (the default
12# the loader already looks for).
13# * Field names match the structs in `lib/config/src/*.rs` (snake_case).
14# Sections that use `#[serde(deny_unknown_fields)]` (`chat`, `gateway`,
15# `live`) will reject any extra key — keep these blocks minimal.
16#
17# Override at runtime via environment variables using the loader's
18# `APP__SECTION__FIELD` convention (separator is `__`, prefix is `APP`).
19# Examples:
20# APP__DB__PRIMARY__URL=postgres://...
21# APP__JWT__ACCESS_TTL=15m
22# APP__GIT_SSH__PORT=2222
23#
24# All fields have working defaults in code; this file only needs to override
25# the ones you want different from the in-code defaults. Keys you omit fall
26# back to those defaults.
27# =============================================================================
28
29# -----------------------------------------------------------------------------
30# Primary relational database (Postgres).
31# `replicas` is a read-replica pool; leave empty when not using one.
32# -----------------------------------------------------------------------------
331db:
342 primary:
35 url: "postgres://untitled:untitled@127.0.0.1:5432/untitled"
3 url: "postgres://postgres@192.168.100.5:5432/postgres"
364 max_connections: 20
375 min_connections: 2
38 max_lifetime: 1800 # seconds
39 idle_timeout: 600 # seconds
40 acquire_timeout: 5 # seconds
6 max_lifetime: 1800
7 idle_timeout: 600
8 acquire_timeout: 5
419 schema: null
4210 application_name: "gitdataai"
4311 replicas: []
4412 max_connections_total: 100
45 query_timeout: 30 # seconds
13 query_timeout: 30
4614 auto_migrate: true
4715 sqlx_logging: false
4816 slow_query_threshold_ms: 500
4917
50# -----------------------------------------------------------------------------
51# Redis used for cache, queue coordination, rate limiting, presence, etc.
52# -----------------------------------------------------------------------------
18
5319cache:
5420 urls:
55 - "redis://127.0.0.1:6379"
56 mode: "Single" # Single | Cluster | Sentinel (PascalCase variants)
21 - "redis://192.168.100.5:6379"
22 - "redis://192.168.100.5:6380"
23 - "redis://192.168.100.5:6381"
24 - "redis://192.168.100.5:6382"
25 - "redis://192.168.100.5:6383"
26 - "redis://192.168.100.5:6384"
27 mode: "Cluster"
5728 connection_timeout_ms: 2000
5829 response_timeout_ms: 5000
5930 password: null
6031 database: 0
6132
62# -----------------------------------------------------------------------------
63# In-process LRU cache (moka). Optional on-disk spill is disabled by default.
64# -----------------------------------------------------------------------------
33
6534app_cache:
6635 enabled: true
6736 ttl_seconds: 300
6837 max_capacity: 10000
69 max_size: 50000000 # bytes
38 max_size: 50000000
7039 enable_disk: false
7140 disk_path: null
7241 disk_cache_max_size: 200000000
7342 disk_cache_max_capacity: 100000
7443
75# -----------------------------------------------------------------------------
76# Kafka (rdkafka) producer/consumer settings shared by every queue consumer.
77# `topic_prefix` is prepended to every domain topic.
78# -----------------------------------------------------------------------------
44
7945queue:
8046 enabled: true
81 brokers: "127.0.0.1:9092"
47 brokers: "192.168.100.5:9092"
8248 client_id: "untitled"
83 topic_prefix: "untitled"
84 default_group_id: "untitled"
49 topic_prefix: "gta"
50 default_group_id: "gta"
8551 message_timeout_ms: 5000
8652 session_timeout_ms: 10000
87 auto_offset_reset: "earliest" # earliest | latest | none
88 producer_compression: "lz4" # none | gzip | snappy | lz4 | zstd
89 producer_acks: "all" # 0 | 1 | all
53 auto_offset_reset: "earliest"
54 producer_compression: "lz4"
55 producer_acks: "all"
9056 publish_queue_timeout_ms: 1000
9157 subscribe_max_retries: 3
9258 subscribe_graceful_shutdown_ms: 5000
9359 additional_properties: {}
9460
95# -----------------------------------------------------------------------------
96# Outbound SMTP for transactional email (verification codes, digests, etc.).
97# -----------------------------------------------------------------------------
61
9862email:
9963 enabled: true
100 smtp_host: "127.0.0.1"
64 smtp_host: "smtpdm.aliyun.com"
10165 smtp_port: 587
102 smtp_username: null
103 smtp_password: null
104 from_address: "no-reply@example.com"
66 smtp_username: "bot@mail.gitdata.ai"
67 smtp_password: "gitdataAI123456"
68 from_address: "bot@mail.gitdata.ai"
10569 from_name: "No Reply"
10670 connection_timeout_ms: 5000
10771 response_timeout_ms: 10000
10872 template_dir: null
10973 default_locale: "en"
110 max_attachment_bytes: 26214400 # 25 MiB
74 max_attachment_bytes: 26214400
11175 subscriber_group_id: "email-service"
11276 auto_offset_reset: "earliest"
11377
114# -----------------------------------------------------------------------------
115# Blob storage backend (avatars, attachments, exports).
116# `backend` selects between `local` and `s3` blocks.
117# -----------------------------------------------------------------------------
78
11879storage:
119 backend: "local" # local | s3
80 backend: "s3" # local | s3
12081 local:
12182 root_dir: "./storage"
12283 s3:
123 endpoint: null
84 endpoint: "http://192.168.100.5:9000"
12485 region: "us-east-1"
125 bucket: ""
126 access_key_id: null
127 secret_access_key: null
86 bucket: "gitdataai"
87 access_key_id: admin
88 secret_access_key: mysecret123
12889 prefix: null
129 allow_http: false
90 allow_http: true
91
13092
131# -----------------------------------------------------------------------------
132# JWT signing parameters. Durations accept seconds (`900`), a number (`15m`),
133# or `seconds.nanoseconds` (`900.0`).
134# `hmac_secret` / private key material is read at runtime — keep the placeholder
135# here and inject the real value via env (`APP__JWT__...`).
136# -----------------------------------------------------------------------------
13793jwt:
13894 issuer: "untitled"
13995 audience: "untitled-api"
@@ -144,10 +100,6 @@
144100 default_grace_duration: "7d"
145101 default_key_pair_algorithm: "EdDSA"
146102
147# -----------------------------------------------------------------------------
148# Password policy, cookies, OAuth, agreements.
149# OAuth provider blocks are nullable; leave null when the provider is unused.
150# -----------------------------------------------------------------------------
151103auth:
152104 password_policy:
153105 min_length: 8
@@ -189,10 +141,7 @@
189141 # Privacy
190142 This document is a placeholder. Please replace before production.
191143
192# -----------------------------------------------------------------------------
193# Proof-of-work challenge used to throttle anonymous traffic.
194# `hmac_secret` must be injected via env in production.
195# -----------------------------------------------------------------------------
144
196145pow:
197146 hmac_secret: ""
198147 algorithm: "PBKDF2/SHA-256"
@@ -203,9 +152,7 @@
203152 parallelism: null
204153 challenge_ttl: "5m"
205154
206# -----------------------------------------------------------------------------
207# Limits / defaults for the issues tracker.
208# -----------------------------------------------------------------------------
155
209156issues:
210157 max_pagination: 100
211158 default_pagination: 20
@@ -223,9 +170,6 @@
223170 max_dependency_label_len: 100
224171 max_event_content_len: 4096
225172
226# -----------------------------------------------------------------------------
227# Project cache TTLs and pagination caps.
228# -----------------------------------------------------------------------------
229173project:
230174 cache_ttl_project_secs: 300
231175 cache_ttl_member_role_secs: 60
@@ -233,10 +177,6 @@
233177 default_page_size: 20
234178 max_page_size: 100
235179
236# -----------------------------------------------------------------------------
237# Repository (git) limits and storage roots. Paths must be non-empty — the
238# loader rejects empty git/lfs roots via AppConfig::validate.
239# -----------------------------------------------------------------------------
240180repo:
241181 max_pagination: 100
242182 default_pagination: 20
@@ -249,16 +189,13 @@
249189 max_release_body_len: 65535
250190 default_branch: "main"
251191 default_object_format: "sha1"
252 git_storage_root: "/var/lib/repo/git"
253 lfs_storage_root: "/var/lib/repo/lfs"
192 git_storage_root: "./data/repo/git"
193 lfs_storage_root: "./data/repo/lfs"
254194 branch_protection_priority_max: 10000
255195 max_topics_per_repo: 25
256196 max_pr_title_len: 255
257197 max_pr_body_len: 65535
258198
259# -----------------------------------------------------------------------------
260# Spaces (workspaces / orgs) limits.
261# -----------------------------------------------------------------------------
262199space:
263200 max_pagination: 100
264201 default_pagination: 20
@@ -272,10 +209,7 @@
272209 max_purpose_len: 512
273210 invite_expiry_hours: 24
274211
275# -----------------------------------------------------------------------------
276# User profiles, rate limits, deletion grace.
277# `default_visibility` is `public | registered_only | members_only | private`.
278# -----------------------------------------------------------------------------
212
279213user:
280214 max_profile_pagination: 100
281215 default_profile_pagination: 20
@@ -300,9 +234,7 @@
300234 default_locale: "en"
301235 default_timezone: "UTC"
302236
303# -----------------------------------------------------------------------------
304# Payment provider integration (Airwallex).
305# -----------------------------------------------------------------------------
237
306238payment:
307239 currency: "CNY"
308240 max_pagination: 100
@@ -312,21 +244,16 @@
312244 api_key: ""
313245 webhook_secret: ""
314246
315# -----------------------------------------------------------------------------
316# Global rate-limit defaults.
317# -----------------------------------------------------------------------------
318247rate_limit:
319248 default_limit: 100
320249 window_secs: 60
321250 cookie_name: "rl_id"
322251 cookie_secure: true
323252
324# -----------------------------------------------------------------------------
325# Meilisearch settings.
326# -----------------------------------------------------------------------------
253
327254search:
328255 enabled: true
329 host: "http://127.0.0.1:7700"
256 host: "http://192.168.100.5:7700"
330257 api_key: null # master/admin key; null is allowed for local dev
331258 index_prefix: "untitled"
332259 default_primary_key: "id"
@@ -334,11 +261,7 @@
334261 task_wait_timeout_ms: 30000
335262 task_poll_interval_ms: 50
336263
337# -----------------------------------------------------------------------------
338# Chat / live-chat messaging (storagelayer + glayer).
339# `topic_prefix` MUST equal `gateway.topic_prefix` below — enforced at startup.
340# This struct uses `deny_unknown_fields`; do not add keys that aren't listed.
341# -----------------------------------------------------------------------------
264
342265chat:
343266 enabled: true
344267 topic_prefix: "chat"
@@ -352,9 +275,7 @@
352275 presence_ttl_seconds: 120
353276 unread_ttl_seconds: 2592000
354277
355# -----------------------------------------------------------------------------
356# WebSocket gateway (presence, typing, push). `deny_unknown_fields`.
357# -----------------------------------------------------------------------------
278
358279gateway:
359280 ws_heartbeat_interval_seconds: 30
360281 ws_idle_timeout_seconds: 120
@@ -365,41 +286,32 @@
365286 upload_presign_ttl_seconds: 900
366287 typing_debounce_seconds: 2
367288
368# -----------------------------------------------------------------------------
369# Live streaming backend (third-party SaaS). Disabled by default.
370# `deny_unknown_fields` — keep the key list minimal.
371# -----------------------------------------------------------------------------
289
372290live:
373 enabled: false
374 base_url: ""
375 api_key: ""
376 api_secret: ""
377 webhook_secret: ""
291 enabled: true
292 base_url: "http://192.168.100.5:7880"
293 api_key: "devkey"
294 api_secret: "secret12345678901234567890123456"
295 webhook_secret: "secret12345678901234567890123456"
378296 room_token_ttl_seconds: 600
379297 empty_timeout_seconds: 300
380298
381# -----------------------------------------------------------------------------
382# GitSmart: HTTP smart-protocol server (clone/fetch/push, LFS).
383# -----------------------------------------------------------------------------
299
384300git_smart:
385301 bind_addr: "0.0.0.0"
386302 port: 8080
387 git_storage_root: "/var/lib/repo/git"
388 lfs_storage_root: "/var/lib/repo/lfs"
303 git_storage_root: "./data/repo/git"
304 lfs_storage_root: "./data/repo/lfs"
389305 object_cache_prefix: "gitsmart"
390306 object_cache_ttl: 300
391307 max_lfs_object_size: 1073741824 # 1 GiB
392308
393# -----------------------------------------------------------------------------
394# GitSsh: SSH server for git+ssh transport.
395# Inactivity / keepalive durations are seconds (plain integer) per
396# `deserialize_std_duration` (also accepts `{ secs, nanos }`).
397# -----------------------------------------------------------------------------
309
398310git_ssh:
399311 bind_addr: "0.0.0.0"
400312 port: 2222
401 host_key_path: "/etc/gitssh/ssh_host_ed25519_key"
402 git_storage_root: "/var/lib/repo/git"
313 host_key_path: "./config/ssh_host_ed25519_key"
314 git_storage_root: "./data/repo/git"
403315 max_sessions: 32
404316 banner: null
405317 auth_rejection_time: 1 # seconds
@@ -407,15 +319,10 @@
407319 keepalive_interval: 30 # seconds
408320 keepalive_max: 3
409321
410# -----------------------------------------------------------------------------
411# Git authentication policy.
412# -----------------------------------------------------------------------------
322
413323git_auth:
414324 allow_anonymous_read: false
415325
416# -----------------------------------------------------------------------------
417# Git sync workers (Kafka-driven background re-sync).
418# -----------------------------------------------------------------------------
419326git_sync:
420327 queue_topic: "gta.git.sync"
421328 dlq_topic: "gta.git.sync.dlq"
@@ -426,26 +333,16 @@
426333 max_lock_retries: 5
427334 language_timeout_secs: 30
428335 max_languages: 50
429# -----------------------------------------------------------------------------
430# Observability (OpenObserve via OTLP/HTTP).
431#
432# When `enabled`, the `obs` crate exports all three signals to OpenObserve:
433# traces -> {endpoint}/traces
434# logs -> {endpoint}/logs
435# metrics -> {endpoint}/metrics
436# For OpenObserve the OTLP base is `http://host:5080/api/{organization}/v1`.
437# Auth: use either `token` (Bearer) or `user` + `password` (Basic), not both.
438# Set APP__OBS__ENDPOINT / APP__OBS__TOKEN to override at runtime.
439# -----------------------------------------------------------------------------
336
440337obs:
441 enabled: false
442 service_name: "" # when empty each app falls back to its own name
443 service_version: ""
444 stream_name: "" # OpenObserve `stream-name` for logs/traces; empty -> service_name
445 endpoint: "http://127.0.0.1:5080/api/default/v1"
338 enabled: true
339 service_name: "gta"
340 service_version: "1.93"
341 stream_name: "default"
342 endpoint: "http://192.168.100.5:5080/api/default/"
446343 token: null
447 user: null
448 password: null
344 user: "admin@local.dev"
345 password: "XwCWSaXLx26dllYV"
449346 enable_logs: true
450347 enable_metrics: true
451348 enable_traces: true
@@ -456,20 +353,7 @@
456353 console_log: true # keep local console output while exporting
457354 log_level: "" # empty -> "info"; apps fall back to their own richer default
458355
459# -----------------------------------------------------------------------------
460# MCP (Model Context Protocol) server.
461# Single Streamable HTTP endpoint with two authentication tracks:
462# * External: `Authorization: Bearer <user-access-key>` (verified against
463# `user_access_keys`; scope gates write tools).
464# * Internal: `X-Mcp-Internal-Key: <secret>` or `Authorization: Bearer
465# <secret>`, allowed only from the platform whitelist (RFC 1918 +
466# Docker/Podman bridge networks + common Kubernetes pod/service CIDRs;
467# see `lib/mcp/ip_filter.rs::BUILTIN_INTERNAL_CIDRS`). Extras below append.
468# Routes (default):
469# * POST /api/v1/mcp — dual-track (external / whitelisted-internal)
470# * POST /api/v1/internal/mcp — internal-only (non-whitelisted IP -> 403)
471# Runtime overrides: APP__MCP__INTERNAL_SECRET_KEY / APP__MCP__INTERNAL_ALLOWED_CIDRS.
472# -----------------------------------------------------------------------------
356
473357mcp:
474358 enabled: true
475359 external_path: "mcp" # -> POST /api/v1/mcp
@@ -479,3 +363,14 @@
479363 trust_proxy: false # true ONLY when a real trusted proxy strips inbound spoof headers
480364 system_user_id: null # acting user UUID for internal-track tool calls
481365 max_request_bytes: 1048576
366
367webhook:
368 max_attempts: 5
369 base_delay: 500ms
370 max_delay: 30s
371 request_timeout: 10s
372 connect_timeout: 2s
373 pool_max_idle_per_host: 8
374 pool_idle_timeout: 90s
375 follow_redirects: true
376 max_concurrent_dispatches: 32
No newline at end of file
Modified lib/config/src/duration.rs lib/config/src/duration.rs +39 −9 View lib/config/src/duration.rs
@@ -30,23 +30,39 @@
3030 let mut total = TimeDuration::ZERO;
3131 let mut buf = String::new();
3232 let mut any = false;
33 for ch in s.chars() {
33 let chars: Vec<char> = s.chars().collect();
34 let mut i = 0;
35 while i < chars.len() {
36 let ch = chars[i];
3437 if ch.is_ascii_digit() || ch == '-' {
3538 buf.push(ch);
36 } else {
39 i += 1;
40 continue;
41 }
42 // two-char unit `ms` must be checked before single `s` / `m`
43 if i + 1 < chars.len() && ch == 'm' && chars[i + 1] == 's' {
3744 let value: i64 = buf
3845 .parse()
3946 .map_err(|_| format!("invalid number in duration {s:?}"))?;
40 match ch {
41 's' => total += TimeDuration::seconds(value),
42 'm' => total += TimeDuration::minutes(value),
43 'h' => total += TimeDuration::hours(value),
44 'd' => total += TimeDuration::days(value),
45 other => return Err(format!("unknown duration unit {other:?} in {s:?}")),
46 }
47 total += TimeDuration::milliseconds(value);
4748 buf.clear();
4849 any = true;
50 i += 2;
51 continue;
52 }
53 let value: i64 = buf
54 .parse()
55 .map_err(|_| format!("invalid number in duration {s:?}"))?;
56 match ch {
57 's' => total += TimeDuration::seconds(value),
58 'm' => total += TimeDuration::minutes(value),
59 'h' => total += TimeDuration::hours(value),
60 'd' => total += TimeDuration::days(value),
61 other => return Err(format!("unknown duration unit {other:?} in {s:?}")),
4962 }
63 buf.clear();
64 any = true;
65 i += 1;
5066 }
5167 if !buf.is_empty() {
5268 return Err(format!("trailing number without unit in {s:?}"));
@@ -85,10 +101,17 @@
85101 enum Repr {
86102 Secs(u64),
87103 Struct { secs: u64, nanos: u32 },
104 Text(String),
88105 }
89106 match Repr::deserialize(d)? {
90107 Repr::Secs(secs) => Ok(StdDuration::from_secs(secs)),
91108 Repr::Struct { secs, nanos } => Ok(StdDuration::new(secs, nanos)),
109 Repr::Text(t) => {
110 let td = parse_human_time(&t).map_err(de_error)?;
111 let secs = td.whole_seconds().max(0) as u64;
112 let nanos = td.subsec_nanoseconds().max(0) as u32;
113 Ok(StdDuration::new(secs, nanos))
114 }
92115 }
93116}
94117
@@ -101,10 +124,17 @@
101124 enum Repr {
102125 Secs(u64),
103126 Struct { secs: u64, nanos: u32 },
127 Text(String),
104128 }
105129 match Option::<Repr>::deserialize(d)? {
106130 Some(Repr::Secs(secs)) => Ok(Some(StdDuration::from_secs(secs))),
107131 Some(Repr::Struct { secs, nanos }) => Ok(Some(StdDuration::new(secs, nanos))),
132 Some(Repr::Text(t)) => {
133 let td = parse_human_time(&t).map_err(de_error)?;
134 let secs = td.whole_seconds().max(0) as u64;
135 let nanos = td.subsec_nanoseconds().max(0) as u32;
136 Ok(Some(StdDuration::new(secs, nanos)))
137 }
108138 None => Ok(None),
109139 }
110140}
Modified lib/config/src/loader.rs lib/config/src/loader.rs +2 −2 View lib/config/src/loader.rs
@@ -22,8 +22,8 @@
2222impl ConfigLoader {
2323 pub fn new() -> Self {
2424 Self {
25 config_file: Some(PathBuf::from("config.toml")),
26 local_config_file: Some(PathBuf::from("config.local.toml")),
25 config_file: Some(PathBuf::from("config/default.yaml")),
26 local_config_file: Some(PathBuf::from("config/local.yaml")),
2727 env_prefix: "APP".to_string(),
2828 use_env: true,
2929 use_dotenv: true,
Modified lib/config/src/obs.rs lib/config/src/obs.rs +1 −1 View lib/config/src/obs.rs
@@ -35,7 +35,7 @@
3535 service_name: String::new(),
3636 service_version: String::new(),
3737 stream_name: String::new(),
38 endpoint: "http://127.0.0.1:5080/api/default/v1".to_string(),
38 endpoint: "http://127.0.0.1:5080/api/default".to_string(),
3939 token: None,
4040 user: None,
4141 password: None,
Modified lib/db/issue/issue_reactions.rs lib/db/issue/issue_reactions.rs +6 −0 View lib/db/issue/issue_reactions.rs
@@ -8,10 +8,16 @@
88pub struct Model {
99 #[sea_orm(primary_key, auto_increment = false)]
1010 pub id: Uuid,
11 #[sea_orm(unique_key = "issue_user_emoji")]
1112 pub issue_id: Option<Uuid>,
13 #[sea_orm(unique_key = "comment_user_emoji")]
1214 pub comment_id: Option<Uuid>,
1315 pub project_id: Option<Uuid>,
16 #[sea_orm(unique_key = "issue_user_emoji")]
17 #[sea_orm(unique_key = "comment_user_emoji")]
1418 pub user_id: Uuid,
19 #[sea_orm(unique_key = "issue_user_emoji")]
20 #[sea_orm(unique_key = "comment_user_emoji")]
1521 pub emoji: String,
1622 pub created_at: OffsetDateTime,
1723 #[sea_orm(belongs_to, from = "issue_id", to = "id")]
Modified lib/db/issue/issue_watch.rs lib/db/issue/issue_watch.rs +4 −0 View lib/db/issue/issue_watch.rs
@@ -9,8 +9,12 @@
99pub struct Model {
1010 #[sea_orm(primary_key, auto_increment = false)]
1111 pub id: Uuid,
12 #[sea_orm(unique_key = "issue_user")]
1213 pub issue_id: Option<Uuid>,
14 #[sea_orm(unique_key = "project_user")]
1315 pub project_id: Option<Uuid>,
16 #[sea_orm(unique_key = "issue_user")]
17 #[sea_orm(unique_key = "project_user")]
1418 pub user_id: Uuid,
1519 pub mode: WatchMode,
1620 pub created_at: OffsetDateTime,
Modified lib/db/live/meets.rs lib/db/live/meets.rs +2 −0 View lib/db/live/meets.rs
@@ -21,7 +21,9 @@
2121 #[sea_orm(primary_key, auto_increment = false)]
2222 pub id: Uuid,
2323 #[sea_orm(indexed)]
24 #[sea_orm(unique_key = "active_per_channel")]
2425 pub channel_id: Uuid,
26 #[sea_orm(unique_key = "room_name")]
2527 pub room_name: String,
2628 pub status: MeetStatus,
2729 #[sea_orm(indexed)]
Modified lib/db/project/project_favorites.rs lib/db/project/project_favorites.rs +3 −0 View lib/db/project/project_favorites.rs
@@ -8,8 +8,11 @@
88pub struct Model {
99 #[sea_orm(primary_key, auto_increment = false)]
1010 pub id: Uuid,
11 #[sea_orm(unique_key = "project_user_folder")]
1112 pub project_id: Uuid,
13 #[sea_orm(unique_key = "project_user_folder")]
1214 pub user_id: Uuid,
15 #[sea_orm(unique_key = "project_user_folder")]
1316 pub folder: Option<String>,
1417 pub created_at: OffsetDateTime,
1518 #[sea_orm(belongs_to, from = "project_id", to = "id")]
Modified lib/db/schema.rs lib/db/schema.rs +26 −0 View lib/db/schema.rs
@@ -1,7 +1,33 @@
11use crate::conn::DbError;
22use sea_orm::{ConnectionTrait, DatabaseBackend, DatabaseConnection};
33
4/// Legacy unique indexes that used to be owned by `schema_extras.sql` with
5/// partial WHERE predicates. sea-orm's entity-first sync drops any unique
6/// index it cannot map to a `#[sea_orm(unique_key)]` annotation by emitting
7/// `ALTER TABLE ... DROP CONSTRAINT` on Postgres, which fails when only a
8/// free-standing unique index exists (no matching pg_constraint row). The
9/// corresponding unique keys are now declared on the entity columns, so the
10/// entity sync recognizes them by column-set match. We DROP the legacy
11/// indexes here, before sync runs, so that sync never sees them and never
12/// tries to drop them. The non-partial replacements are then created by
13/// the entity sync itself.
14const PRE_SYNC_INDEX_CLEANUP: &str = "
15 DROP INDEX IF EXISTS idx_issue_watch_issue_user;
16 DROP INDEX IF EXISTS idx_issue_watch_project_user;
17 DROP INDEX IF EXISTS idx_issue_reaction_issue;
18 DROP INDEX IF EXISTS idx_issue_reaction_comment;
19 DROP INDEX IF EXISTS idx_project_favorites_unique;
20 DROP INDEX IF EXISTS idx_meet_room_name;
21 DROP INDEX IF EXISTS idx_meet_active_per_channel;
22";
23
424pub async fn sync_schema(db: &DatabaseConnection) -> Result<(), DbError> {
25 if db.get_database_backend() == DatabaseBackend::Postgres {
26 db.execute_unprepared(PRE_SYNC_INDEX_CLEANUP)
27 .await
28 .map_err(DbError::SchemaSync)?;
29 }
30
531 db.get_schema_registry("db::")
632 .sync(db)
733 .await
Modified lib/db/schema_extras.sql lib/db/schema_extras.sql +7 −18 View lib/db/schema_extras.sql
@@ -15,23 +15,6 @@
1515DROP TABLE IF EXISTS chat_members;
1616
1717-- ---------------------------------------------------------------------------
18-- Partial unique indexes (polymorphic targets, WHERE-clause filtered).
19-- Not expressible as #[sea_orm(unique_key)] — overlapping columns and partial
20-- predicates have no entity attribute. `sync` drops undeclared unique indexes,
21-- so these are recreated here on every startup.
22-- ---------------------------------------------------------------------------
23CREATE UNIQUE INDEX IF NOT EXISTS idx_issue_watch_issue_user
24 ON issue_watch (issue_id, user_id) WHERE issue_id IS NOT NULL;
25CREATE UNIQUE INDEX IF NOT EXISTS idx_issue_watch_project_user
26 ON issue_watch (project_id, user_id) WHERE project_id IS NOT NULL;
27CREATE UNIQUE INDEX IF NOT EXISTS idx_issue_reaction_issue
28 ON issue_reaction (issue_id, user_id, emoji) WHERE issue_id IS NOT NULL;
29CREATE UNIQUE INDEX IF NOT EXISTS idx_issue_reaction_comment
30 ON issue_reaction (comment_id, user_id, emoji) WHERE comment_id IS NOT NULL;
31CREATE UNIQUE INDEX IF NOT EXISTS idx_project_favorites_unique
32 ON project_favorites (project_id, user_id, COALESCE(folder, ''));
33
34-- ---------------------------------------------------------------------------
3518-- Composite non-unique indexes (entity attributes are single-column only).
3619-- ---------------------------------------------------------------------------
3720CREATE INDEX IF NOT EXISTS idx_project_space_order ON project (space_id, sort_order);
@@ -119,9 +102,15 @@
119102-- ---------------------------------------------------------------------------
120103-- LiveKit meet / participant indexes.
121104-- Partial unique index: each channel has at most one active meet at a time.
105-- The `idx_meet_room_name` non-partial unique is owned by entity
106-- (`#[sea_orm(unique_key = "room_name")]` on meet.room_name). The
107-- `idx_meet_active_per_channel` partial unique is the only remaining
108-- schema-extras-owned unique index and is recreated below after the entity
109-- sync pass; on a fresh DB it is the source of truth, while on existing DBs
110-- the pre-sync `DROP INDEX IF EXISTS` in the cleanup section above resets
111-- the index to match the entity-declared non-partial unique.
122112-- ---------------------------------------------------------------------------
123113CREATE UNIQUE INDEX IF NOT EXISTS idx_meet_active_per_channel ON meet (channel_id) WHERE status = 1;
124CREATE UNIQUE INDEX IF NOT EXISTS idx_meet_room_name ON meet (room_name);
125114
126115-- ---------------------------------------------------------------------------
127116-- repo_branch_protection_policy additions for H6 (pre-receive enforcement).
Modified lib/export/repo/tag.rs lib/export/repo/tag.rs +0 −4 View lib/export/repo/tag.rs
@@ -12,10 +12,6 @@
1212 ts.format(&Rfc3339).unwrap_or_default()
1313}
1414
15fn fmt_ts_opt(ts: Option<OffsetDateTime>) -> Option<String> {
16 ts.map(fmt_ts)
17}
18
1915#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
2016pub struct TagView {
2117 pub id: Uuid,
Modified lib/issues/handler/routes.rs lib/issues/handler/routes.rs +34 −34 View lib/issues/handler/routes.rs
@@ -10,146 +10,146 @@
1010 let protected: Router<IssueService> = Router::new()
1111 .route("/issues", post(super::issues::create::handler))
1212 .route("/issues", get(super::issues::list::handler))
13 .route("/issues/:channel_id", get(super::issues::get::handler))
14 .route("/issues/:channel_id", patch(super::issues::update::handler))
13 .route("/issues/{channel_id}", get(super::issues::get::handler))
14 .route("/issues/{channel_id}", patch(super::issues::update::handler))
1515 .route(
16 "/issues/:channel_id",
16 "/issues/{channel_id}",
1717 delete(super::issues::delete::handler),
1818 )
19 .route("/issues/:channel_id", post(super::issue::create::handler))
19 .route("/issues/{channel_id}", post(super::issue::create::handler))
2020 .route(
21 "/issues/:channel_id/:issue_id",
21 "/issues/{channel_id}/{issue_id}",
2222 get(super::issue::get::handler)
2323 .patch(super::issue::update::handler)
2424 .delete(super::issue::delete::handler),
2525 )
2626 .route(
27 "/issues/:channel_id/:issue_id/close",
27 "/issues/{channel_id}/{issue_id}/close",
2828 post(super::issue::close::handler),
2929 )
3030 .route(
31 "/issues/:channel_id/:issue_id/comments",
31 "/issues/{channel_id}/{issue_id}/comments",
3232 get(super::comment::list::handler).post(super::comment::create::handler),
3333 )
3434 .route(
35 "/issues/:channel_id/:issue_id/comments/:comment_id",
35 "/issues/{channel_id}/{issue_id}/comments/{comment_id}",
3636 get(super::comment::get::handler)
3737 .patch(super::comment::update::handler)
3838 .delete(super::comment::delete::handler),
3939 )
4040 .route(
41 "/issues/:channel_id/labels",
41 "/issues/{channel_id}/labels",
4242 get(super::label::list::handler).post(super::label::create::handler),
4343 )
4444 .route(
45 "/issues/:channel_id/:issue_id/labels",
45 "/issues/{channel_id}/{issue_id}/labels",
4646 get(super::label::list_for_issue::handler),
4747 )
4848 .route(
49 "/issues/:channel_id/:issue_id/labels/:label_id",
49 "/issues/{channel_id}/{issue_id}/labels/{label_id}",
5050 post(super::label::bind::handler).delete(super::label::unbind::handler),
5151 )
5252 .route(
53 "/issues/:channel_id/labels/:label_id",
53 "/issues/{channel_id}/labels/{label_id}",
5454 get(super::label::get::handler)
5555 .patch(super::label::update::handler)
5656 .delete(super::label::delete::handler),
5757 )
5858 .route(
59 "/issues/:channel_id/milestones",
59 "/issues/{channel_id}/milestones",
6060 get(super::milestone::list::handler).post(super::milestone::create::handler),
6161 )
6262 .route(
63 "/issues/:channel_id/milestones/:milestone_id",
63 "/issues/{channel_id}/milestones/{milestone_id}",
6464 get(super::milestone::get::handler)
6565 .patch(super::milestone::update::handler)
6666 .delete(super::milestone::delete::handler),
6767 )
6868 .route(
69 "/issues/:channel_id/:issue_id/reactions",
69 "/issues/{channel_id}/{issue_id}/reactions",
7070 post(super::issue_reaction::create::handler).get(super::issue_reaction::list::handler),
7171 )
7272 .route(
73 "/issues/:channel_id/:issue_id/comments/:comment_id/reactions",
73 "/issues/{channel_id}/{issue_id}/comments/{comment_id}/reactions",
7474 post(super::issue_reaction::create_comment::handler)
7575 .get(super::issue_reaction::list_comment::handler),
7676 )
7777 .route(
78 "/issues/:channel_id/:issue_id/reactions/:reaction_id",
78 "/issues/{channel_id}/{issue_id}/reactions/{reaction_id}",
7979 delete(super::issue_reaction::delete::handler),
8080 )
8181 .route(
82 "/issues/:channel_id/:issue_id/watch",
82 "/issues/{channel_id}/{issue_id}/watch",
8383 get(super::issue_watch::get::handler)
8484 .put(super::issue_watch::upsert::handler)
8585 .delete(super::issue_watch::delete::handler),
8686 )
8787 .route(
88 "/issues/:channel_id/:issue_id/members",
88 "/issues/{channel_id}/{issue_id}/members",
8989 get(super::issue_member::list::handler).post(super::issue_member::create::handler),
9090 )
9191 .route(
92 "/issues/:channel_id/:issue_id/members/:member_id",
92 "/issues/{channel_id}/{issue_id}/members/{member_id}",
9393 delete(super::issue_member::delete::handler),
9494 )
9595 .route(
96 "/issues/:channel_id/pins",
96 "/issues/{channel_id}/pins",
9797 get(super::issue_pin::list::handler).post(super::issue_pin::create::handler),
9898 )
9999 .route(
100 "/issues/:channel_id/pins/:pin_id",
100 "/issues/{channel_id}/pins/{pin_id}",
101101 delete(super::issue_pin::delete::handler),
102102 )
103103 .route(
104 "/issues/:channel_id/:issue_id/repo_relations",
104 "/issues/{channel_id}/{issue_id}/repo_relations",
105105 get(super::issue_repo_rel::list::handler).post(super::issue_repo_rel::create::handler),
106106 )
107107 .route(
108 "/issues/:channel_id/:issue_id/repo_relations/:rel_id",
108 "/issues/{channel_id}/{issue_id}/repo_relations/{rel_id}",
109109 delete(super::issue_repo_rel::delete::handler),
110110 )
111111 .route(
112 "/issues/:channel_id/:issue_id/users",
112 "/issues/{channel_id}/{issue_id}/users",
113113 get(super::issue_user::list::handler),
114114 )
115115 .route(
116 "/issues/:channel_id/:issue_id/users/:uid",
116 "/issues/{channel_id}/{issue_id}/users/{uid}",
117117 patch(super::issue_user::update::handler),
118118 )
119119 .route(
120 "/issues/:channel_id/:issue_id/events",
120 "/issues/{channel_id}/{issue_id}/events",
121121 get(super::issue_event::list::handler),
122122 )
123123 .route(
124 "/issues/:channel_id/:issue_id/dependencies",
124 "/issues/{channel_id}/{issue_id}/dependencies",
125125 get(super::issue_dependency::list::handler)
126126 .post(super::issue_dependency::create::handler),
127127 )
128128 .route(
129 "/issues/:channel_id/:issue_id/dependencies/:dep_id",
129 "/issues/{channel_id}/{issue_id}/dependencies/{dep_id}",
130130 delete(super::issue_dependency::delete::handler),
131131 )
132132 .route(
133 "/issues/:channel_id/:issue_id/content_history",
133 "/issues/{channel_id}/{issue_id}/content_history",
134134 get(super::issue_content_history::list::handler),
135135 )
136136 .route(
137 "/issues/:channel_id/:issue_id/stopwatch",
137 "/issues/{channel_id}/{issue_id}/stopwatch",
138138 get(super::issue_stopwatch::get::handler)
139139 .post(super::issue_stopwatch::start::handler)
140140 .delete(super::issue_stopwatch::stop::handler),
141141 )
142142 .route(
143 "/issues/:channel_id/:issue_id/tracked_time",
143 "/issues/{channel_id}/{issue_id}/tracked_time",
144144 get(super::issue_tracked_time::list::handler),
145145 )
146146 .route(
147 "/issues/:channel_id/attachments/:owner_type/:owner_id",
147 "/issues/{channel_id}/attachments/{owner_type}/{owner_id}",
148148 post(super::issue_attachment::upload::handler)
149149 .get(super::issue_attachment::list::handler),
150150 )
151151 .route(
152 "/issues/:channel_id/attachments/:owner_type/:owner_id/:att_id",
152 "/issues/{channel_id}/attachments/{owner_type}/{owner_id}/{att_id}",
153153 delete(super::issue_attachment::delete::handler),
154154 )
155155 .layer(from_fn_with_state(
Modified lib/mcp/router.rs lib/mcp/router.rs +10 −2 View lib/mcp/router.rs
@@ -26,8 +26,8 @@
2626 }
2727
2828 let http_svc = build_streamable_service(&svc);
29 let external_path = svc.settings.external_path.trim_start_matches('/').to_string();
30 let internal_path = svc.settings.internal_path.trim_start_matches('/').to_string();
29 let external_path = ensure_leading_slash(&svc.settings.external_path);
30 let internal_path = ensure_leading_slash(&svc.settings.internal_path);
3131
3232 let external = Router::new()
3333 .nest_service(&external_path, http_svc.clone())
@@ -49,6 +49,14 @@
4949 .layer(DefaultBodyLimit::max(svc.settings.max_request_bytes))
5050}
5151
52fn ensure_leading_slash(path: &str) -> String {
53 if path.starts_with('/') {
54 path.to_string()
55 } else {
56 format!("/{}", path)
57 }
58}
59
5260fn build_streamable_service(
5361 svc: &McpService,
5462) -> StreamableHttpService<McpServer, LocalSessionManager> {
Modified lib/obs/otlp.rs lib/obs/otlp.rs +9 −1 View lib/obs/otlp.rs
@@ -6,7 +6,15 @@
66use opentelemetry_sdk::Resource;
77
88pub(crate) fn endpoint_for(base: &str, signal: &str) -> String {
9 format!("{}/{}", base.trim_end_matches('/'), signal)
9 // OpenObserve ingests OTLP at /api/<org>/v1/<signal>. The opentelemetry-otlp
10 // 0.31 SDK does NOT append "/v1/<signal>" when an endpoint is supplied
11 // programmatically (see opentelemetry-otlp resolve_http_endpoint: the
12 // provided endpoint is used verbatim), so we assemble the full path here.
13 // The base should NOT already contain "/v1"; we strip it defensively in
14 // case operators write the full OTLP URL.
15 let trimmed = base.trim_end_matches('/');
16 let base = trimmed.strip_suffix("/v1").unwrap_or(trimmed);
17 format!("{base}/v1/{signal}")
1018}
1119
1220fn authorization(settings: &ObsSettings) -> Option<(String, String)> {
Modified lib/project/handler/routes.rs lib/project/handler/routes.rs +13 −13 View lib/project/handler/routes.rs
@@ -9,63 +9,63 @@
99pub fn router(svc: ProjectService) -> Router {
1010 let protected: Router<ProjectService> = Router::new()
1111 .route(
12 "/spaces/:space_id/projects",
12 "/spaces/{space_id}/projects",
1313 post(super::lifecycle::create::handler).get(super::lifecycle::list::handler),
1414 )
1515 .route(
16 "/spaces/:space_id/projects/:project_id",
16 "/spaces/{space_id}/projects/{project_id}",
1717 get(super::lifecycle::get::handler)
1818 .patch(super::lifecycle::update::handler)
1919 .delete(super::lifecycle::delete::handler),
2020 )
2121 .route(
22 "/spaces/:space_id/projects/:project_id/members",
22 "/spaces/{space_id}/projects/{project_id}/members",
2323 post(super::members::add::handler).get(super::members::list::handler),
2424 )
2525 .route(
26 "/spaces/:space_id/projects/:project_id/members/:user_id",
26 "/spaces/{space_id}/projects/{project_id}/members/{user_id}",
2727 get(super::members::get::handler)
2828 .patch(super::members::update::handler)
2929 .delete(super::members::remove::handler),
3030 )
3131 .route(
32 "/spaces/:space_id/projects/:project_id/views",
32 "/spaces/{space_id}/projects/{project_id}/views",
3333 post(super::views::create::handler).get(super::views::list::handler),
3434 )
3535 .route(
36 "/spaces/:space_id/projects/:project_id/views/:view_id",
36 "/spaces/{space_id}/projects/{project_id}/views/{view_id}",
3737 get(super::views::get::handler)
3838 .patch(super::views::update::handler)
3939 .delete(super::views::delete::handler),
4040 )
4141 .route(
42 "/spaces/:space_id/projects/:project_id/documents",
42 "/spaces/{space_id}/projects/{project_id}/documents",
4343 post(super::documents::create::handler).get(super::documents::list::handler),
4444 )
4545 .route(
46 "/spaces/:space_id/projects/:project_id/documents/:doc_id",
46 "/spaces/{space_id}/projects/{project_id}/documents/{doc_id}",
4747 get(super::documents::get::handler)
4848 .patch(super::documents::update::handler)
4949 .delete(super::documents::delete::handler),
5050 )
5151 .route(
52 "/spaces/:space_id/projects/:project_id/links",
52 "/spaces/{space_id}/projects/{project_id}/links",
5353 post(super::links::add::handler).get(super::links::list::handler),
5454 )
5555 .route(
56 "/spaces/:space_id/projects/:project_id/links/:link_id",
56 "/spaces/{space_id}/projects/{project_id}/links/{link_id}",
5757 delete(super::links::remove::handler),
5858 )
5959 .route(
60 "/spaces/:space_id/projects/:project_id/favorites",
60 "/spaces/{space_id}/projects/{project_id}/favorites",
6161 post(super::favorites::add::handler).get(super::favorites::list::handler),
6262 )
6363 .route(
64 "/spaces/:space_id/projects/:project_id/favorites/:favorite_id",
64 "/spaces/{space_id}/projects/{project_id}/favorites/{favorite_id}",
6565 delete(super::favorites::remove::handler),
6666 )
6767 .route(
68 "/spaces/:space_id/projects/:project_id/activities",
68 "/spaces/{space_id}/projects/{project_id}/activities",
6969 get(super::activities::list::handler),
7070 );
7171
Modified lib/repo/features/collab/impls.rs lib/repo/features/collab/impls.rs +1 −3 View lib/repo/features/collab/impls.rs
@@ -4,9 +4,7 @@
44use crate::features::RepoService;
55
66use super::usecase;
7use super::{
8 AddCollaboratorOption, CollaboratorPage, CollaboratorView, RepoCollaboratorPermission,
9};
7use super::{AddCollaboratorOption, CollaboratorPage, RepoCollaboratorPermission};
108
119impl RepoService {
1210 pub async fn list_collaborators(
Modified lib/repo/features/commit_status/types.rs lib/repo/features/commit_status/types.rs +0 −1 View lib/repo/features/commit_status/types.rs
@@ -65,7 +65,6 @@
6565 let id = m.id;
6666 let repo_id = m.repo_id;
6767 let sha = m.sha.clone();
68 let context = m.context.clone();
6968 Self {
7069 id,
7170 repo_id,
Modified lib/repo/features/extras/usecase.rs lib/repo/features/extras/usecase.rs +0 −1 View lib/repo/features/extras/usecase.rs
@@ -1,4 +1,3 @@
1use db::conn::sea_orm::*;
21use time::OffsetDateTime;
32use uuid::Uuid;
43
Modified lib/repo/features/topic/impls.rs lib/repo/features/topic/impls.rs +1 −1 View lib/repo/features/topic/impls.rs
@@ -4,7 +4,7 @@
44use crate::features::RepoService;
55
66use super::usecase;
7use super::{RepoTopicOptions, TopicList, TopicSearchQuery, TopicSearchResult, TopicView};
7use super::{RepoTopicOptions, TopicList, TopicSearchQuery, TopicSearchResult};
88
99impl RepoService {
1010 pub async fn list_repo_topics(&self, actor: Uuid, repo_id: Uuid) -> RepoResult<TopicList> {
Modified lib/repo/graphql/mod.rs lib/repo/graphql/mod.rs +1 −1 View lib/repo/graphql/mod.rs
@@ -1,5 +1,5 @@
11use async_graphql::{
2 ComplexObject, Context, EmptyMutation, EmptySubscription, ID, Object, Schema, SimpleObject,
2 ComplexObject, Context, EmptyMutation, EmptySubscription, ID, Object, Schema,
33};
44use serde_json::json;
55use uuid::Uuid;
Modified lib/repo/handler/extras/commit_status_ref.rs lib/repo/handler/extras/commit_status_ref.rs +2 −0 View lib/repo/handler/extras/commit_status_ref.rs
@@ -18,6 +18,7 @@
1818 responses((status = 200, description = "List commit statuses by ref", body = AppResponseData<CommitStatusPage>)),
1919 security(("bearer_auth" = []))
2020)]
21#[allow(dead_code)] // duplicated by /commits/{ref}/statuses route wired via commit_status module
2122pub(crate) async fn list_by_ref_handler(
2223 State(svc): State<RepoService>,
2324 AuthUser { claims }: AuthUser,
@@ -37,6 +38,7 @@
3738 responses((status = 200, description = "Get combined commit status by ref", body = AppResponseData<CombinedStatusView>)),
3839 security(("bearer_auth" = []))
3940)]
41#[allow(dead_code)] // duplicated by /commits/{ref}/status route wired via commit_status module
4042pub(crate) async fn combined_handler(
4143 State(svc): State<RepoService>,
4244 AuthUser { claims }: AuthUser,
Modified lib/repo/handler/extras/commits.rs lib/repo/handler/extras/commits.rs +2 −1 View lib/repo/handler/extras/commits.rs
@@ -37,6 +37,7 @@
3737 responses((status = 200, description = "Get a commit", body = AppResponseData<CommitSummary>)),
3838 security(("bearer_auth" = []))
3939)]
40#[allow(dead_code)] // also wired by lib/repo/handler/routes.rs via /git/commits/{*sha}
4041pub(crate) async fn get_handler(
4142 State(svc): State<RepoService>,
4243 AuthUser { claims }: AuthUser,
@@ -48,7 +49,7 @@
4849
4950#[utoipa::path(
5051 get,
51 path = "/repo/{channel_id}/{repo_id}/git/commits/{sha}.{diff_type}",
52 path = "/repo/{channel_id}/{repo_id}/git/commits/diff/{sha}",
5253 tag = "repo",
5354 responses((status = 200, description = "Get commit diff or patch", content_type = "text/plain")),
5455 security(("bearer_auth" = []))
Modified lib/repo/handler/extras/media.rs lib/repo/handler/extras/media.rs +0 −1 View lib/repo/handler/extras/media.rs
@@ -1,4 +1,3 @@
1use axum::Json;
21use axum::extract::{Path, State};
32use axum::http::HeaderValue;
43use axum::http::header;
Modified lib/repo/handler/extras/raw.rs lib/repo/handler/extras/raw.rs +0 −1 View lib/repo/handler/extras/raw.rs
@@ -1,4 +1,3 @@
1use axum::Json;
21use axum::extract::{Path, State};
32use axum::http::HeaderValue;
43use axum::http::header;
Modified lib/repo/handler/git_ref/diff.rs lib/repo/handler/git_ref/diff.rs +1 −0 View lib/repo/handler/git_ref/diff.rs
@@ -16,6 +16,7 @@
1616 responses((status = 200, description = "Get commit diff or patch", body = CommitDiffPayload)),
1717 security(("bearer_auth" = []))
1818)]
19#[allow(dead_code)]
1920pub(crate) async fn handler(
2021 State(svc): State<RepoService>,
2122 AuthUser { claims }: AuthUser,
Modified lib/repo/handler/routes.rs lib/repo/handler/routes.rs +73 −85 View lib/repo/handler/routes.rs
@@ -1,6 +1,6 @@
11use axum::Router;
22use axum::middleware::from_fn_with_state;
3use axum::routing::{delete, get, patch, post, put};
3use axum::routing::{get, patch, post, put};
44
55use crate::features::RepoService;
66use jwt::inject_jwt_ctx;
@@ -11,321 +11,309 @@
1111 .route("/repos", post(super::lifecycle::create::handler))
1212 .route("/repos", get(super::lifecycle::list::handler))
1313 .route(
14 "/repo/:channel_id/:repo_id",
14 "/repo/{channel_id}/{repo_id}",
1515 get(super::lifecycle::get::handler)
1616 .patch(super::lifecycle::update::handler)
1717 .delete(super::lifecycle::delete::handler),
1818 )
1919 .route(
20 "/repo/:channel_id/:repo_id/transfer",
20 "/repo/{channel_id}/{repo_id}/transfer",
2121 post(super::lifecycle::transfer::handler),
2222 )
2323 .route(
24 "/repo/:channel_id/:repo_id/archive",
24 "/repo/{channel_id}/{repo_id}/archive",
2525 post(super::lifecycle::archive::handler),
2626 )
2727 .route(
28 "/repo/:channel_id/:repo_id/rename",
28 "/repo/{channel_id}/{repo_id}/rename",
2929 post(super::lifecycle::rename::handler),
3030 )
3131 .route(
32 "/repo/:channel_id/:repo_id/forks",
32 "/repo/{channel_id}/{repo_id}/forks",
3333 post(super::lifecycle::fork::handler),
3434 )
3535 .route(
36 "/repo/:channel_id/:repo_id/generate",
36 "/repo/{channel_id}/{repo_id}/generate",
3737 post(super::lifecycle::generate::handler),
3838 )
3939 .route(
40 "/repo/:channel_id/:repo_id/branches",
40 "/repo/{channel_id}/{repo_id}/branches",
4141 get(super::branch::list::handler).post(super::branch::create::handler),
4242 )
4343 .route(
44 "/repo/:channel_id/:repo_id/branches/:name",
44 "/repo/{channel_id}/{repo_id}/branches/{name}",
4545 get(super::branch::get::handler)
4646 .put(super::branch::update::handler)
4747 .delete(super::branch::delete::handler),
4848 )
4949 .route(
50 "/repo/:channel_id/:repo_id/branches/:name/rename",
50 "/repo/{channel_id}/{repo_id}/branches/{name}/rename",
5151 patch(super::branch::rename::handler),
5252 )
5353 .route(
54 "/repo/:channel_id/:repo_id/merge-upstream",
54 "/repo/{channel_id}/{repo_id}/merge-upstream",
5555 post(super::branch::merge_upstream::handler),
5656 )
5757 .route(
58 "/repo/:channel_id/:repo_id/branch_protections",
58 "/repo/{channel_id}/{repo_id}/branch_protections",
5959 get(super::branch_protection::list::handler)
6060 .post(super::branch_protection::create::handler),
6161 )
6262 .route(
63 "/repo/:channel_id/:repo_id/branch_protections/priority",
63 "/repo/{channel_id}/{repo_id}/branch_protections/priority",
6464 post(super::branch_protection::priority::handler),
6565 )
6666 .route(
67 "/repo/:channel_id/:repo_id/branch_protections/:policy_id",
67 "/repo/{channel_id}/{repo_id}/branch_protections/{policy_id}",
6868 get(super::branch_protection::get::handler)
6969 .patch(super::branch_protection::edit::handler)
7070 .delete(super::branch_protection::delete::handler),
7171 )
7272 .route(
73 "/repo/:channel_id/:repo_id/tags",
73 "/repo/{channel_id}/{repo_id}/tags",
7474 get(super::tag::list::handler).post(super::tag::create::handler),
7575 )
7676 .route(
77 "/repo/:channel_id/:repo_id/tags/:name",
77 "/repo/{channel_id}/{repo_id}/tags/{name}",
7878 get(super::tag::get::handler).delete(super::tag::delete::handler),
7979 )
8080 .route(
81 "/repo/:channel_id/:repo_id/tag_protections",
81 "/repo/{channel_id}/{repo_id}/tag_protections",
8282 get(super::tag_protection::list::handler).post(super::tag_protection::create::handler),
8383 )
8484 .route(
85 "/repo/:channel_id/:repo_id/tag_protections/:policy_id",
85 "/repo/{channel_id}/{repo_id}/tag_protections/{policy_id}",
8686 get(super::tag_protection::get::handler)
8787 .patch(super::tag_protection::edit::handler)
8888 .delete(super::tag_protection::delete::handler),
8989 )
9090 .route(
91 "/repo/:channel_id/:repo_id/releases",
91 "/repo/{channel_id}/{repo_id}/releases",
9292 get(super::release::list::handler).post(super::release::create::handler),
9393 )
9494 .route(
95 "/repo/:channel_id/:repo_id/releases/latest",
95 "/repo/{channel_id}/{repo_id}/releases/latest",
9696 get(super::release::latest::handler),
9797 )
9898 .route(
99 "/repo/:channel_id/:repo_id/releases/tags/:tag",
99 "/repo/{channel_id}/{repo_id}/releases/tags/{tag}",
100100 get(super::release::by_tag::handler).delete(super::release::delete_by_tag::handler),
101101 )
102102 .route(
103 "/repo/:channel_id/:repo_id/releases/:release_id",
103 "/repo/{channel_id}/{repo_id}/releases/{release_id}",
104104 get(super::release::get::handler)
105105 .patch(super::release::edit::handler)
106106 .delete(super::release::delete::handler),
107107 )
108108 .route(
109 "/repo/:channel_id/:repo_id/collaborators",
109 "/repo/{channel_id}/{repo_id}/collaborators",
110110 get(super::collab::list::handler),
111111 )
112112 .route(
113 "/repo/:channel_id/:repo_id/collaborators/:user_id",
113 "/repo/{channel_id}/{repo_id}/collaborators/{user_id}",
114114 get(super::collab::is::handler)
115115 .put(super::collab::add::handler)
116116 .delete(super::collab::delete::handler),
117117 )
118118 .route(
119 "/repo/:channel_id/:repo_id/collaborators/:user_id/permission",
119 "/repo/{channel_id}/{repo_id}/collaborators/{user_id}/permission",
120120 get(super::collab::permission::handler),
121121 )
122122 .route(
123 "/repo/:channel_id/:repo_id/keys",
123 "/repo/{channel_id}/{repo_id}/keys",
124124 get(super::deploy_key::list::handler).post(super::deploy_key::create::handler),
125125 )
126126 .route(
127 "/repo/:channel_id/:repo_id/keys/:key_id",
127 "/repo/{channel_id}/{repo_id}/keys/{key_id}",
128128 get(super::deploy_key::get::handler).delete(super::deploy_key::delete::handler),
129129 )
130130 .route(
131 "/repo/:channel_id/:repo_id/topics",
131 "/repo/{channel_id}/{repo_id}/topics",
132132 get(super::topic::list::handler).put(super::topic::update::handler),
133133 )
134134 .route(
135 "/repo/:channel_id/:repo_id/topics/:topic",
135 "/repo/{channel_id}/{repo_id}/topics/{topic}",
136136 put(super::topic::add::handler).delete(super::topic::delete::handler),
137137 )
138138 .route("/topics/search", get(super::topic::search::handler))
139139 .route(
140 "/repo/:channel_id/:repo_id/statuses/:sha",
140 "/repo/{channel_id}/{repo_id}/statuses/{sha}",
141141 get(super::commit_status::list::handler).post(super::commit_status::create::handler),
142142 )
143143 .route(
144 "/repo/:channel_id/:repo_id/commits/:ref/statuses",
144 "/repo/{channel_id}/{repo_id}/commits/{ref}/statuses",
145145 get(super::commit_status::list_by_ref::handler),
146146 )
147147 .route(
148 "/repo/:channel_id/:repo_id/commits/:ref/status",
148 "/repo/{channel_id}/{repo_id}/commits/{ref}/status",
149149 get(super::commit_status::combined::handler),
150150 )
151151 .route(
152 "/repo/:channel_id/:repo_id/subscribers",
152 "/repo/{channel_id}/{repo_id}/subscribers",
153153 get(super::subscriber::list::handler),
154154 )
155155 .route(
156 "/repo/:channel_id/:repo_id/contents",
156 "/repo/{channel_id}/{repo_id}/contents",
157157 get(super::contents::get_list::handler),
158158 )
159159 .route(
160 "/repo/:channel_id/:repo_id/contents/change",
160 "/repo/{channel_id}/{repo_id}/contents/change",
161161 post(super::contents::change_files::handler),
162162 )
163163 .route(
164 "/repo/:channel_id/:repo_id/diffpatch",
164 "/repo/{channel_id}/{repo_id}/diffpatch",
165165 post(super::contents::diff_patch::handler),
166166 )
167167 .route(
168 "/repo/:channel_id/:repo_id/contents/*path",
168 "/repo/{channel_id}/{repo_id}/contents/{*path}",
169169 get(super::contents::get::handler)
170170 .post(super::contents::create::handler)
171171 .put(super::contents::update::handler)
172172 .delete(super::contents::delete::handler),
173173 )
174174 .route(
175 "/repo/:channel_id/:repo_id/archive/:archive_format/:ref_name",
175 "/repo/{channel_id}/{repo_id}/archive/{archive_format}/{ref_name}",
176176 get(super::archive::get::handler),
177177 )
178178 .route(
179 "/repo/:channel_id/:repo_id/compare/*spec",
179 "/repo/{channel_id}/{repo_id}/compare/{*spec}",
180180 get(super::compare::compare::handler),
181181 )
182182 .route(
183 "/repo/:channel_id/:repo_id/git/refs",
183 "/repo/{channel_id}/{repo_id}/git/refs",
184184 get(super::git_ref::refs::handler),
185185 )
186186 .route(
187 "/repo/:channel_id/:repo_id/git/refs/*filter",
187 "/repo/{channel_id}/{repo_id}/git/refs/{*filter}",
188188 get(super::git_ref::refs_filter::handler),
189189 )
190190 .route(
191 "/repo/:channel_id/:repo_id/git/commits/*sha",
191 "/repo/{channel_id}/{repo_id}/git/commits/{*sha}",
192192 get(super::git_ref::commit::handler),
193193 )
194194 .route(
195 "/repo/:channel_id/:repo_id/git/tags/*sha",
195 "/repo/{channel_id}/{repo_id}/git/tags/{*sha}",
196196 get(super::git_ref::annotated_tag::handler),
197197 )
198198 .route(
199 "/repo/:channel_id/:repo_id/git/trees/*sha",
199 "/repo/{channel_id}/{repo_id}/git/trees/{*sha}",
200200 get(super::git_ref::tree::handler),
201201 )
202202 .route(
203 "/repo/:channel_id/:repo_id/git/blobs/*sha",
203 "/repo/{channel_id}/{repo_id}/git/blobs/{*sha}",
204204 get(super::git_ref::blob::handler),
205205 )
206206 .route(
207 "/repo/:channel_id/:repo_id/git/notes/*sha",
207 "/repo/{channel_id}/{repo_id}/git/notes/{*sha}",
208208 get(super::git_ref::notes::handler),
209209 )
210210 .route(
211 "/repo/:channel_id/:repo_id/sync",
211 "/repo/{channel_id}/{repo_id}/sync",
212212 get(super::sync::get::handler),
213213 )
214214 .route(
215 "/repo/:channel_id/:repo_id/sync/run",
215 "/repo/{channel_id}/{repo_id}/sync/run",
216216 post(super::sync::run::handler),
217217 )
218218 .route("/repos/search", get(super::extras::search::handler))
219 .route("/repositories/:id", get(super::extras::repo_by_id::handler))
219 .route("/repositories/{id}", get(super::extras::repo_by_id::handler))
220220 .route(
221 "/repo/:channel_id/:repo_id/avatar",
221 "/repo/{channel_id}/{repo_id}/avatar",
222222 post(super::extras::avatar::post_handler).delete(super::extras::avatar::delete_handler),
223223 )
224224 .route(
225 "/repo/:channel_id/:repo_id/issue_templates",
225 "/repo/{channel_id}/{repo_id}/issue_templates",
226226 get(super::extras::issue_template::handler),
227227 )
228228 .route(
229 "/repo/:channel_id/:repo_id/issue_config",
229 "/repo/{channel_id}/{repo_id}/issue_config",
230230 get(super::extras::repo_extra::get_handler),
231231 )
232232 .route(
233 "/repo/:channel_id/:repo_id/issue_config/validate",
233 "/repo/{channel_id}/{repo_id}/issue_config/validate",
234234 get(super::extras::repo_extra::validate_handler),
235235 )
236236 .route(
237 "/repo/:channel_id/:repo_id/languages",
237 "/repo/{channel_id}/{repo_id}/languages",
238238 get(super::extras::language::handler),
239239 )
240240 .route(
241 "/repo/:channel_id/:repo_id/licenses",
241 "/repo/{channel_id}/{repo_id}/licenses",
242242 get(super::extras::license::handler),
243243 )
244244 .route(
245 "/repo/:channel_id/:repo_id/stargazers",
245 "/repo/{channel_id}/{repo_id}/stargazers",
246246 get(super::extras::stargazer::handler),
247247 )
248248 .route(
249 "/repo/:channel_id/:repo_id/assignees/:assignee",
249 "/repo/{channel_id}/{repo_id}/assignees/{assignee}",
250250 get(super::extras::assigns::check_handler),
251251 )
252252 .route(
253 "/repo/:channel_id/:repo_id/reviewers",
253 "/repo/{channel_id}/{repo_id}/reviewers",
254254 get(super::extras::reviews::handler),
255255 )
256256 .route(
257 "/repo/:channel_id/:repo_id/new_pin_allowed",
257 "/repo/{channel_id}/{repo_id}/new_pin_allowed",
258258 get(super::extras::pin::handler),
259259 )
260260 .route(
261 "/repo/:channel_id/:repo_id/file-contents",
261 "/repo/{channel_id}/{repo_id}/file-contents",
262262 get(super::extras::file_contents::get_handler)
263263 .post(super::extras::file_contents::post_handler),
264264 )
265265 .route(
266 "/repo/:channel_id/:repo_id/contents-ext",
266 "/repo/{channel_id}/{repo_id}/contents-ext",
267267 get(super::extras::contents_ext::list_handler),
268268 )
269269 .route(
270 "/repo/:channel_id/:repo_id/contents-ext/*path",
270 "/repo/{channel_id}/{repo_id}/contents-ext/{*path}",
271271 get(super::extras::contents_ext::get_handler),
272272 )
273273 .route(
274 "/repo/:channel_id/:repo_id/raw/*filepath",
274 "/repo/{channel_id}/{repo_id}/raw/{*filepath}",
275275 get(super::extras::raw::handler),
276276 )
277277 .route(
278 "/repo/:channel_id/:repo_id/media/*filepath",
278 "/repo/{channel_id}/{repo_id}/media/{*filepath}",
279279 get(super::extras::media::handler),
280280 )
281281 .route(
282 "/repo/:channel_id/:repo_id/editorconfig/*filename",
282 "/repo/{channel_id}/{repo_id}/editorconfig/{*filename}",
283283 get(super::extras::editorconfig::handler),
284284 )
285285 .route(
286 "/repo/:channel_id/:repo_id/commits",
286 "/repo/{channel_id}/{repo_id}/commits",
287287 get(super::extras::commits::list_handler),
288288 )
289289 .route(
290 "/repo/:channel_id/:repo_id/git/commits/*sha",
291 get(super::extras::commits::get_handler),
292 )
293 .route(
294 "/repo/:channel_id/:repo_id/git/commits/*sha_diff",
290 "/repo/{channel_id}/{repo_id}/git/commits/diff/{*sha_diff}",
295291 get(super::extras::commits::diff_handler),
296292 )
297293 .route(
298 "/repo/:channel_id/:repo_id/commits/:ref/statuses",
299 get(super::extras::commit_status_ref::list_by_ref_handler),
300 )
301 .route(
302 "/repo/:channel_id/:repo_id/commits/:ref/status",
303 get(super::extras::commit_status_ref::combined_handler),
304 )
305 .route(
306 "/repo/:channel_id/:repo_id/forks",
294 "/repo/{channel_id}/{repo_id}/forks",
307295 get(super::extras::fork::list_handler),
308296 )
309297 .route(
310 "/repo/:channel_id/:repo_id/subscription",
298 "/repo/{channel_id}/{repo_id}/subscription",
311299 get(super::extras::subscription::get_handler)
312300 .put(super::extras::subscription::put_handler)
313301 .delete(super::extras::subscription::delete_handler),
314302 )
315303 .route(
316 "/repo/:channel_id/:repo_id/signing-key.gpg",
304 "/repo/{channel_id}/{repo_id}/signing-key.gpg",
317305 get(super::extras::signing_key::gpg_handler),
318306 )
319307 .route(
320 "/repo/:channel_id/:repo_id/signing-key.pub",
308 "/repo/{channel_id}/{repo_id}/signing-key.pub",
321309 get(super::extras::signing_key::ssh_handler),
322310 )
323311 .route(
324 "/repo/:channel_id/:repo_id/releases/:release_id/assets",
312 "/repo/{channel_id}/{repo_id}/releases/{release_id}/assets",
325313 get(super::extras::release_attachment::list_handler),
326314 )
327315 .route(
328 "/repo/:channel_id/:repo_id/releases/:release_id/assets/:attachment_id",
316 "/repo/{channel_id}/{repo_id}/releases/{release_id}/assets/{attachment_id}",
329317 get(super::extras::release_attachment::get_handler),
330318 )
331319 .layer(from_fn_with_state(
Modified lib/repo/cache.rs lib/repo/cache.rs +15 −13 View lib/repo/cache.rs
@@ -79,39 +79,41 @@
7979pub trait ObjectCache {
8080 type Value;
8181
82 async fn fetch<F, Fut>(
82 fn fetch<F, Fut>(
8383 &self,
8484 repo_id: Uuid,
8585 kind: &str,
8686 key: &str,
8787 ttl: Duration,
8888 loader: F,
89 ) -> RepoResult<Self::Value>
89 ) -> impl std::future::Future<Output = RepoResult<Self::Value>> + Send
9090 where
91 F: FnOnce() -> Fut,
92 Fut: std::future::Future<Output = RepoResult<Self::Value>>;
91 F: FnOnce() -> Fut + Send,
92 Fut: std::future::Future<Output = RepoResult<Self::Value>> + Send;
9393}
9494
9595impl ObjectCache for RepoCache {
9696 type Value = String;
9797
98 async fn fetch<F, Fut>(
98 fn fetch<F, Fut>(
9999 &self,
100100 repo_id: Uuid,
101101 kind: &str,
102102 key: &str,
103103 ttl: Duration,
104104 loader: F,
105 ) -> RepoResult<Self::Value>
105 ) -> impl std::future::Future<Output = RepoResult<Self::Value>> + Send
106106 where
107 F: FnOnce() -> Fut,
108 Fut: std::future::Future<Output = RepoResult<Self::Value>>,
107 F: FnOnce() -> Fut + Send,
108 Fut: std::future::Future<Output = RepoResult<Self::Value>> + Send,
109109 {
110 if let Some(v) = self.get_string(repo_id, kind, key).await? {
111 return Ok(v);
110 async move {
111 if let Some(v) = self.get_string(repo_id, kind, key).await? {
112 return Ok(v);
113 }
114 let fresh = loader().await?;
115 self.set_string(repo_id, kind, key, &fresh, ttl).await?;
116 Ok(fresh)
112117 }
113 let fresh = loader().await?;
114 self.set_string(repo_id, kind, key, &fresh, ttl).await?;
115 Ok(fresh)
116118 }
117119}
Modified lib/space/handler/routes.rs lib/space/handler/routes.rs +19 −19 View lib/space/handler/routes.rs
@@ -8,8 +8,8 @@
88
99pub fn router(svc: SpaceService) -> Router {
1010 let public = Router::new()
11 .route("/spaces/:sid", get(super::spaces::get::handler))
12 .route("/spaces/:sid/roles/:rid", get(super::roles::get::handler))
11 .route("/spaces/{sid}", get(super::spaces::get::handler))
12 .route("/spaces/{sid}/roles/{rid}", get(super::roles::get::handler))
1313 .layer(from_fn_with_state(
1414 svc.clone(),
1515 inject_jwt_ctx::<SpaceService>,
@@ -19,41 +19,41 @@
1919 .route("/spaces", post(super::spaces::create::handler))
2020 .route("/spaces", get(super::spaces::list::handler))
2121 .route(
22 "/spaces/:sid",
22 "/spaces/{sid}",
2323 patch(super::spaces::update::handler).delete(super::spaces::delete::handler),
2424 )
2525 .route(
26 "/spaces/:sid/members",
26 "/spaces/{sid}/members",
2727 post(super::members::add::handler).get(super::members::list::handler),
2828 )
2929 .route(
30 "/spaces/:sid/members/:uid",
30 "/spaces/{sid}/members/{uid}",
3131 get(super::members::get::handler)
3232 .patch(super::members::update::handler)
3333 .delete(super::members::remove::handler),
3434 )
3535 .route(
36 "/spaces/:sid/roles",
36 "/spaces/{sid}/roles",
3737 post(super::roles::create::handler).get(super::roles::list::handler),
3838 )
3939 .route(
40 "/spaces/:sid/roles/:rid",
40 "/spaces/{sid}/roles/{rid}",
4141 patch(super::roles::update::handler).delete(super::roles::delete::handler),
4242 )
4343 .route(
44 "/spaces/:sid/members/:uid/roles",
44 "/spaces/{sid}/members/{uid}/roles",
4545 post(super::roles::assign::handler),
4646 )
4747 .route(
48 "/spaces/:sid/members/:uid/roles/:rid",
48 "/spaces/{sid}/members/{uid}/roles/{rid}",
4949 delete(super::roles::unassign::handler),
5050 )
5151 .route(
52 "/spaces/:sid/invites",
52 "/spaces/{sid}/invites",
5353 post(super::invites::create::handler).get(super::invites::list::handler),
5454 )
5555 .route(
56 "/spaces/:sid/invites/:iid",
56 "/spaces/{sid}/invites/{iid}",
5757 delete(super::invites::revoke::handler),
5858 )
5959 .route(
@@ -61,34 +61,34 @@
6161 post(super::invites::accept::handler),
6262 )
6363 .route(
64 "/spaces/:sid/bans",
64 "/spaces/{sid}/bans",
6565 post(super::bans::ban::handler).get(super::bans::list::handler),
6666 )
6767 .route(
68 "/spaces/:sid/bans/:uid",
68 "/spaces/{sid}/bans/{uid}",
6969 get(super::bans::get::handler)
7070 .patch(super::bans::update::handler)
7171 .delete(super::bans::unban::handler),
7272 )
73 .route("/spaces/:sid/channels", get(super::channels::list::handler))
73 .route("/spaces/{sid}/channels", get(super::channels::list::handler))
7474 .route(
75 "/spaces/:sid/channels/:cid",
75 "/spaces/{sid}/channels/{cid}",
7676 get(super::channels::get::handler),
7777 )
7878 .route(
79 "/spaces/:sid/channels/:cid/overwrites/roles",
79 "/spaces/{sid}/channels/{cid}/overwrites/roles",
8080 post(super::overwrites::set_role::handler).get(super::overwrites::list_role::handler),
8181 )
8282 .route(
83 "/spaces/:sid/channels/:cid/overwrites/roles/:rid",
83 "/spaces/{sid}/channels/{cid}/overwrites/roles/{rid}",
8484 delete(super::overwrites::remove_role::handler),
8585 )
8686 .route(
87 "/spaces/:sid/channels/:cid/overwrites/users",
87 "/spaces/{sid}/channels/{cid}/overwrites/users",
8888 post(super::overwrites::set_user::handler).get(super::overwrites::list_user::handler),
8989 )
9090 .route(
91 "/spaces/:sid/channels/:cid/overwrites/users/:uid",
91 "/spaces/{sid}/channels/{cid}/overwrites/users/{uid}",
9292 delete(super::overwrites::remove_user::handler),
9393 )
9494 .layer(from_fn_with_state(
Modified lib/user/handler/routes.rs lib/user/handler/routes.rs +21 −21 View lib/user/handler/routes.rs
@@ -7,19 +7,19 @@
77use rate_limit::ratelimit;
88
99pub fn router(svc: UserService) -> Router {
10 let public = Router::new().route("/users/:uid", get(super::profile::public_view::handler));
10 let public = Router::new().route("/users/{uid}", get(super::profile::public_view::handler));
1111
1212 let user_social = Router::new()
1313 .route(
14 "/users/:uid/follow",
14 "/users/{uid}/follow",
1515 post(super::social::follow::handler).delete(super::social::unfollow::handler),
1616 )
1717 .route(
18 "/users/:uid/followers",
18 "/users/{uid}/followers",
1919 get(super::social::list_followers::handler),
2020 )
2121 .route(
22 "/users/:uid/following",
22 "/users/{uid}/following",
2323 get(super::social::list_following::handler),
2424 );
2525
@@ -44,12 +44,12 @@
4444 get(super::profile::memes::list_handler).post(super::profile::memes::create_handler),
4545 )
4646 .route(
47 "/me/memes/:id",
47 "/me/memes/{id}",
4848 delete(super::profile::memes::delete_handler),
4949 )
5050 .route("/me/devices", get(super::devices::list_devices::handler))
5151 .route(
52 "/me/devices/:id",
52 "/me/devices/{id}",
5353 patch(super::devices::update_device::handler)
5454 .delete(super::devices::delete_device::handler),
5555 )
@@ -59,7 +59,7 @@
5959 .delete(super::sessions::revoke_sessions::handler),
6060 )
6161 .route(
62 "/me/sessions/:id",
62 "/me/sessions/{id}",
6363 delete(super::sessions::revoke_session::handler),
6464 )
6565 .route(
@@ -67,11 +67,11 @@
6767 get(super::emails::list_emails::handler).post(super::emails::add_email::handler),
6868 )
6969 .route(
70 "/me/emails/:email_id/primary",
70 "/me/emails/{email_id}/primary",
7171 patch(super::emails::set_primary::handler),
7272 )
7373 .route(
74 "/me/emails/:email_id",
74 "/me/emails/{email_id}",
7575 delete(super::emails::delete_email::handler),
7676 )
7777 .route(
@@ -83,12 +83,12 @@
8383 post(super::emails::confirm_change::handler),
8484 )
8585 .route(
86 "/me/email-change/:ticket_id",
86 "/me/email-change/{ticket_id}",
8787 delete(super::emails::cancel_change::handler),
8888 )
8989 .route("/me/blocks", get(super::social::list_blocks::handler))
9090 .route(
91 "/me/blocks/:uid",
91 "/me/blocks/{uid}",
9292 post(super::social::block::handler).delete(super::social::unblock::handler),
9393 )
9494 .route(
@@ -117,7 +117,7 @@
117117 .post(super::security::access_keys::create_key::handler),
118118 )
119119 .route(
120 "/me/access-keys/:id",
120 "/me/access-keys/{id}",
121121 delete(super::security::access_keys::delete_key::handler),
122122 )
123123 .route(
@@ -126,7 +126,7 @@
126126 .post(super::security::ssh_keys::add_key::handler),
127127 )
128128 .route(
129 "/me/ssh-keys/:id",
129 "/me/ssh-keys/{id}",
130130 delete(super::security::ssh_keys::delete_key::handler),
131131 )
132132 .route(
@@ -135,7 +135,7 @@
135135 .post(super::security::push_subscriptions::upsert::handler),
136136 )
137137 .route(
138 "/me/push-subscriptions/:id",
138 "/me/push-subscriptions/{id}",
139139 delete(super::security::push_subscriptions::delete::handler),
140140 )
141141 .route(
@@ -165,7 +165,7 @@
165165 .post(super::notifications::saved_messages::save::handler),
166166 )
167167 .route(
168 "/me/messages/saved/:message_id",
168 "/me/messages/saved/{message_id}",
169169 delete(super::notifications::saved_messages::unsave::handler),
170170 )
171171 .route(
@@ -173,7 +173,7 @@
173173 get(super::notifications::scheduled_messages::list::handler),
174174 )
175175 .route(
176 "/me/messages/scheduled/:id",
176 "/me/messages/scheduled/{id}",
177177 delete(super::notifications::scheduled_messages::cancel::handler),
178178 )
179179 .layer(from_fn_with_state(
@@ -183,11 +183,11 @@
183183
184184 let admin_protected = Router::new()
185185 .route(
186 "/admin/users/:uid/profile",
186 "/admin/users/{uid}/profile",
187187 patch(super::profile::update_admin::handler),
188188 )
189189 .route(
190 "/admin/users/:uid/suspensions",
190 "/admin/users/{uid}/suspensions",
191191 get(super::suspensions::list_user::handler).post(super::suspensions::create::handler),
192192 )
193193 .route(
@@ -195,7 +195,7 @@
195195 get(super::suspensions::list_all::handler),
196196 )
197197 .route(
198 "/admin/suspensions/:id",
198 "/admin/suspensions/{id}",
199199 delete(super::suspensions::revoke::handler),
200200 )
201201 .route(
@@ -203,7 +203,7 @@
203203 get(super::deletion::list_pending::handler),
204204 )
205205 .route(
206 "/admin/deletions/:id/complete",
206 "/admin/deletions/{id}/complete",
207207 post(super::deletion::complete::handler),
208208 )
209209 .layer(from_fn_with_state(
@@ -213,7 +213,7 @@
213213
214214 let authenticated = Router::new()
215215 .route(
216 "/users/:uid/profile-detail",
216 "/users/{uid}/profile-detail",
217217 get(super::profile::profile_view::handler),
218218 )
219219 .layer(from_fn_with_state(
Added wiki/refactor-channel-to-space.md wiki/refactor-channel-to-space.md +562 −0 View wiki/refactor-channel-to-space.md
@@ -0,0 +1,562 @@
1# 重构路线图:channel → space_name(最终版)
2
3> 本文档汇总所有架构决策,作为实施阶段的依据。**所有数值已与当前代码对齐核查**。
4>
5> **目标读者**:本路线图由 agent **按轮次执行**。每个阶段对应一个 agent 轮次,agent 读取对应章节作为任务清单,完成后核对"验收"清单作为完成标志。
6>
7> **轮次定义**:阶段 0-5 共 **6 轮**(推荐路径),阶段 6 是收尾轮。阶段 7-8 是可选远期轮次。
8
9---
10
11## 0. 核心原则
12
131. **channel 退化为内部位置映射层**,**不对外暴露**(URL/响应中不出现 channel_id)。
142. **channel 仍是空间内的物理位置容器**——业务资源通过 `channel_id` 挂在 channel 树的具体节点上。
153. **业务资源**(project / repo / issue / post / meet)**双归属**:`space_id`(对外)+ `channel_id`(内部位置)。
164. **URL 中使用 `space_name`**(小写,符合 `[a-z0-9-]+` 字符约束),不是 `space_id`。
175. **重命名后旧 URL 仍可用**:`space_name_history` 表做回退查询。
186. **二级子资源靠父资源聚合**,不独立挂 space。
197. **handler 入口做 active 成员校验**(细粒度权限由各模块原有 `authorize_*` 继续负责)。
208. **OpenAPI 反射与现状对齐**:补齐缺失的 project / pull_request / mcp。
219. **旧 URL 直接 404**,不保留过渡期。
2210. **不删除 `channel_id` 列**——它是资源在 space 内的物理位置,删除后资源变成"悬空"(没有归属节点)。
23
24---
25
26## 1. 业务层级模型(重构后)
27
28```text
29space (1) ── (n) channel ← space 内的层级容器(Directory/Object 树形结构)
30 │ channel_id 是资源在 space 内的**物理位置**
31 ├─ (n) project ← 双归属: space_id + channel_id
32 ├─ (n) repo ← 双归属: space_id + channel_id
33 │ ├─ pull_request / pr_comment / pr_review / pr_event_line ⚠️ 待阶段 0 补 HTTP
34 │ └─ branch / tag / commit / tree / blob / notes
35 ├─ (n) issue ← issues 模块聚合(issue 挂在 collection,collection 双归属)
36 │ ├─ issue_watch / issue_reaction / issue_label / issue_member
37 │ ├─ issue_pin / issue_attachment / issue_event
38 │ ├─ issue_dependency / issue_repo_rel / issue_stopwatch
39 │ ├─ issue_tracked_time / issue_content_history
40 │ └─ comment
41 ├─ (n) post ← DB schema 已有,业务层尚未实现
42 ├─ (n) meet ← DB schema 已有,业务层尚未实现
43 └─ (n) chat ← DB schema 已有;HTTP 层通过 chat/glayer WebSocket
44```
45
46> **channel 不是"位置映射的轻量引用",而是"空间内可命名的物理容器"**。
47> 与 Slack/Discord 类似:每个 space 有自己的 channel 树,repo / issue / meet 必须挂在某个 channel 节点上。
48>
49> **设计要点**:
50> 1. 每个一级模块(project/repo/issue/post/meet)下挂自己的子资源,子资源的归属由**父资源**决定——不需要为每个子资源独立加 `space_id` 列。
51> 2. **不删除 `channel_id` 列**——它是业务资源在 space 内的具体物理位置,没有它资源无法归类、无法在 channel 树中显示。
52> 3. URL 用 `space_name` + 业务 id;`channel_id` 仅作为内部 ID 用于业务 join 和权限 overwrites。
53
54---
55
56## 2. 数据模型改造
57
58### 2.1 当前 openapi.json 状态(实测基线)
59
60`/tmp/openapi_v2.json` 实测:**169 个 path**。
61
62| 模块 | 路由数 | 当前 path 数 | 备注 |
63|------|------|------|------|
64| auth | 16 | 16 | OK |
65| health | 2 | 2 | OK |
66| issues | 53 | 31 | 缺 22 个(`channels_id` 暴露在 path 中) |
67| repo | 71 | 48 | 缺 23 个 |
68| **spaces** | 35 | **19** | OK(grep "space" 失误误判为 0) |
69| topics | 1 | 1 | OK |
70| user | 50 | 50 | OK |
71| **project** | 30+ | **0** | `ProjectApiDoc::paths()` 空 |
72| **pull_request** | 14(业务层) | **0** | **HTTP 层完全缺失** |
73| **mcp** | (WebSocket) | **0** | 无 openapi.rs(chat 通过 WebSocket,不在 REST) |
74
75### 2.2 schema 影响表(已核查)
76
77#### 一级表(直接挂 space,改造目标)
78
79| 表 | 当前宿主 | 期望宿主 | 备注 |
80|------|------|------|------|
81| `repos` | `channel_id: Uuid` | `space_id: Uuid` | 强引用 channel |
82| `issues`(collection 表) | `channel_id: Uuid` | `space_id: Uuid` | 强引用 |
83| `posts` | `channel_id: Uuid` | `space_id: Uuid` | discussion(业务层尚未实现) |
84| `chat` | `channel_id: Uuid` | `space_id: Uuid` | 平级(业务层通过 chatlayer) |
85| `meets` | `channel_id: Uuid` + `room_name` | `space_id: Uuid` | 保留 `room_name` 作 LiveKit |
86
87#### 已合规(不动)
88
89| 表 | 当前 | 备注 |
90|------|------|------|
91| `project` | `space_id: Uuid` + `channel_id: Option<Uuid>` | **已合规** |
92| `pull_request` | `repo_id: Uuid` + `issue_id: Uuid` | 挂在 repo 下 |
93| `space_warn` | `space_id: Uuid` + `channel_id: Option<Uuid>` | **已合规(双键)** |
94
95#### 关联表(多对多连接表,`channel_id` 是冗余字段,不重构)
96
97| 表 | 备注 |
98|------|------|
99| `issue_label` | issue ↔ label 多对多 |
100| `post_labels` | post ↔ label 多对多 |
101
102#### 用户级作用域(特殊,不归 space)
103
104| 表 | 备注 |
105|------|------|
106| `user_saved_messages` | 用户收藏消息,`channel_id` 是历史遗留 |
107| `user_recent_mentions` | 用户被@提及历史 |
108| `user_scheduled_messages` | 定时消息 |
109
110> **这些用户级表的 `channel_id` 字段是"上下文引用"而非"宿主字段"**——重构时**不动**,只在跨 tenant 时可能需要重新审视(留待后续 PR)。
111
112#### 二级表(靠父资源聚合,不动)
113
114| 表 | 备注 |
115|------|------|
116| `pull_request_comment` / `pull_request_review` / `pull_request_event_line` | 父 = PR |
117| `issue_watch` / `issue_reaction` / `issue_member` / `issue_pin` / `issue_attachment` / `issue_event` / `issue_dependency` / `issue_repo_rel` / `issue_stopwatch` / `issue_tracked_time` / `issue_content_history` / `comment` | 父 = issue |
118| chat 子资源(`chat_messages` / `chat_message_edits` / `chat_pinned_messages`) | 父 = chat |
119
120#### 消息上下文(特殊,`channel_id` 是引用)
121
122| 表 | 备注 |
123|------|------|
124| `chat_message_mentions` | `@mention` 上下文,`channel_id: Option<Uuid>` 指向消息所在频道 |
125
126#### channel 内部(保留,不改)
127
128| 表 | 备注 |
129|------|------|
130| `channels` | 频道树根 |
131| `channel_overwrite_users` | channel 权限 |
132| `channel_overwrite_role` | channel 权限 |
133
134### 2.3 双归属模型(space_id + channel_id)
135
136**核心设计**:业务资源**同时**有 `space_id` 和 `channel_id`,二者**不是冗余**而是**不同维度**:
137
138| 字段 | 作用 | 对外可见 |
139|------|------|---------|
140| `space_id` | 资源属于哪个 space(顶层租户/组织) | URL 用 `space_name` |
141| `channel_id` | 资源在 space 内的具体位置(channel 树节点) | **不外露**(内部 ID) |
142
143**为什么不删除 channel_id**:
144
145> channel 是 space 内的**层级容器**(Directory/Object 树,类似 Slack/Discord 频道)。业务资源(repo / issue / post / meet)必须挂在某个具体 channel 节点上,才能:
146> - 在 channel 树中**显示**
147> - 接收 channel-level **overwrites**(权限)
148> - 拥有物理**路径**(被 group / 分类)
149>
150> **删了 channel_id = 资源变成"悬空"**:没有归属节点,无法分组、无法显示、无法应用 channel-level 权限。
151
152#### 一级表(双归属,最终目标 schema)
153
154| 表 | space_id | channel_id | 备注 |
155|------|----------|-----------|------|
156| `repos` | `Uuid`(新加) | `Uuid`(保留) | repo 在 space 内挂在某个 channel |
157| `issues`(collection 表) | `Uuid`(新加) | `Uuid`(保留) | issue collection 挂在 channel |
158| `posts` | `Uuid`(新加) | `Uuid`(保留) | discussion 挂在 channel |
159| `chat` | `Uuid`(新加) | `Uuid`(保留) | chat 会话挂在 channel |
160| `meets` | `Uuid`(新加) | `Uuid` + `room_name`(保留) | 视频会议挂在 channel |
161
162#### 已合规(双归属)
163
164| 表 | space_id | channel_id | 备注 |
165|------|----------|-----------|------|
166| `project` | `Uuid` ✅ | `Option<Uuid>` ✅ | 已合规 |
167| `space_warn` | `Uuid` ✅ | `Option<Uuid>` ✅ | 已合规 |
168
169#### 二级表(保持现状,靠父资源传递)
170
171| 表 | 宿主字段 | 备注 |
172|------|-----------|------|
173| `pull_request_*` | `pull_request_id` → `pull_requests.repo_id` | 父 = repo |
174| `issue_*`(子资源) | `issue_id` → `issues.id` | 父 = issue |
175| `post_*`(子资源) | `post_id` → `posts.id` | 父 = post |
176
177> 二级表的 channel_id 通过**父资源传递**得到:`(space_id, channel_id) = parent.(space_id, channel_id)`
178
179### 2.4 新增 `space_name_history` 表
180
181```sql
182-- lib/db/schema_name_history.sql
183CREATE TABLE IF NOT EXISTS space_name_history (
184 id UUID PRIMARY KEY,
185 space_id UUID NOT NULL REFERENCES spaces(id) ON DELETE CASCADE,
186 lower_name TEXT NOT NULL UNIQUE,
187 created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
188);
189CREATE INDEX IF NOT EXISTS idx_space_name_history_space
190 ON space_name_history (space_id);
191```
192
193**字符约束**(`spaces.lower_name`):仅允许 `[a-z0-9-]+`(创建/重命名时校验)。
194
195**唯一性策略**:`spaces.lower_name` + `space_name_history.lower_name` 双重 unique → 同一时刻一个 `lower_name` 只能指一个 space(含历史)。**Trade-off**:用过即永久占用,除非显式释放。
196
197### 2.5 重命名流程
198
199```text
200rename_space(space_id, new_name):
201 0. 校验 new_lower 匹配 [a-z0-9-]+
202 1. 在事务中:
203 INSERT space_name_history (new_lower, space_id)
204 UPDATE spaces.lower_name = new_lower_name
205 2. 旧 lower_name 保留在 history 中(已用过的不删)
206```
207
208> **事务 + 校验是必须的**:防止并发 rename 造成历史记录不连续,也防止大小写不一致。
209
210### 2.6 回退查询
211
212```rust
213// lib/space/features/lookup.rs
214pub async fn lookup_space_by_name(svc, lower_name) -> SpaceResult<Uuid> {
215 // 1. 先查 spaces(命中当前 name)
216 if let Some(space) = spaces::find_by_lower_name(lower_name).await? {
217 return Ok(space.id);
218 }
219 // 2. 回退查 space_name_history(命中旧 name,仍能解析)
220 if let Some(hist) = space_name_history::find_by_lower_name(lower_name).await? {
221 return Ok(hist.space_id);
222 }
223 Err(SpaceError::NotFound(format!("space {lower_name}")))
224}
225```
226
227### 2.7 dvcs 服务对 channel_id 的依赖
228
229dvcs(gitsmart / gitssh / gitauth / gitsync)**仍在使用 `repo.channel_id`**:
230
231```text
232dvcs/gitsmart/service.rs : resolved.repo.channel_id.to_string() (git 存储路径)
233 resolved.repo.channel_id (LFS 存储路径)
234dvcs/gitsync/* : repo.channel_id (post-receive 同步)
235dvcs/gitssh/handler/* : 通过 repo.channel_id 解析 SSH git 操作
236dvcs/gitauth/resolve.rs : 解析 repo → user permissions 时用到
237```
238
239> **影响**:本次 channel → space 重构后,dvcs 服务**仍需通过 repo.channel_id 访问**——channel_id 作为内部 ID继续存在。
240> 但 `repo.channel_id` 在阶段 6 双键 migration 之前**仍是必需字段**,阶段 6 之后才能视情况删。
241> dvcs 改动面估算:~6 文件,需要与 channel 同步迁移或并行工作。
242
243---
244
245## 3. URL 改造总表
246
247| 模块 | 旧 | 新 |
248|------|------|------|
249| repo | `/repo/{channel_id}` | `/repos/{space_name}` |
250| repo | `/repo/{channel_id}/{repo_id}` | `/repos/{space_name}/{repo_id}` |
251| issues | `/issues/{channel_id}` | `/issues/{space_name}` |
252| issues | `/issues/{channel_id}/{issue_id}` | `/issues/{space_name}/{issue_id}` |
253| project | `/spaces/{space_id}/projects/{project_id}` | **`/projects/{space_name}/{project_id}`** |
254| space 顶层 | `/spaces/{sid}` | **`/spaces/{space_name}`** |
255| post | (暂无 HTTP) | `/posts/{space_name}` |
256| meet | (暂无 HTTP) | `/meets/{space_name}` |
257| chat | (WebSocket `/api/v1/chat/ws`) | 不变(不在 REST 范畴) |
258
259> **路径扁平化**:把原本 `/spaces/{space_id}/projects/...` 改为 `/projects/{space_name}/...`,更可读。
260
261### URL 子资源自动覆盖
262
263- **repo** 改完,PR / branch / tag / commit 全部自动正确(URL 形如 `/repos/{space_name}/{repo_id}/prs/...`,父 URL 改对即可)
264- **issues** 改完,issue_watch / issue_reaction / comment 全部自动正确
265- **post** 改完,post_label / post_mention / post_reaction / post_reply / post_watch 全部自动正确
266- **chat** 子资源通过 WebSocket,与 REST URL 无关
267
268**真正的一级模块改造点**:`repo` / `issues` / `project` / `space 顶层`。
269
270---
271
272## 4. handler 内部流程(统一模板)
273
274```rust
275// 改前
276async fn handler(
277 State(svc): State<RepoService>,
278 AuthUser { claims }: AuthUser,
279 Path((channel_id, repo_id)): Path<(Uuid, Uuid)>,
280) -> RepoResult<...> {
281 svc.get_repo(claims.sub, channel_id, repo_id).await
282}
283
284// 改后
285async fn handler(
286 State(svc): State<RepoService>,
287 AuthUser { claims }: AuthUser,
288 Path((space_name, repo_id)): Path<(String, Uuid)>,
289) -> RepoResult<...> {
290 // 1. space_name → space_id(含 history 回退)
291 let space_id = space::lookup::lookup_space_by_name(svc, &space_name).await?;
292
293 // 2. 校验 caller 是该 space 的 active 成员
294 space::authz::require_active_member(svc, claims.sub, space_id).await?;
295
296 // 3. 内部反查 channel_id(用于 overwrites / 业务 join,**不外露**)
297 let channel_id = svc.lookup_repo_channel(repo_id).await?;
298
299 // 4. 业务调用(内部 usecase 签名保持不变)
300 svc.get_repo(claims.sub, channel_id, repo_id).await
301}
302```
303
304### 暴露面边界
305
306| 层 | channel_id | space_id | space_name |
307|------|----------------|----------|-----------|
308| URL path | ❌ | ❌ | ✅ |
309| OpenAPI parameters | ❌ | ❌ | ✅ |
310| handler `Path<>` | ❌ | ❌ | ✅ |
311| 内部 usecase 函数签名 | ✅ | ⚠️ | ❌ |
312| DB schema(最终目标) | 仅一级表保留(migration 加 `space_id` 列) | ✅ | 通过 `spaces.lower_name` + `space_name_history` |
313| 错误响应(客户端可见) | ❌ | ❌ | ✅("space {name} not found") |
314| 导出 view JSON | ❌ | 可选 | 可选 |
315| 内部 trace/log attribute | ✅ | ✅ | ✅ |
316| dvcs 服务(SSH/git 协议) | ✅(内部 ID) | ⚠️ | ❌ |
317
318---
319
320## 5. 阶段划分
321
322> 阶段 0-8 顺序编号。**阶段 0** 是推荐起点(前置 PR HTTP 补齐),阶段 8 是远期前端迁移。**已删除"删 channel_id 列"阶段**——channel_id 必须长期保留。
323
324### 阶段 0:(前置)补齐 PR 模块 HTTP 层(3 天)
325
326> PR 业务层完整可用但**完全没有 HTTP 端点**——是**最大缺口**。建议**先于 channel 重构**完成。
327
328**0.1 RepoService impl 层**(0.5d)
329- `lib/repo/features/pull_request/impls.rs`(新建):把 14 个 usecase 函数包装为 `RepoService` 方法
330- `lib/repo/features/pull_request/mod.rs`:添加 `pub use impls::*` 导出
331
332**0.2 HTTP handler 层**(1d)—— 参考 `lib/repo/handler/branch/`:
333
334```
335lib/repo/handler/pull_request/
336├── list.rs GET /repos/{space_name}/{repo_id}/pulls
337├── get.rs GET /repos/{space_name}/{repo_id}/pulls/{number}
338├── create.rs POST /repos/{space_name}/{repo_id}/pulls
339├── update.rs PATCH /repos/{space_name}/{repo_id}/pulls/{number}
340├── close.rs POST /repos/{space_name}/{repo_id}/pulls/{number}/close
341├── reopen.rs POST .../{number}/reopen
342├── lock.rs POST .../{number}/lock
343├── unlock.rs POST .../{number}/unlock
344├── merge.rs POST .../{number}/merge
345├── comment/{list,create}.rs
346├── review/{list,submit}.rs
347└── event.rs GET .../{number}/events
348```
349
350> **路径设计原则**:URL 用 `{space_name}`(如果先于阶段 2-5 实施,则用 `{channel_id}` 占位,后续阶段 2-5 改造时统一替换)。
351
352**0.3 路由注册**(0.5d)
353- `lib/repo/handler/routes.rs`:合并 PR 路由块到 protected
354- 复用 `inject_jwt_ctx::<RepoService>` 与 `ratelimit::<RepoService>`
355
356**0.4 OpenAPI 反射**(0.5d)
357- `lib/repo/handler/openapi.rs::ApiDoc` 的 `paths(...)` 加入 14 个 handler
358- `components(schemas(...))` 加入 PR 相关的 8 个 schema
359
360**0.5 测试**(0.5d)
361- `lib/repo/tests/pull_request/`:每个端点一个集成测试
362
363**验收**:
364- `cargo test -p repo` 全绿
365- `jq '[.paths | keys[] | select(contains("/pulls/"))] | length' openapi.json` ≥ 14
366- `curl /repos/{space_name}/{repo_id}/pulls` 返回 401/403 而非 panic
367
368### 阶段 1:基础设施 + 新表 + OpenAPI 修复(3 天)
369
370**1.1 新表与 schema**(0.5d)
371- 新增 `space_name_history` 表到 `lib/db/schema_name_history.sql`
372- 在 `lib/db/schema.rs::sync_schema` 之前执行该 SQL(参考 `schema_extras.sql` 模式)
373- 加 `[a-z0-9-]+` 字符约束校验到 `rename_space`
374
375**1.2 space 重命名逻辑**(0.5d)
376- `lib/space/features/spaces/usecase.rs::rename_space`:事务中插入 history + 更新 spaces
377- 单元测试:rename 后旧 URL 仍能解析;并发 rename 安全性
378
379**1.3 反查与权限 helper**(1d)
380- `lib/space/features/lookup.rs::lookup_space_by_name(svc, lower_name) -> SpaceResult<Uuid>`
381- `lib/space/features/authz.rs::require_active_member(svc, caller, space_id) -> SpaceResult<()>`
382- 4 个业务反查 helper:
383 - `lib/repo/features/lookup.rs::channel_for_repo(svc, repo_id)`
384 - `lib/issues/features/lookup.rs::channel_for_issue(svc, issue_id)`
385 - `lib/post/features/lookup.rs::channel_for_post(svc, post_id)`
386 - `lib/chat/features/lookup.rs::channel_for_chat(svc, chat_id)`
387
388**1.4 OpenAPI 修复**(1d)
389- **1.4.1** 补 `lib/project/handler/openapi.rs` 的 `paths()`(30 个 handler)和 `components(schemas(...))`
390- **1.4.2** 排查 `lib/space/handler/openapi.rs` 装配——实测 `SpaceApiDoc` 已正常生效(19 paths 已存在),无需改动
391- **1.4.3** 决定 `lib/mcp/` OpenAPI 策略:chat 是 WebSocket,不在 REST,**不需要 OpenAPI**
392- **1.4.4** 加 CI grep 检查:`openapi.json` 中 `channel_id` 字符串应不增长
393
394**验收**:
395- DB 有 `space_name_history` 表
396- `cargo test -p space -p repo -p issues -p project` 全绿
397- 重命名测试通过(旧 URL 仍能解析)
398- `jq '[.paths | keys[] | select(contains("projects"))] | length' openapi.json` ≥ 30
399
400### 阶段 2:repo 模块 URL 改造(3 天)
401
402- `lib/repo/handler/routes.rs`:71 URL 改造(注意:实测当前 openapi 是 48,缺 23 个未注册的 handler,可能源于 axum 0.8 wildcard 冲突导致部分删除了,需要核对)
403- 48 个 handler 文件改 `Path<(Uuid, Uuid)>` → `Path<(String, Uuid)>`
404- 加 `lookup_space_by_name` + `require_active_member` + `channel_for_repo` 三步
405- `utopa::path` 改路径(约 80 处)
406- `lib/repo/tests/` 测试更新
407- 重生成 `openapi.json` 验证 `channel_id` 减少
408
409**验收**:
410- `cargo build --workspace` 零警告
411- `cargo test -p repo` 全绿
412- `curl /repos/{space_name}/repos/{repo_id}` 返回 401/403 而非 panic
413- openapi.json 中 `channel_id` 字符串减少 ≥ 50
414
415### 阶段 3:issues 模块 URL 改造(3 天)
416
417同阶段 2 模板。实测当前 31 path,缺 22 个。
418
419### 阶段 4:project + space 顶层路径扁平化(1 天)
420
421- `lib/project/handler/routes.rs`:71 URL 改造 + 路径扁平化
422- `lib/space/handler/routes.rs`:顶层 `/spaces/{sid}` → `/spaces/{space_name}`(**注**:space 模块已经有 19 path 实测,要核对哪些用了 `{sid}`)
423
424### 阶段 5:dvcs 适配(1 天)
425
426- dvcs/gitsmart / gitssh / gitauth / gitsync 共 ~6 文件
427- 这些文件**仍依赖 `repo.channel_id`**——但通过新的反查 helper 取值即可,**不需要改 URL 形态**
428
429### 阶段 6:跨模块装配 + 收尾(1 天)
430
431- webapi / mcp / agent / livechat 顶层装配更新
432- 错误消息统一为 "forbidden: not a member of space {name}"
433- 全局 grep `openapi.json`:不出现 `channel_id`(除 schema 字段)
434- 更新 README / wiki
435
436### 阶段 7:(可选,远期)schema 双键 migration
437
438> 不在本路线图强制执行。**注意**:迁移目标**不是删除 channel_id**,而是**加上 space_id 形成双键**——channel_id 是资源在 space 内的物理位置,必须保留。
439
440- DB migration:5 张一级表(repos / issues / posts / chat / meets)加 `space_id: Uuid NOT NULL` 列
441- 应用层 INSERT 双写(从 `channel.space_id` 反推)
442- 读:`WHERE space_id = ? AND id = ?`,`channel_id` 保留作 channel 树定位与权限 overwrites
443- **完成后 channel 表 / channel_id 列均不再变动**
444
445### 阶段 8:(可选,远期)前端 + 第三方客户端迁移
446
447- 每个 app 单独排期(apphost / githook / gitpro / livechat / mails)
448
449---
450
451## 6. 工作量估算(已纠正)
452
453| 阶段 | 工作量 | 风险 | 依赖 |
454|------|------|------|------|
455| **0(PR HTTP 补齐,建议前置)** | **3d** | 中(新增模块) | 无 |
456| 1 (基础设施 + 新表 + OpenAPI) | 3d | 低 | 无 |
457| 2 (repo URL 改造) | 3d | 中 | 1 |
458| 3 (issues URL 改造) | 3d | 中 | 1 |
459| 4 (project + space 扁平化) | 1d | 低 | 1 |
460| 5 (dvcs 适配) | 1d | 中 | 2 |
461| 6 (跨模块装配 + 收尾) | 1d | 低 | 2,3,4,5 |
462| **合计(推荐路径)** | **15d ≈ 6 轮次(阶段 0-5 各 1 轮,阶段 6 收尾)** | | |
463| 7 (schema 加 space_id 列,**保留** channel_id) | 5d | 高 | 2,3 |
464| 8 (前端迁移) | 5d+ | 中 | 6 |
465
466> **轮次定义**:每个阶段 = 1 个 agent 轮次。阶段 0-5 共 6 轮。阶段 6 是收尾轮。
467> 阶段 7-8 是**可选远期**,按需启动新轮次。
468> **轮次依赖**:上游轮次必须完成,下游才能开始(详见 mermaid 图)。
469>
470> **执行节奏**:每轮次开始前,agent 读取"阶段 N"小节作为任务清单;完成后核对"验收"小节作为完成标志。
471
472---
473
474## 7. 风险与缓解
475
476| 风险 | 缓解 |
477|------|------|
478| 旧 URL 全部失效 | 客户端同步发版;服务返回 404 携带说明 |
479| ~300 文件改动面 | 每阶段独立 PR,每 PR < 1500 行 diff |
480| OpenAPI 拼装回归 | 阶段 1.4.4 加 CI grep 检查 |
481| 反查性能(业务 id → channel_id) | 主键查询,< 1ms |
482| **space_name 反查性能** | `spaces.lower_name` + `space_name_history.lower_name` 双重 unique index;< 1ms |
483| **重命名时唯一性冲突** | `space_name_history.lower_name` 全局 unique;rename 前预检查;事务保证 |
484| **并发 rename** | rename_space 加 advisory lock 或事务隔离级别 SERIALIZABLE |
485| **旧 URL 永久可用导致 name 永久占用** | 接受 trade-off;如需清理,加 `released_at` 字段 + 定期归档 |
486| **dvcs 依赖 channel_id** | 阶段 5 同步迁移;阶段 6/7/8 与 dvcs 团队协调 |
487| **lower_name 字符约束影响老数据** | 上线前 audit:现存 lower_name 是否都符合 `[a-z0-9-]+`;不合规的 rename 一次 |
488| **前端分享链接(重命名后旧 URL 走 history)** | 接受 trade-off;如需 301 重定向,单独排期 |
489| **权限回归** | 阶段 1 helper 单元测试 + 集成测试覆盖 happy + 跨 space 越权 |
490
491---
492
493## 8. 依赖图(mermaid)
494
495```mermaid
496flowchart LR
497 P0[阶段 0<br/>PR HTTP 补齐] --> P2[阶段 2<br/>repo URL]
498 P1[阶段 1<br/>基础设施 + OpenAPI] --> P2
499 P1 --> P3[阶段 3<br/>issues URL]
500 P1 --> P4[阶段 4<br/>project + space 扁平化]
501 P2 --> P5[阶段 5<br/>dvcs 适配]
502 P2 --> P6[阶段 6<br/>装配 + 收尾]
503 P3 --> P6
504 P4 --> P6
505 P5 --> P6
506
507 P2 --> P7[阶段 7<br/>schema 双键<br/>保留 channel_id]
508 P3 --> P7
509 P6 --> P8[阶段 8<br/>前端迁移]
510```
511
512---
513
514## 9. 不在本路线图内
515
516- ❌ **删除 `channel` 表 / `channel_id` 数据库列**——channel_id 是资源在 space 内的物理位置,必须长期保留
517- ❌ 改造 dvcs / githook / gitpro / gitsmart SSH Git 协议服务(阶段 5 适配性改动)
518- ❌ 改造前端 apps(阶段 8)
519- ❌ 性能优化(缓存、批量反查)
520- ❌ 301 重定向表(替代 history 表)
521- ❌ post / meet 业务层 + HTTP 层(独立排期,类比 PR)
522
523---
524
525## 10. 决策汇总(已确认)
526
527| 决策点 | 选择 | 原因 |
528|------|------|------|
529| channel 角色 | **空间内层级容器**(Directory/Object 双形态)+ 内部 ID | 不是简单的"位置映射"——业务资源必须在 channel 树中有具体位置 |
530| **不删除 channel_id 列** | **永久保留** | 资源需要 channel 树定位、权限 overwrites、UI 分组;删除后变"悬空" |
531| 双归属模型 | 业务资源同时有 `space_id`(对外)+ `channel_id`(内部) | 二者不是冗余,是不同维度 |
532| 业务归属层级 | space → project/repo/issue/post/meet/chat | 平级业务 |
533| PR 归属 | 挂在 repo 下 | 不直接挂 space |
534| issue 子资源 | issues 模块聚合,不独立挂 space | 父 issue 决定归属 |
535| post 子资源 | post 模块聚合,不独立挂 space | 父 post 决定归属 |
536| chat 形态 | WebSocket `/api/v1/chat/ws`,不在 REST OpenAPI | 实时通信 |
537| URL 中 space 标识 | `space_name`(小写 + `[a-z0-9-]+`) | 可读、跨租户调试友好 |
538| 路径扁平化 | `/spaces/{sid}/projects/...` → `/projects/{space_name}/...` | 更可读 |
539| 重命名兼容 | `space_name_history` 表 + 回退查询 | 旧 URL 永久可用 |
540| 重命名并发 | 事务隔离 | 防 history 不连续 |
541| 唯一性策略 | `spaces.lower_name` + `space_name_history.lower_name` 双重 unique | 防冲突 |
542| 权限校验粒度 | handler 入口只检查 active 成员资格 | 细粒度由各模块 `authorize_*` 处理 |
543| 旧 URL 处理 | 直接 404,不保留 | 客户端同步发版 |
544| OpenAPI 反射 | utoipa 反射,path 和 schemas 显式列出 | 阶段 1 补 project,阶段 0 补 PR |
545| dvcs 适配 | 阶段 5 同步;channel_id 保留为内部 ID | 渐进迁移 |
546
547---
548
549## 11. 评审清单
550
551> 实施前请确认:
552
553- [x] 业务层级模型是否符合预期
554- [x] **双归属模型(space_id + channel_id 长期保留)**是否同意
555- [x] URL 设计(`/repos/{space_name}/...` 形式 + 扁平化)是否同意
556- [x] `space_name_history` 表的设计 + 唯一性策略 + 字符约束是否接受
557- [x] 重命名永久占用 trade-off 是否接受
558- [x] 权限校验粒度(active 成员检查)是否够用
559- [x] 旧 URL 直接 404 是否同意
560- [x] 阶段编号 0-8 是否合理(PR 阶段 0 前置;已删除"删 channel_id"阶段)
561- [x] 工作量估算 15d / 6 轮次是否合理
562- [x] 文档/发布说明需要提前给客户端吗 → **不需要**(PR 描述中写明变更即可)
No newline at end of file
Modified Cargo.lock Cargo.lock +18 −0 View Cargo.lock
@@ -235,6 +235,12 @@
235235]
236236
237237[[package]]
238name = "arraydeque"
239version = "0.5.1"
240source = "registry+https://github.com/rust-lang/crates.io-index"
241checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236"
242
243[[package]]
238244name = "arrayvec"
239245version = "0.7.8"
240246source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1223,6 +1229,7 @@
12231229 "serde_core",
12241230 "toml",
12251231 "winnow",
1232 "yaml-rust2",
12261233]
12271234
12281235[[package]]
@@ -9251,6 +9258,17 @@
92519258checksum = "aee1b19627c7c60102ab80d3a9cbe18de90bfe03bfa6c3715447681f0e8c8af6"
92529259
92539260[[package]]
9261name = "yaml-rust2"
9262version = "0.11.0"
9263source = "registry+https://github.com/rust-lang/crates.io-index"
9264checksum = "631a50d867fafb7093e709d75aaee9e0e0d5deb934021fcea25ac2fe09edc51e"
9265dependencies = [
9266 "arraydeque",
9267 "encoding_rs",
9268 "hashlink",
9269]
9270
9271[[package]]
92549272name = "yansi"
92559273version = "1.0.1"
92569274source = "registry+https://github.com/rust-lang/crates.io-index"
Modified Cargo.toml Cargo.toml +1 −1 View Cargo.toml
@@ -55,7 +55,7 @@
5555[workspace.dependencies]
5656git = { path = "dvcs/git" }
5757config = { path = "lib/config" }
58config-rs = { package = "config", version = "0.15", default-features = false, features = ["toml"] }
58config-rs = { package = "config", version = "0.15", default-features = false, features = ["toml", "yaml"] }
5959gitauth = { path = "dvcs/gitauth" }
6060gitsmart = { path = "dvcs/gitsmart" }
6161gitssh = { path = "dvcs/gitssh" }
Added openapi.json openapi.json +1 −0 View openapi.json
@@ -0,0 +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/{channel_id}":{"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/{channel_id}/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/{channel_id}/attachments/{owner_type}/{owner_id}/{att_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete attachment"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{channel_id}/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/{channel_id}/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/{channel_id}/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/{channel_id}/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/{channel_id}/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/{channel_id}/pins/{pin_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Unpin issue"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{channel_id}/{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/{channel_id}/{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/{channel_id}/{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/{channel_id}/{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/{channel_id}/{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/{channel_id}/{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/{channel_id}/{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/{channel_id}/{issue_id}/dependencies/{dep_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete dependency"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{channel_id}/{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/{channel_id}/{issue_id}/labels":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"List labels for issue"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{channel_id}/{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/{channel_id}/{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/{channel_id}/{issue_id}/members/{member_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete member"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{channel_id}/{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/{channel_id}/{issue_id}/reactions/{reaction_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Delete reaction"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{channel_id}/{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/{channel_id}/{issue_id}/repo_relations/{rel_id}":{"delete":{"tags":["issues"],"operationId":"handler","responses":{"204":{"description":"Unlink repo from issue"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{channel_id}/{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/{channel_id}/{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/{channel_id}/{issue_id}/users":{"get":{"tags":["issues"],"operationId":"handler","responses":{"200":{"description":"List issue users"}},"security":[{"bearer_auth":[]}]}},"/api/v1/issues/{channel_id}/{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/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{repo_id}/forks":{"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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/repo/{channel_id}/{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/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/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/{sid}":{"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/{sid}/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/{sid}/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/{sid}/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/{sid}/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/{sid}/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/{sid}/channels/{cid}/overwrites/roles/{rid}":{"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Remove a role overwrite"}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{sid}/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/{sid}/channels/{cid}/overwrites/users/{uid}":{"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Remove a user overwrite"}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{sid}/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/{sid}/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/{sid}/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/{sid}/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/{sid}/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/{sid}/members/{uid}/roles/{rid}":{"delete":{"tags":["space"],"operationId":"handler","responses":{"200":{"description":"Unassign a role from a member"}},"security":[{"bearer_auth":[]}]}},"/api/v1/spaces/{sid}/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/{sid}/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"}}},"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"}}},"AddMemberCmd":{"type":"object","required":["user_id"],"properties":{"alias_avatar_url":{"type":["string","null"]},"alias_name":{"type":["string","null"]},"hide_muted_channels":{"type":["boolean","null"]},"message_notifications":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/MessageNotifications"}]},"mobile_push":{"type":["boolean","null"]},"mute_until":{"type":["string","null"]},"muted":{"type":["boolean","null"]},"suppress_everyone":{"type":["boolean","null"]},"suppress_roles":{"type":["boolean","null"]},"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_AddMemberCmd":{"type":"object","required":["request_id","at"],"properties":{"at":{"type":"string"},"data":{"type":"object","required":["user_id"],"properties":{"alias_avatar_url":{"type":["string","null"]},"alias_name":{"type":["string","null"]},"hide_muted_channels":{"type":["boolean","null"]},"message_notifications":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/MessageNotifications"}]},"mobile_push":{"type":["boolean","null"]},"mute_until":{"type":["string","null"]},"muted":{"type":["boolean","null"]},"suppress_everyone":{"type":["boolean","null"]},"suppress_roles":{"type":["boolean","null"]},"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_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_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_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_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_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_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_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","properties":{"alias_avatar_url":{"type":["string","null"]},"alias_name":{"type":["string","null"]},"hide_muted_channels":{"type":["boolean","null"]},"message_notifications":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/MessageNotifications"}]},"mobile_push":{"type":["boolean","null"]},"mute_until":{"type":["string","null"]},"muted":{"type":["boolean","null"]},"suppress_everyone":{"type":["boolean","null"]},"suppress_roles":{"type":["boolean","null"]}}},"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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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"],"properties":{"author":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/GitIdentity"}]},"committer":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/GitIdentity"}]},"html_url":{"type":["string","null"]},"message":{"type":"string"},"sha":{"type":"string"},"url":{"type":["string","null"]}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}}},"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"]}}},"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"}}},"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"}}},"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"}}},"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"]},"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"]}}},"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"]}}},"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"}}},"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"}}},"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"}}},"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"]}}},"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"}}},"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"]},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"]}}},"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","properties":{"alias_avatar_url":{"type":["string","null"]},"alias_name":{"type":["string","null"]},"hide_muted_channels":{"type":["boolean","null"]},"message_notifications":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/MessageNotifications"}]},"mobile_push":{"type":["boolean","null"]},"mute_until":{"type":["string","null"]},"muted":{"type":["boolean","null"]},"suppress_everyone":{"type":["boolean","null"]},"suppress_roles":{"type":["boolean","null"]}}},"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"]}}},"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"]}}},"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"}}},"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"}}},"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