Skip to main content

agentics_domain/models/challenge/
published.rs

1//! Published challenge API DTOs.
2
3use 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/// One row in the public challenge catalog.
18#[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/// Public challenge catalog response.
34#[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/// Public Moltbook community metadata exposed on challenge detail surfaces.
44#[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/// Public challenge detail response with spec and Markdown statement.
53#[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/// Admin-facing challenge metadata response.
66#[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/// One row in the admin challenge list.
79#[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/// Admin challenge list response.
108#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
109pub struct AdminChallengeListResponse {
110    pub items: Vec<AdminChallengeListItemDto>,
111}
112
113/// Admin response returned after publishing a challenge bundle.
114#[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}