use chrono::{DateTime, Utc}; use labrinth::models::{ notifications::NotificationId, organizations::OrganizationId, projects::{ Dependency, GalleryItem, License, ModeratorMessage, MonetizationStatus, ProjectId, ProjectStatus, VersionFile, VersionId, VersionStatus, VersionType, }, teams::{ProjectPermissions, TeamId}, threads::ThreadId, users::{User, UserId}, }; 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. // 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, // TODO: should ordering be in v2? pub ordering: Option, } #[derive(Deserialize)] pub struct CommonImageData { pub filename: String, pub extension: String, pub icon: 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), }