models.rs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. use serde::{Deserialize, Serialize};
  2. #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
  3. #[repr(i64)]
  4. pub enum AccessMode {
  5. None = 0,
  6. Read = 1,
  7. Write = 2,
  8. Admin = 3,
  9. Owner = 4,
  10. }
  11. impl AccessMode {
  12. pub fn parse_permission(permission: &str) -> Option<Self> {
  13. match permission.trim().to_ascii_lowercase().as_str() {
  14. "read" => Some(Self::Read),
  15. "write" => Some(Self::Write),
  16. "admin" => Some(Self::Admin),
  17. _ => None,
  18. }
  19. }
  20. }
  21. #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
  22. #[repr(i64)]
  23. pub enum PullRequestStatus {
  24. Conflict = 0,
  25. Checking = 1,
  26. Mergeable = 2,
  27. }
  28. #[derive(Debug, Clone, Serialize, Deserialize)]
  29. pub struct User {
  30. pub id: i64,
  31. pub lower_name: String,
  32. pub name: String,
  33. pub full_name: String,
  34. pub email: String,
  35. pub password_hash: String,
  36. pub is_active: bool,
  37. pub is_admin: bool,
  38. pub created_unix: i64,
  39. pub updated_unix: i64,
  40. }
  41. #[derive(Debug, Clone, Serialize, Deserialize)]
  42. pub struct ApiUser {
  43. pub id: i64,
  44. pub lower_name: String,
  45. pub name: String,
  46. pub full_name: String,
  47. pub email: String,
  48. pub created_unix: i64,
  49. pub updated_unix: i64,
  50. }
  51. #[derive(Debug, Deserialize)]
  52. pub struct CreateUserRequest {
  53. pub username: String,
  54. pub email: String,
  55. pub password: String,
  56. #[serde(default)]
  57. pub full_name: String,
  58. #[serde(default)]
  59. pub is_admin: bool,
  60. #[serde(default = "default_true")]
  61. pub is_active: bool,
  62. }
  63. #[derive(Debug, Clone, Serialize, Deserialize)]
  64. pub struct Repository {
  65. pub id: i64,
  66. pub owner_id: i64,
  67. pub lower_name: String,
  68. pub name: String,
  69. pub description: String,
  70. pub default_branch: String,
  71. pub is_private: bool,
  72. pub is_bare: bool,
  73. pub is_fork: bool,
  74. pub fork_id: i64,
  75. pub created_unix: i64,
  76. pub updated_unix: i64,
  77. }
  78. #[derive(Debug, Deserialize)]
  79. pub struct CreateRepositoryRequest {
  80. pub name: String,
  81. #[serde(default)]
  82. pub description: String,
  83. #[serde(default)]
  84. pub is_private: bool,
  85. #[serde(default)]
  86. pub auto_init: bool,
  87. }
  88. #[derive(Debug, Deserialize)]
  89. pub struct ForkRepositoryRequest {
  90. pub name: String,
  91. #[serde(default)]
  92. pub description: String,
  93. }
  94. #[derive(Debug, Clone, Serialize, Deserialize)]
  95. pub struct RepositoryWithOwner {
  96. pub repo: Repository,
  97. pub owner: User,
  98. }
  99. #[derive(Debug, Clone, Serialize, Deserialize)]
  100. pub struct ApiRepositoryWithOwner {
  101. pub repo: Repository,
  102. pub owner: ApiUser,
  103. }
  104. #[derive(Debug, Clone, Serialize, Deserialize)]
  105. pub struct RepositoryPermission {
  106. pub mode: AccessMode,
  107. pub can_read: bool,
  108. pub can_write: bool,
  109. pub can_admin: bool,
  110. pub is_owner: bool,
  111. }
  112. #[derive(Debug, Clone, Serialize, Deserialize)]
  113. pub struct ApiRepositoryResponse {
  114. pub repo: Repository,
  115. pub owner: ApiUser,
  116. pub permission: RepositoryPermission,
  117. }
  118. #[derive(Debug, Clone, Serialize, Deserialize)]
  119. pub struct AccessToken {
  120. pub id: i64,
  121. pub user_id: i64,
  122. pub name: String,
  123. pub token_hash: String,
  124. pub created_unix: i64,
  125. pub updated_unix: i64,
  126. }
  127. #[derive(Debug, Clone, Serialize, Deserialize)]
  128. pub struct Collaboration {
  129. pub id: i64,
  130. pub user_id: i64,
  131. pub repo_id: i64,
  132. pub mode: AccessMode,
  133. }
  134. #[derive(Debug, Deserialize)]
  135. pub struct LoginRequest {
  136. pub login: String,
  137. pub password: String,
  138. }
  139. #[derive(Debug, Serialize, Deserialize)]
  140. pub struct LoginResponse {
  141. pub token: String,
  142. pub user: User,
  143. }
  144. #[derive(Debug, Serialize, Deserialize)]
  145. pub struct ApiLoginResponse {
  146. pub token: String,
  147. pub user: ApiUser,
  148. }
  149. #[derive(Debug, Deserialize)]
  150. pub struct CreateAccessTokenRequest {
  151. pub name: String,
  152. }
  153. #[derive(Debug, Serialize, Deserialize)]
  154. pub struct CreateAccessTokenResponse {
  155. pub id: i64,
  156. pub name: String,
  157. pub token: String,
  158. pub created_unix: i64,
  159. pub updated_unix: i64,
  160. }
  161. #[derive(Debug, Clone, Serialize, Deserialize)]
  162. pub struct AccessTokenResponse {
  163. pub id: i64,
  164. pub name: String,
  165. pub created_unix: i64,
  166. pub updated_unix: i64,
  167. }
  168. #[derive(Debug, Deserialize)]
  169. pub struct UpsertCollaboratorRequest {
  170. pub username: String,
  171. pub permission: String,
  172. }
  173. #[derive(Debug, Serialize, Deserialize)]
  174. pub struct CollaboratorResponse {
  175. pub user: User,
  176. pub mode: AccessMode,
  177. }
  178. #[derive(Debug, Serialize, Deserialize)]
  179. pub struct ApiCollaboratorResponse {
  180. pub user: ApiUser,
  181. pub mode: AccessMode,
  182. }
  183. #[derive(Debug, Serialize, Deserialize)]
  184. pub struct Branch {
  185. pub name: String,
  186. }
  187. #[derive(Debug, Clone, Serialize, Deserialize)]
  188. pub struct PullRequest {
  189. pub id: i64,
  190. pub index: i64,
  191. pub title: String,
  192. pub body: String,
  193. pub status: PullRequestStatus,
  194. pub head_repo_id: i64,
  195. pub base_repo_id: i64,
  196. pub head_user_name: String,
  197. pub head_branch: String,
  198. pub base_branch: String,
  199. pub merge_base: String,
  200. pub merged_commit_id: String,
  201. pub poster_id: i64,
  202. pub has_merged: bool,
  203. pub is_closed: bool,
  204. pub created_unix: i64,
  205. pub updated_unix: i64,
  206. }
  207. #[derive(Debug, Deserialize)]
  208. pub struct CreatePullRequestRequest {
  209. pub head_owner: String,
  210. pub head_repo: String,
  211. pub head_branch: String,
  212. pub base_branch: String,
  213. pub title: String,
  214. #[serde(default)]
  215. pub body: String,
  216. }
  217. #[derive(Debug, Deserialize)]
  218. pub struct MergePullRequestRequest {
  219. #[serde(default)]
  220. pub message: String,
  221. }
  222. #[derive(Debug, Deserialize)]
  223. pub struct CompareRequest {
  224. pub base: String,
  225. pub head_owner: String,
  226. pub head_repo: String,
  227. pub head_branch: String,
  228. }
  229. #[derive(Debug, Deserialize)]
  230. pub struct RepositoryListQuery {
  231. #[serde(default)]
  232. pub q: String,
  233. }
  234. #[derive(Debug, Clone, Serialize, Deserialize)]
  235. pub struct CompareCommit {
  236. pub id: String,
  237. pub summary: String,
  238. pub author_name: String,
  239. pub author_email: String,
  240. }
  241. #[derive(Debug, Clone, Serialize, Deserialize)]
  242. pub struct CompareFile {
  243. pub path: String,
  244. pub additions: i64,
  245. pub deletions: i64,
  246. }
  247. #[derive(Debug, Clone, Serialize, Deserialize)]
  248. pub struct CompareResponse {
  249. pub base_branch: String,
  250. pub head_branch: String,
  251. pub merge_base: String,
  252. pub head_commit_id: String,
  253. pub status: PullRequestStatus,
  254. pub commits: Vec<CompareCommit>,
  255. pub files: Vec<CompareFile>,
  256. pub is_nothing_to_compare: bool,
  257. }
  258. #[derive(Debug, Clone, Serialize, Deserialize)]
  259. pub struct PullRequestResponse {
  260. pub pull_request: PullRequest,
  261. pub head_repo: RepositoryWithOwner,
  262. pub base_repo: RepositoryWithOwner,
  263. }
  264. #[derive(Debug, Clone, Serialize, Deserialize)]
  265. pub struct ApiPullRequestResponse {
  266. pub pull_request: PullRequest,
  267. pub head_repo: ApiRepositoryWithOwner,
  268. pub base_repo: ApiRepositoryWithOwner,
  269. }
  270. #[derive(Debug, Clone, Serialize, Deserialize)]
  271. pub struct PullRequestDetailResponse {
  272. pub pull_request: PullRequest,
  273. pub head_repo: RepositoryWithOwner,
  274. pub base_repo: RepositoryWithOwner,
  275. pub compare: CompareResponse,
  276. }
  277. #[derive(Debug, Clone, Serialize, Deserialize)]
  278. pub struct ApiPullRequestDetailResponse {
  279. pub pull_request: PullRequest,
  280. pub head_repo: ApiRepositoryWithOwner,
  281. pub base_repo: ApiRepositoryWithOwner,
  282. pub compare: CompareResponse,
  283. }
  284. fn default_true() -> bool {
  285. true
  286. }
  287. impl From<&User> for ApiUser {
  288. fn from(value: &User) -> Self {
  289. Self {
  290. id: value.id,
  291. lower_name: value.lower_name.clone(),
  292. name: value.name.clone(),
  293. full_name: value.full_name.clone(),
  294. email: value.email.clone(),
  295. created_unix: value.created_unix,
  296. updated_unix: value.updated_unix,
  297. }
  298. }
  299. }
  300. impl From<&RepositoryWithOwner> for ApiRepositoryWithOwner {
  301. fn from(value: &RepositoryWithOwner) -> Self {
  302. Self {
  303. repo: value.repo.clone(),
  304. owner: ApiUser::from(&value.owner),
  305. }
  306. }
  307. }
  308. impl ApiRepositoryResponse {
  309. pub fn from_repo(value: &RepositoryWithOwner, permission: RepositoryPermission) -> Self {
  310. Self {
  311. repo: value.repo.clone(),
  312. owner: ApiUser::from(&value.owner),
  313. permission,
  314. }
  315. }
  316. }
  317. impl From<&LoginResponse> for ApiLoginResponse {
  318. fn from(value: &LoginResponse) -> Self {
  319. Self {
  320. token: value.token.clone(),
  321. user: ApiUser::from(&value.user),
  322. }
  323. }
  324. }
  325. impl From<&CollaboratorResponse> for ApiCollaboratorResponse {
  326. fn from(value: &CollaboratorResponse) -> Self {
  327. Self {
  328. user: ApiUser::from(&value.user),
  329. mode: value.mode,
  330. }
  331. }
  332. }
  333. impl From<&PullRequestResponse> for ApiPullRequestResponse {
  334. fn from(value: &PullRequestResponse) -> Self {
  335. Self {
  336. pull_request: value.pull_request.clone(),
  337. head_repo: ApiRepositoryWithOwner::from(&value.head_repo),
  338. base_repo: ApiRepositoryWithOwner::from(&value.base_repo),
  339. }
  340. }
  341. }
  342. impl From<&PullRequestDetailResponse> for ApiPullRequestDetailResponse {
  343. fn from(value: &PullRequestDetailResponse) -> Self {
  344. Self {
  345. pull_request: value.pull_request.clone(),
  346. head_repo: ApiRepositoryWithOwner::from(&value.head_repo),
  347. base_repo: ApiRepositoryWithOwner::from(&value.base_repo),
  348. compare: value.compare.clone(),
  349. }
  350. }
  351. }