1414use OCA \Tables \Errors \NotFoundError ;
1515use OCA \Tables \Errors \PermissionError ;
1616use OCA \Tables \Middleware \Attribute \RequirePermission ;
17+ use OCA \Tables \Model \ColumnSettings ;
18+ use OCA \Tables \Model \SortRuleSet ;
1719use OCA \Tables \Model \ViewUpdateInput ;
1820use OCA \Tables \ResponseDefinitions ;
1921use OCA \Tables \Service \ColumnService ;
@@ -132,12 +134,19 @@ public function showScheme(int $id): DataResponse {
132134 * @param list<TablesView> $views views
133135 * @param list<array{columnId: int, order: int, readonly: bool}> $columnOrder Default column order settings
134136 * @param list<array{columnId: int, mode: 'ASC'|'DESC'}> $sort Default sort rules
135- * @return DataResponse<Http::STATUS_OK, TablesTable, array{}>|DataResponse<Http::STATUS_INTERNAL_SERVER_ERROR, array{message: string}, array{}>
137+ * @return DataResponse<Http::STATUS_OK, TablesTable, array{}>|DataResponse<Http::STATUS_BAD_REQUEST|Http:: STATUS_INTERNAL_SERVER_ERROR, array{message: string}, array{}>
136138 *
137139 * 200: Tables returned
140+ * 400: Invalid request data
138141 */
139142 #[NoAdminRequired]
140143 public function createFromScheme (string $ title , string $ emoji , string $ description , array $ columns , array $ views , array $ columnOrder = [], array $ sort = []): DataResponse {
144+ try {
145+ ColumnSettings::createFromInputArray ($ columnOrder );
146+ SortRuleSet::createFromInputArray ($ sort );
147+ } catch (\InvalidArgumentException $ e ) {
148+ return new DataResponse (['message ' => $ e ->getMessage ()], Http::STATUS_BAD_REQUEST );
149+ }
141150 try {
142151 $ this ->db ->beginTransaction ();
143152 $ table = $ this ->service ->create ($ title , 'custom ' , $ emoji , $ description );
@@ -178,18 +187,24 @@ public function createFromScheme(string $title, string $emoji, string $descripti
178187 $ colMap [$ column ['id ' ]] = $ col ->getId ();
179188 }
180189 if (!empty ($ columnOrder ) || !empty ($ sort )) {
181- $ remappedColumnOrder = !empty ($ columnOrder ) ? array_map (static function (array $ entry ) use ($ colMap ): array {
182- if (isset ($ entry ['columnId ' ]) && $ entry ['columnId ' ] > 0 ) {
183- $ entry ['columnId ' ] = $ colMap [$ entry ['columnId ' ]] ?? $ entry ['columnId ' ];
184- }
185- return $ entry ;
186- }, $ columnOrder ) : null ;
187- $ remappedSort = !empty ($ sort ) ? array_map (static function (array $ entry ) use ($ colMap ): array {
188- if (isset ($ entry ['columnId ' ]) && $ entry ['columnId ' ] > 0 ) {
189- $ entry ['columnId ' ] = $ colMap [$ entry ['columnId ' ]] ?? $ entry ['columnId ' ];
190- }
191- return $ entry ;
192- }, $ sort ) : null ;
190+ $ remappedColumnOrder = null ;
191+ if (!empty ($ columnOrder )) {
192+ $ remappedColumnOrder = ColumnSettings::createFromInputArray (array_map (static function (array $ entry ) use ($ colMap ): array {
193+ if ($ entry ['columnId ' ] > 0 ) {
194+ $ entry ['columnId ' ] = $ colMap [$ entry ['columnId ' ]] ?? $ entry ['columnId ' ];
195+ }
196+ return $ entry ;
197+ }, $ columnOrder ));
198+ }
199+ $ remappedSort = null ;
200+ if (!empty ($ sort )) {
201+ $ remappedSort = SortRuleSet::createFromInputArray (array_map (static function (array $ entry ) use ($ colMap ): array {
202+ if ($ entry ['columnId ' ] > 0 ) {
203+ $ entry ['columnId ' ] = $ colMap [$ entry ['columnId ' ]] ?? $ entry ['columnId ' ];
204+ }
205+ return $ entry ;
206+ }, $ sort ));
207+ }
193208 $ table = $ this ->service ->update ($ table ->getId (), null , null , null , null , $ this ->userId , $ remappedColumnOrder , $ remappedSort );
194209 }
195210 foreach ($ views as $ view ) {
@@ -240,6 +255,14 @@ public function createFromScheme(string $title, string $emoji, string $descripti
240255 }
241256 $ this ->db ->commit ();
242257 return new DataResponse ($ table ->jsonSerialize ());
258+ } catch (\InvalidArgumentException $ e ) {
259+ try {
260+ $ this ->db ->rollBack ();
261+ } catch (\OCP \DB \Exception $ re ) {
262+ return $ this ->handleError ($ re );
263+ }
264+ $ this ->logger ->warning ('An invalid request occurred: ' . $ e ->getMessage (), ['exception ' => $ e ]);
265+ return new DataResponse (['message ' => $ e ->getMessage ()], Http::STATUS_BAD_REQUEST );
243266 } catch (InternalError |Exception $ e ) {
244267 try {
245268 $ this ->db ->rollBack ();
@@ -281,9 +304,10 @@ public function create(string $title, ?string $emoji, ?string $description, stri
281304 * @param string $description the tables description
282305 * @param list<array{columnId: int, order: int, readonly: bool}>|string|null $columnSettings Default column order settings (array or JSON string)
283306 * @param list<array{columnId: int, mode: 'ASC'|'DESC'}>|string|null $sort Default sort rules (array or JSON string)
284- * @return DataResponse<Http::STATUS_OK, TablesTable, array{}>|DataResponse<Http::STATUS_FORBIDDEN|Http::STATUS_INTERNAL_SERVER_ERROR|Http::STATUS_NOT_FOUND, array{message: string}, array{}>
307+ * @return DataResponse<Http::STATUS_OK, TablesTable, array{}>|DataResponse<Http::STATUS_BAD_REQUEST|Http:: STATUS_FORBIDDEN|Http::STATUS_INTERNAL_SERVER_ERROR|Http::STATUS_NOT_FOUND, array{message: string}, array{}>
285308 *
286309 * 200: Tables returned
310+ * 400: Invalid request data
287311 * 403: No permissions
288312 * 404: Not found
289313 */
@@ -297,9 +321,24 @@ public function update(int $id, ?string $title = null, ?string $emoji = null, ?s
297321 $ sort = json_decode ($ sort , true ) ?? null ;
298322 }
299323 try {
300- return new DataResponse ($ this ->service ->update ($ id , $ title , $ emoji , $ description , $ archived , $ this ->userId , $ columnSettings , $ sort )->jsonSerialize ());
324+ if ($ columnSettings !== null && !is_array ($ columnSettings )) {
325+ throw new \InvalidArgumentException ('Invalid columnSettings: must be a JSON array ' );
326+ }
327+ if ($ sort !== null && !is_array ($ sort )) {
328+ throw new \InvalidArgumentException ('Invalid sort: must be a JSON array ' );
329+ }
330+ $ columnSettingsObj = $ columnSettings !== null ? ColumnSettings::createFromInputArray ($ columnSettings ) : null ;
331+ $ sortObj = $ sort !== null ? SortRuleSet::createFromInputArray ($ sort ) : null ;
332+ } catch (\InvalidArgumentException $ e ) {
333+ return new DataResponse (['message ' => $ e ->getMessage ()], Http::STATUS_BAD_REQUEST );
334+ }
335+ try {
336+ return new DataResponse ($ this ->service ->update ($ id , $ title , $ emoji , $ description , $ archived , $ this ->userId , $ columnSettingsObj , $ sortObj )->jsonSerialize ());
301337 } catch (PermissionError $ e ) {
302338 return $ this ->handlePermissionError ($ e );
339+ } catch (\InvalidArgumentException $ e ) {
340+ $ this ->logger ->warning ('An invalid request occurred: ' . $ e ->getMessage (), ['exception ' => $ e ]);
341+ return new DataResponse (['message ' => $ e ->getMessage ()], Http::STATUS_BAD_REQUEST );
303342 } catch (InternalError $ e ) {
304343 return $ this ->handleError ($ e );
305344 } catch (NotFoundError $ e ) {
0 commit comments