args-api 0.1.0

Shared API contract types and endpoint definitions for args.
Documentation
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;

use crate::resource::{bug::BugResource, common::RepositoryRole, user::UserResource};

#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RepositoryResource {
    pub id: Uuid,
    pub name: String,
    pub owner: String,

    pub readonly: bool,
    pub visibility: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub description: Option<String>,
    pub stars: u32,

    pub created_at: DateTime<Utc>,

    // projections
    pub user_role: RepositoryRole,
    pub user_starred: bool,
}

#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RepositoryPathsResource {
    pub ref_name: String,
    pub commit_sha: String,
    pub entries: Vec<RepositoryPathResource>,
}

#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RepositoryPathResource {
    pub path: String,
    pub name: String,
    pub path_type: PathType,
    pub sha: String,
}

#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PathType {
    Blob,
    Tree,
    Commit,
    Unknown,
}

#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RepositoryBlobResource {
    pub commit_sha: String,
    pub path: String,
    pub sha: String,
    pub content: String,
    pub encoding: String,
}

#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RepositoryBlobsResource {
    pub blobs: Vec<RepositoryBlobResource>,
}

#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RepositoryCommitsResource {
    pub commits: Vec<RepositoryCommitResource>,
}

#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RepositoryCommitResource {
    pub owner_name: String,
    pub repo_name: String,
    pub sha: String,
    pub parent_sha: String,
    pub message: String,
    pub date: DateTime<Utc>,
    pub author: CommitAuthorResource,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub bug_number: Option<i32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub review_number: Option<i32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub diff_position: Option<i32>,
    pub diffs: Vec<CommitDiffResource>,
}

#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CommitAuthorResource {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub id: Option<Uuid>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    pub git_name: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub image_updated_at: Option<DateTime<Utc>>,
}

#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CommitDiffResource {
    pub path: String,
    pub lines_added: u32,
    pub lines_removed: u32,
}

#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RepositoryBlobPairResource {
    pub path: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub old: Option<RepositoryBlobResource>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub new: Option<RepositoryBlobResource>,
}

#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RepositoryBugsResource {
    pub bugs: Vec<BugResource>,
}

#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RepositoryResourcesResource {
    pub last_commit: String,
    pub last_updated: Option<DateTime<Utc>>,
    #[serde(skip_serializing_if = "Option::is_none", default)]
    pub paths: Option<RepositoryPathsResource>,
    #[serde(skip_serializing_if = "Option::is_none", default)]
    pub commits: Option<RepositoryCommitsResource>,
    #[serde(skip_serializing_if = "Option::is_none", default)]
    pub blobs: Option<RepositoryBlobsResource>,
    #[serde(skip_serializing_if = "Option::is_none", default)]
    pub bugs: Option<RepositoryBugsResource>,
}

#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum RepositoryActivityEventResource {
    Starred {
        user: UserResource,
        at: DateTime<Utc>,
    },
}

#[derive(ApiResource, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RepositoryCommitFilterResource {
    pub id: Uuid,
    pub repository_id: Uuid,
    pub name: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub authors: Option<Vec<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tags: Option<Vec<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub paths: Option<Vec<String>>,
    pub created_at: DateTime<Utc>,
    pub updated_at: DateTime<Utc>,
}