use chrono::{DateTime, Utc}; use labrinth::{ auth::AuthProvider, models::{ images::ImageId, notifications::NotificationId, organizations::OrganizationId, projects::{ Dependency, GalleryItem, License, ModeratorMessage, MonetizationStatus, ProjectId, ProjectStatus, VersionFile, VersionId, VersionStatus, VersionType, }, reports::ReportId, teams::{ProjectPermissions, TeamId}, threads::{ThreadId, ThreadMessageId}, users::{Badges, Role, User, UserId, UserPayoutData}, }, }; use rust_decimal::Decimal; use serde::Deserialize; // Fields shared by every version of the API. // No struct in here should have ANY field that // is not present in *every* version of the API. // Exceptions are fields that *should* be changing across the API, and older versions // should be unsupported on API version increase- for example, payouts related financial fields. // These are used for common tests- tests that can be used on both V2 AND v3 of the API and have the same results. // Any test that requires version-specific fields should have its own test that is not done for each version, // as the environment generator for both uses common fields. #[derive(Deserialize)] pub struct CommonProject { // For example, for CommonProject, we do not include: // - game_versions (v2 only) // - loader_fields (v3 only) // - etc. // For any tests that require those fields, we make a separate test with separate API functions tht do not use Common models. pub id: ProjectId, pub slug: Option, pub organization: Option, pub published: DateTime, pub updated: DateTime, pub approved: Option>, pub queued: Option>, pub status: ProjectStatus, pub requested_status: Option, pub moderator_message: Option, pub license: License, pub downloads: u32, pub followers: u32, pub categories: Vec, pub additional_categories: Vec, pub loaders: Vec, pub versions: Vec, pub icon_url: Option, pub gallery: Vec, pub color: Option, pub thread_id: ThreadId, pub monetization_status: MonetizationStatus, } #[derive(Deserialize, Clone)] pub struct CommonVersion { pub id: VersionId, pub loaders: Vec, pub project_id: ProjectId, pub author_id: UserId, pub featured: bool, pub name: String, pub version_number: String, pub changelog: String, pub date_published: DateTime, pub downloads: u32, pub version_type: VersionType, pub status: VersionStatus, pub requested_status: Option, pub files: Vec, pub dependencies: Vec, } #[derive(Deserialize)] pub struct CommonLoaderData { pub icon: String, pub name: String, pub supported_project_types: Vec, } #[derive(Deserialize)] pub struct CommonCategoryData { pub icon: String, pub name: String, pub project_type: String, pub header: String, } /// A member of a team #[derive(Deserialize)] pub struct CommonTeamMember { pub team_id: TeamId, pub user: User, pub role: String, pub permissions: Option, pub accepted: bool, pub payouts_split: Option, pub ordering: i64, } #[derive(Deserialize)] pub struct CommonNotification { pub id: NotificationId, pub user_id: UserId, pub read: bool, pub created: DateTime, // Body is absent as one of the variants differs pub text: String, pub link: String, pub actions: Vec, } #[derive(Deserialize)] pub struct CommonNotificationAction { pub action_route: (String, String), } #[derive(Deserialize, Clone)] #[serde(rename_all = "kebab-case")] pub enum CommonItemType { Project, Version, User, Unknown, } impl CommonItemType { pub fn as_str(&self) -> &'static str { match self { CommonItemType::Project => "project", CommonItemType::Version => "version", CommonItemType::User => "user", CommonItemType::Unknown => "unknown", } } } #[derive(Deserialize)] pub struct CommonReport { pub id: ReportId, pub report_type: String, pub item_id: String, pub item_type: CommonItemType, pub reporter: UserId, pub body: String, pub created: DateTime, pub closed: bool, pub thread_id: ThreadId, } #[derive(Deserialize)] pub enum LegacyItemType { Project, Version, User, Unknown, } #[derive(Deserialize)] pub struct CommonThread { pub id: ThreadId, #[serde(rename = "type")] pub type_: CommonThreadType, pub project_id: Option, pub report_id: Option, pub messages: Vec, pub members: Vec, } #[derive(Deserialize)] pub struct CommonThreadMessage { pub id: ThreadMessageId, pub author_id: Option, pub body: CommonMessageBody, pub created: DateTime, } #[derive(Deserialize)] pub enum CommonMessageBody { Text { body: String, #[serde(default)] private: bool, replying_to: Option, #[serde(default)] associated_images: Vec, }, StatusChange { new_status: ProjectStatus, old_status: ProjectStatus, }, ThreadClosure, ThreadReopen, Deleted, } #[derive(Deserialize)] pub enum CommonThreadType { Report, Project, DirectMessage, } #[derive(Deserialize)] pub struct CommonUser { pub id: UserId, pub username: String, pub name: Option, pub avatar_url: Option, pub bio: Option, pub created: DateTime, pub role: Role, pub badges: Badges, pub auth_providers: Option>, pub email: Option, pub email_verified: Option, pub has_password: Option, pub has_totp: Option, pub payout_data: Option, pub github_id: Option, }