1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use uuid::Uuid;
4
5use crate::resource::{bug::BugResource, common::RepositoryRole, user::UserResource};
6
7#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
8pub struct RepositoryResource {
9 pub id: Uuid,
10 pub name: String,
11 pub owner: String,
12
13 pub readonly: bool,
14 pub visibility: String,
15 #[serde(skip_serializing_if = "Option::is_none")]
16 pub description: Option<String>,
17 pub stars: u32,
18
19 pub created_at: DateTime<Utc>,
20
21 pub user_role: RepositoryRole,
23 pub user_starred: bool,
24}
25
26#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
27pub struct RepositoryPathsResource {
28 pub ref_name: String,
29 pub commit_sha: String,
30 pub entries: Vec<RepositoryPathResource>,
31}
32
33#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
34pub struct RepositoryPathResource {
35 pub path: String,
36 pub name: String,
37 pub path_type: PathType,
38 pub sha: String,
39}
40
41#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
42#[serde(rename_all = "snake_case")]
43pub enum PathType {
44 Blob,
45 Tree,
46 Commit,
47 Unknown,
48}
49
50#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
51pub struct RepositoryBlobResource {
52 pub commit_sha: String,
53 pub path: String,
54 pub sha: String,
55 pub content: String,
56 pub encoding: String,
57}
58
59#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
60pub struct RepositoryBlobsResource {
61 pub blobs: Vec<RepositoryBlobResource>,
62}
63
64#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
65pub struct RepositoryCommitsResource {
66 pub commits: Vec<RepositoryCommitResource>,
67}
68
69#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
70pub struct RepositoryCommitResource {
71 pub owner_name: String,
72 pub repo_name: String,
73 pub sha: String,
74 pub parent_sha: String,
75 pub message: String,
76 pub date: DateTime<Utc>,
77 pub author: CommitAuthorResource,
78 #[serde(skip_serializing_if = "Option::is_none")]
79 pub bug_number: Option<i32>,
80 #[serde(skip_serializing_if = "Option::is_none")]
81 pub review_number: Option<i32>,
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub diff_position: Option<i32>,
84 pub diffs: Vec<CommitDiffResource>,
85}
86
87#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
88pub struct CommitAuthorResource {
89 #[serde(skip_serializing_if = "Option::is_none")]
90 pub id: Option<Uuid>,
91 #[serde(skip_serializing_if = "Option::is_none")]
92 pub name: Option<String>,
93 pub git_name: String,
94 #[serde(default, skip_serializing_if = "Option::is_none")]
95 pub image_updated_at: Option<DateTime<Utc>>,
96}
97
98#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
99pub struct CommitDiffResource {
100 pub path: String,
101 pub lines_added: u32,
102 pub lines_removed: u32,
103}
104
105#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
106pub struct RepositoryBlobPairResource {
107 pub path: String,
108 #[serde(skip_serializing_if = "Option::is_none")]
109 pub old: Option<RepositoryBlobResource>,
110 #[serde(skip_serializing_if = "Option::is_none")]
111 pub new: Option<RepositoryBlobResource>,
112}
113
114#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
115pub struct RepositoryBugsResource {
116 pub bugs: Vec<BugResource>,
117}
118
119#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
120pub struct RepositoryResourcesResource {
121 pub last_commit: String,
122 pub last_updated: Option<DateTime<Utc>>,
123 #[serde(skip_serializing_if = "Option::is_none", default)]
124 pub paths: Option<RepositoryPathsResource>,
125 #[serde(skip_serializing_if = "Option::is_none", default)]
126 pub commits: Option<RepositoryCommitsResource>,
127 #[serde(skip_serializing_if = "Option::is_none", default)]
128 pub blobs: Option<RepositoryBlobsResource>,
129 #[serde(skip_serializing_if = "Option::is_none", default)]
130 pub bugs: Option<RepositoryBugsResource>,
131}
132
133#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
134#[serde(tag = "type", rename_all = "snake_case")]
135pub enum RepositoryActivityEventResource {
136 Starred {
137 user: UserResource,
138 at: DateTime<Utc>,
139 },
140}
141
142#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
143pub struct RepositoryCommitFilterResource {
144 pub id: Uuid,
145 pub repository_id: Uuid,
146 pub name: String,
147 #[serde(skip_serializing_if = "Option::is_none")]
148 pub authors: Option<Vec<String>>,
149 #[serde(skip_serializing_if = "Option::is_none")]
150 pub tags: Option<Vec<String>>,
151 #[serde(skip_serializing_if = "Option::is_none")]
152 pub paths: Option<Vec<String>>,
153 pub created_at: DateTime<Utc>,
154 pub updated_at: DateTime<Utc>,
155}