Skip to main content

args_api/resource/
user.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use uuid::Uuid;
4
5use crate::resource::repository::{CommitAuthorResource, CommitDiffResource};
6
7#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
8pub struct UserResource {
9    pub id: Uuid,
10    pub name: String,
11
12    pub location: Option<String>,
13    pub readme: Option<String>,
14    pub links: Vec<String>,
15    pub display_name: Option<String>,
16
17    pub created_at: DateTime<Utc>,
18    pub image_updated_at: DateTime<Utc>,
19}
20
21#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
22pub struct UserEmailResource {
23    pub email: String,
24    pub is_primary: bool,
25    pub is_verified: bool,
26    pub created_at: DateTime<Utc>,
27}
28
29#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
30pub struct CurrentUserResource {
31    pub id: Uuid,
32    pub name: String,
33    pub emails: Vec<UserEmailResource>,
34    pub memberships: Vec<UserMembershipResource>,
35
36    pub location: Option<String>,
37    pub readme: Option<String>,
38    pub links: Vec<String>,
39    pub display_name: Option<String>,
40
41    pub created_at: DateTime<Utc>,
42    pub image_updated_at: DateTime<Utc>,
43}
44
45/// An organization as surfaced from a user's perspective. It contains basic org
46/// info plus the viewer's own membership metadata (`role`, `joined_at`).
47#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
48pub struct UserMembershipResource {
49    pub id: Uuid,
50    pub name: String,
51    pub display_name: Option<String>,
52
53    pub role: String,
54    pub role_description: Option<String>,
55    pub joined_at: DateTime<Utc>,
56    pub image_updated_at: DateTime<Utc>,
57}
58
59/// A repository as surfaced on a user's profile. It contains the viewer-visible
60/// subset of repo fields plus the user's contribution stats.
61#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
62pub struct UserRepositoryResource {
63    pub owner: String,
64    pub name: String,
65    #[serde(default, skip_serializing_if = "Option::is_none")]
66    pub description: Option<String>,
67    pub stars: u32,
68    pub visibility: String,
69
70    #[serde(default, skip_serializing_if = "Option::is_none")]
71    pub commit_count: Option<u32>,
72    #[serde(default, skip_serializing_if = "Option::is_none")]
73    pub last_commit_at: Option<DateTime<Utc>>,
74}
75
76/// A commit as surfaced on a user's profile. Most fields are optional so that
77/// commits in private repositories the viewer cannot access can be returned as
78/// a redacted stub (timestamp + `redacted: true` only)
79#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
80pub struct UserCommitResource {
81    pub id: Uuid,
82    pub date: DateTime<Utc>,
83    pub redacted: bool,
84
85    #[serde(default, skip_serializing_if = "Option::is_none")]
86    pub owner_name: Option<String>,
87    #[serde(default, skip_serializing_if = "Option::is_none")]
88    pub repo_name: Option<String>,
89    #[serde(default, skip_serializing_if = "Option::is_none")]
90    pub sha: Option<String>,
91    #[serde(default, skip_serializing_if = "Option::is_none")]
92    pub parent_sha: Option<String>,
93    #[serde(default, skip_serializing_if = "Option::is_none")]
94    pub message: Option<String>,
95    #[serde(default, skip_serializing_if = "Option::is_none")]
96    pub author: Option<CommitAuthorResource>,
97    #[serde(default, skip_serializing_if = "Option::is_none")]
98    pub bug_number: Option<i32>,
99    #[serde(default, skip_serializing_if = "Option::is_none")]
100    pub review_number: Option<i32>,
101    #[serde(default, skip_serializing_if = "Option::is_none")]
102    pub diff_position: Option<i32>,
103    #[serde(default, skip_serializing_if = "Vec::is_empty")]
104    pub diffs: Vec<CommitDiffResource>,
105}