agentics_domain/models/challenge/
published.rs1use serde::{Deserialize, Serialize};
4
5use crate::models::localization::LocalizedText;
6use crate::models::names::{ChallengeKeyword, ChallengeName, MoltbookSubmoltName};
7use crate::models::urls::{MoltbookPostUrl, MoltbookSubmoltUrl};
8use crate::storage::StorageKey;
9
10use super::bundle::{
11 ChallengeEligibilitySpec, ChallengeSolutionPublicationPolicy, ChallengeVisibilitySpec,
12 PublicChallengeBundleSpec,
13};
14use super::lifecycle::ChallengeLifecycleStatus;
15use super::targets::ChallengeTargetSpec;
16
17#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
19pub struct ChallengeListItemDto {
20 pub challenge_name: ChallengeName,
21 pub title: String,
22 pub summary: LocalizedText,
23 #[schemars(length(min = 1, max = 6))]
24 pub keywords: Vec<ChallengeKeyword>,
25 pub starts_at: String,
26 #[serde(skip_serializing_if = "Option::is_none")]
27 pub closes_at: Option<String>,
28 pub eligibility: ChallengeEligibilitySpec,
29 #[serde(skip_serializing_if = "Option::is_none")]
30 pub moltbook_discussion_url: Option<MoltbookPostUrl>,
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
35pub struct ChallengeListResponse {
36 pub items: Vec<ChallengeListItemDto>,
37 pub total_count: i64,
38 pub limit: i64,
39 pub offset: i64,
40 pub has_more: bool,
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
45pub struct MoltbookCommunityDto {
46 pub submolt_name: MoltbookSubmoltName,
47 pub submolt_url: MoltbookSubmoltUrl,
48 #[serde(skip_serializing_if = "Option::is_none")]
49 pub discussion_url: Option<MoltbookPostUrl>,
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
54pub struct ChallengeDetailResponse {
55 pub challenge_name: ChallengeName,
56 pub title: String,
57 pub summary: LocalizedText,
58 #[schemars(length(min = 1, max = 6))]
59 pub keywords: Vec<ChallengeKeyword>,
60 pub spec: PublicChallengeBundleSpec,
61 pub statement_markdown: String,
62 pub moltbook: MoltbookCommunityDto,
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
67pub struct ChallengeAdminResponse {
68 pub challenge_name: ChallengeName,
69 pub title: String,
70 pub summary: LocalizedText,
71 #[serde(default)]
72 pub keywords: Vec<ChallengeKeyword>,
73 pub status: ChallengeLifecycleStatus,
74 pub created_at: String,
75 pub updated_at: String,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
80pub struct AdminChallengeListItemDto {
81 pub challenge_name: ChallengeName,
82 pub title: String,
83 pub summary: LocalizedText,
84 #[serde(default)]
85 pub keywords: Vec<ChallengeKeyword>,
86 pub status: ChallengeLifecycleStatus,
87 #[serde(skip_serializing_if = "Option::is_none")]
88 pub targets: Option<Vec<ChallengeTargetSpec>>,
89 #[serde(skip_serializing_if = "Option::is_none")]
90 pub starts_at: Option<String>,
91 #[serde(skip_serializing_if = "Option::is_none")]
92 pub closes_at: Option<String>,
93 #[serde(skip_serializing_if = "Option::is_none")]
94 pub eligibility: Option<ChallengeEligibilitySpec>,
95 #[serde(skip_serializing_if = "Option::is_none")]
96 pub visibility: Option<ChallengeVisibilitySpec>,
97 #[serde(skip_serializing_if = "Option::is_none")]
98 pub solution_publication: Option<ChallengeSolutionPublicationPolicy>,
99 #[serde(skip_serializing_if = "Option::is_none")]
100 pub private_benchmark_enabled: Option<bool>,
101 #[serde(skip_serializing_if = "Option::is_none")]
102 pub moltbook_discussion_url: Option<MoltbookPostUrl>,
103 pub created_at: String,
104 pub updated_at: String,
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
109pub struct AdminChallengeListResponse {
110 pub items: Vec<AdminChallengeListItemDto>,
111}
112
113#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
115pub struct PublishChallengeResponse {
116 pub challenge_name: ChallengeName,
117 pub title: String,
118 pub bundle_key: StorageKey,
119 pub public_bundle_key: StorageKey,
120 pub statement_key: StorageKey,
121}