@@ -3,14 +3,56 @@ package com.ctrlhub.core.datacapture
33import com.ctrlhub.core.Api
44import com.ctrlhub.core.datacapture.resource.FormSubmissionVersion
55import com.ctrlhub.core.datacapture.response.FormSchema
6+ import com.ctrlhub.core.datacapture.response.Form
7+ import com.ctrlhub.core.iam.response.User
8+ import com.ctrlhub.core.media.response.Image
69import com.ctrlhub.core.router.Router
710import io.ktor.client.HttpClient
811import io.ktor.http.ContentType
912import com.ctrlhub.core.api.response.PaginatedList
13+ import com.ctrlhub.core.router.request.FilterOption
14+ import com.ctrlhub.core.router.request.JsonApiIncludes
15+ import com.ctrlhub.core.router.request.RequestParametersWithIncludes
16+
17+ @Suppress(" unused" )
18+ enum class FormSubmissionVersionIncludes (val key : String ) : JsonApiIncludes {
19+ Author (" author" ),
20+ Form (" form" ),
21+ Organisation (" organisation" ),
22+ Schema (" schema" ),
23+ Submission (" submission" ),
24+ PayloadImages (" payload_images" ),
25+ PayloadOperations (" payload_operations" ),
26+ PayloadProperties (" payload_properties" ),
27+ PayloadUsers (" payload_users" );
28+
29+ override fun value (): String = key
30+ }
31+
32+ class FormSubmissionVersionRequestParameters (
33+ offset : Int = 0 ,
34+ limit : Int = 100 ,
35+ filterOptions : List <FilterOption > = emptyList(),
36+ includes : List <FormSubmissionVersionIncludes > = emptyList()
37+ ) : RequestParametersWithIncludes<FormSubmissionVersionIncludes>(
38+ offset = offset,
39+ limit = limit,
40+ filterOptions = filterOptions,
41+ includes = includes,
42+ )
1043
1144class FormSubmissionVersionsRouter (httpClient : HttpClient ) : Router(httpClient) {
1245 /* *
13- * Create a new form submission version
46+ * Create a new form submission version.
47+ *
48+ * Sends a POST request to create a submission (and implicitly its version) for the given form.
49+ *
50+ * @param organisationId the organisation UUID the form belongs to
51+ * @param formId the form UUID to create a submission for
52+ * @param schemaId the schema UUID to associate with the created version
53+ * @param payload arbitrary map representing the submission payload (field id -> value)
54+ * @return the created and hydrated FormSubmissionVersion instance
55+ * @throws Exception on network or parsing errors
1456 */
1557 suspend fun create (organisationId : String , formId : String , schemaId : String , payload : Map <String , Any >): FormSubmissionVersion {
1658 return postJsonApiResource(
@@ -31,26 +73,136 @@ class FormSubmissionVersionsRouter(httpClient: HttpClient) : Router(httpClient)
3173 }
3274
3375 /* *
34- * Get all submission versions for a given form (paginated)
76+ * Get all submission versions for a given form (paginated).
77+ *
78+ * Returns a paginated list of FormSubmissionVersion resources. Supports JSON:API include options
79+ * to hydrate related resources (author, form, schema, images, etc.) via the requestParameters.
80+ *
81+ * @param organisationId the organisation UUID
82+ * @param formId the form UUID
83+ * @param submissionId the submission UUID to list versions for
84+ * @param requestParameters optional paging, filter and include parameters
85+ * @return PaginatedList containing FormSubmissionVersion items and pagination meta
3586 */
36- suspend fun all (organisationId : String , formId : String , submissionId : String ): PaginatedList <FormSubmissionVersion > {
87+ suspend fun all (
88+ organisationId : String ,
89+ formId : String ,
90+ submissionId : String ,
91+ requestParameters : FormSubmissionVersionRequestParameters = FormSubmissionVersionRequestParameters ()
92+ ): PaginatedList <FormSubmissionVersion > {
3793 return fetchPaginatedJsonApiResources(
3894 " /v3/orgs/$organisationId /data-capture/forms/$formId /submissions/$submissionId /versions" ,
39- queryParameters = emptyMap(),
40- FormSubmissionVersion ::class .java,
41- FormSchema ::class .java
95+ requestParameters.toMap(),
96+ User ::class .java,
97+ Form ::class .java,
98+ FormSchema ::class .java,
99+ Image ::class .java
100+ )
101+ }
102+
103+ /* *
104+ * Get all submission versions for a specific submission (paginated).
105+ *
106+ * Overload that lists versions by submission id without a form id in the path.
107+ *
108+ * @param organisationId the organisation UUID
109+ * @param submissionId the submission UUID to list versions for
110+ * @param requestParameters optional paging, filter and include parameters
111+ * @return PaginatedList containing FormSubmissionVersion items and pagination meta
112+ */
113+ suspend fun all (
114+ organisationId : String ,
115+ submissionId : String ,
116+ requestParameters : FormSubmissionVersionRequestParameters = FormSubmissionVersionRequestParameters ()
117+ ): PaginatedList <FormSubmissionVersion > {
118+ return fetchPaginatedJsonApiResources(
119+ " /v3/orgs/$organisationId /data-capture/submissions/$submissionId /versions" ,
120+ requestParameters.toMap(),
121+ User ::class .java,
122+ Form ::class .java,
123+ FormSchema ::class .java,
124+ Image ::class .java
125+ )
126+ }
127+
128+ /* *
129+ * Get all form submission versions across an organisation (paginated).
130+ *
131+ * Useful for admin-style listing of all submission versions. Supports includes via requestParameters.
132+ *
133+ * @param organisationId the organisation UUID
134+ * @param requestParameters optional paging, filter and include parameters
135+ * @return PaginatedList containing FormSubmissionVersion items and pagination meta
136+ */
137+ suspend fun all (
138+ organisationId : String ,
139+ requestParameters : FormSubmissionVersionRequestParameters = FormSubmissionVersionRequestParameters ()
140+ ): PaginatedList <FormSubmissionVersion > {
141+ return fetchPaginatedJsonApiResources(
142+ " /v3/orgs/$organisationId /data-capture/form-submission-versions" ,
143+ requestParameters.toMap(),
144+ User ::class .java,
145+ Form ::class .java,
146+ FormSchema ::class .java,
147+ Image ::class .java
42148 )
43149 }
44150
45151 /* *
46- * Get a single submission version
152+ * Get a single submission version.
153+ *
154+ * Fetches and hydrates a single FormSubmissionVersion resource by id. Supports JSON:API include
155+ * parameters via requestParameters to hydrate related resources.
156+ *
157+ * @param organisationId the organisation UUID
158+ * @param formId the form UUID the submission belongs to
159+ * @param submissionId the submission UUID
160+ * @param versionId the version UUID to fetch
161+ * @param requestParameters optional paging, filter and include parameters
162+ * @return the hydrated FormSubmissionVersion
47163 */
48- suspend fun one (organisationId : String , formId : String , submissionId : String , versionId : String ): FormSubmissionVersion {
164+ suspend fun one (
165+ organisationId : String ,
166+ formId : String ,
167+ submissionId : String ,
168+ versionId : String ,
169+ requestParameters : FormSubmissionVersionRequestParameters = FormSubmissionVersionRequestParameters ()
170+ ): FormSubmissionVersion {
49171 return fetchJsonApiResource(
50172 " /v3/orgs/$organisationId /data-capture/forms/$formId /submissions/$submissionId /versions/$versionId " ,
51- queryParameters = emptyMap(),
52- FormSubmissionVersion ::class .java,
53- FormSchema ::class .java
173+ requestParameters.toMap(),
174+ User ::class .java,
175+ Form ::class .java,
176+ FormSchema ::class .java,
177+ Image ::class .java
178+ )
179+ }
180+
181+ /* *
182+ * Get a single submission version by submission id (no form in path).
183+ *
184+ * Fetches and hydrates a single FormSubmissionVersion resource by id using the endpoint that does
185+ * not include the form id in the path.
186+ *
187+ * @param organisationId the organisation UUID
188+ * @param submissionId the submission UUID
189+ * @param versionId the version UUID to fetch
190+ * @param requestParameters optional paging, filter and include parameters
191+ * @return the hydrated FormSubmissionVersion
192+ */
193+ suspend fun one (
194+ organisationId : String ,
195+ submissionId : String ,
196+ versionId : String ,
197+ requestParameters : FormSubmissionVersionRequestParameters = FormSubmissionVersionRequestParameters ()
198+ ): FormSubmissionVersion {
199+ return fetchJsonApiResource(
200+ " /v3/orgs/$organisationId /data-capture/submissions/$submissionId /versions/$versionId " ,
201+ requestParameters.toMap(),
202+ User ::class .java,
203+ Form ::class .java,
204+ FormSchema ::class .java,
205+ Image ::class .java
54206 )
55207 }
56208}
0 commit comments