Skip to content

Commit 3a80443

Browse files
Merge pull request #58278 from nextcloud/techdebt/noid/openapi-for-workflow-engine
feat(workflowengine): Add openapi for workflow engine
2 parents 045a416 + 4134df9 commit 3a80443

18 files changed

Lines changed: 5356 additions & 65 deletions

apps/workflowengine/.noopenapi

Whitespace-only changes.

apps/workflowengine/appinfo/routes.php

Lines changed: 0 additions & 17 deletions
This file was deleted.

apps/workflowengine/composer/composer/autoload_classmap.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
'OCA\\WorkflowEngine\\Check\\TFileCheck' => $baseDir . '/../lib/Check/TFileCheck.php',
2222
'OCA\\WorkflowEngine\\Check\\UserGroupMembership' => $baseDir . '/../lib/Check/UserGroupMembership.php',
2323
'OCA\\WorkflowEngine\\Command\\Index' => $baseDir . '/../lib/Command/Index.php',
24-
'OCA\\WorkflowEngine\\Controller\\AWorkflowController' => $baseDir . '/../lib/Controller/AWorkflowController.php',
24+
'OCA\\WorkflowEngine\\Controller\\AWorkflowOCSController' => $baseDir . '/../lib/Controller/AWorkflowOCSController.php',
2525
'OCA\\WorkflowEngine\\Controller\\GlobalWorkflowsController' => $baseDir . '/../lib/Controller/GlobalWorkflowsController.php',
2626
'OCA\\WorkflowEngine\\Controller\\RequestTimeController' => $baseDir . '/../lib/Controller/RequestTimeController.php',
2727
'OCA\\WorkflowEngine\\Controller\\UserWorkflowsController' => $baseDir . '/../lib/Controller/UserWorkflowsController.php',
@@ -33,6 +33,7 @@
3333
'OCA\\WorkflowEngine\\Migration\\PopulateNewlyIntroducedDatabaseFields' => $baseDir . '/../lib/Migration/PopulateNewlyIntroducedDatabaseFields.php',
3434
'OCA\\WorkflowEngine\\Migration\\Version2000Date20190808074233' => $baseDir . '/../lib/Migration/Version2000Date20190808074233.php',
3535
'OCA\\WorkflowEngine\\Migration\\Version2200Date20210805101925' => $baseDir . '/../lib/Migration/Version2200Date20210805101925.php',
36+
'OCA\\WorkflowEngine\\ResponseDefinitions' => $baseDir . '/../lib/ResponseDefinitions.php',
3637
'OCA\\WorkflowEngine\\Service\\Logger' => $baseDir . '/../lib/Service/Logger.php',
3738
'OCA\\WorkflowEngine\\Service\\RuleMatcher' => $baseDir . '/../lib/Service/RuleMatcher.php',
3839
'OCA\\WorkflowEngine\\Settings\\ASettings' => $baseDir . '/../lib/Settings/ASettings.php',

apps/workflowengine/composer/composer/autoload_static.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class ComposerStaticInitWorkflowEngine
3636
'OCA\\WorkflowEngine\\Check\\TFileCheck' => __DIR__ . '/..' . '/../lib/Check/TFileCheck.php',
3737
'OCA\\WorkflowEngine\\Check\\UserGroupMembership' => __DIR__ . '/..' . '/../lib/Check/UserGroupMembership.php',
3838
'OCA\\WorkflowEngine\\Command\\Index' => __DIR__ . '/..' . '/../lib/Command/Index.php',
39-
'OCA\\WorkflowEngine\\Controller\\AWorkflowController' => __DIR__ . '/..' . '/../lib/Controller/AWorkflowController.php',
39+
'OCA\\WorkflowEngine\\Controller\\AWorkflowOCSController' => __DIR__ . '/..' . '/../lib/Controller/AWorkflowOCSController.php',
4040
'OCA\\WorkflowEngine\\Controller\\GlobalWorkflowsController' => __DIR__ . '/..' . '/../lib/Controller/GlobalWorkflowsController.php',
4141
'OCA\\WorkflowEngine\\Controller\\RequestTimeController' => __DIR__ . '/..' . '/../lib/Controller/RequestTimeController.php',
4242
'OCA\\WorkflowEngine\\Controller\\UserWorkflowsController' => __DIR__ . '/..' . '/../lib/Controller/UserWorkflowsController.php',
@@ -48,6 +48,7 @@ class ComposerStaticInitWorkflowEngine
4848
'OCA\\WorkflowEngine\\Migration\\PopulateNewlyIntroducedDatabaseFields' => __DIR__ . '/..' . '/../lib/Migration/PopulateNewlyIntroducedDatabaseFields.php',
4949
'OCA\\WorkflowEngine\\Migration\\Version2000Date20190808074233' => __DIR__ . '/..' . '/../lib/Migration/Version2000Date20190808074233.php',
5050
'OCA\\WorkflowEngine\\Migration\\Version2200Date20210805101925' => __DIR__ . '/..' . '/../lib/Migration/Version2200Date20210805101925.php',
51+
'OCA\\WorkflowEngine\\ResponseDefinitions' => __DIR__ . '/..' . '/../lib/ResponseDefinitions.php',
5152
'OCA\\WorkflowEngine\\Service\\Logger' => __DIR__ . '/..' . '/../lib/Service/Logger.php',
5253
'OCA\\WorkflowEngine\\Service\\RuleMatcher' => __DIR__ . '/..' . '/../lib/Service/RuleMatcher.php',
5354
'OCA\\WorkflowEngine\\Settings\\ASettings' => __DIR__ . '/..' . '/../lib/Settings/ASettings.php',

apps/workflowengine/lib/Controller/AWorkflowController.php renamed to apps/workflowengine/lib/Controller/AWorkflowOCSController.php

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,25 @@
1111
use Doctrine\DBAL\Exception;
1212
use OCA\WorkflowEngine\Helper\ScopeContext;
1313
use OCA\WorkflowEngine\Manager;
14+
use OCA\WorkflowEngine\ResponseDefinitions;
15+
use OCP\AppFramework\Http;
1416
use OCP\AppFramework\Http\Attribute\PasswordConfirmationRequired;
1517
use OCP\AppFramework\Http\DataResponse;
1618
use OCP\AppFramework\OCS\OCSBadRequestException;
1719
use OCP\AppFramework\OCS\OCSException;
1820
use OCP\AppFramework\OCS\OCSForbiddenException;
1921
use OCP\AppFramework\OCSController;
2022
use OCP\IRequest;
23+
use OCP\WorkflowEngine\IEntityEvent;
24+
use OCP\WorkflowEngine\IOperation;
2125
use Psr\Log\LoggerInterface;
2226

23-
abstract class AWorkflowController extends OCSController {
27+
/**
28+
* @psalm-import-type WorkflowEngineOperator from ResponseDefinitions
29+
* @psalm-import-type WorkflowEngineCheck from ResponseDefinitions
30+
* @psalm-import-type WorkflowEngineRule from ResponseDefinitions
31+
*/
32+
abstract class AWorkflowOCSController extends OCSController {
2433

2534
public function __construct(
2635
$appName,
@@ -37,9 +46,11 @@ public function __construct(
3746
abstract protected function getScopeContext(): ScopeContext;
3847

3948
/**
40-
* Example: curl -u joann -H "OCS-APIREQUEST: true" "http://my.nc.srvr/ocs/v2.php/apps/workflowengine/api/v1/workflows/global?format=json"
49+
* Retrieve all configured workflow rules
4150
*
42-
* @throws OCSForbiddenException
51+
* @return DataResponse<Http::STATUS_OK, array<class-string<IOperation>, list<WorkflowEngineRule>>, array{}>
52+
*
53+
* 200: List of workflows returned
4354
*/
4455
public function index(): DataResponse {
4556
$operationsByClass = $this->manager->getAllOperations($this->getScopeContext());
@@ -54,9 +65,12 @@ public function index(): DataResponse {
5465
}
5566

5667
/**
57-
* Example: curl -u joann -H "OCS-APIREQUEST: true" "http://my.nc.srvr/ocs/v2.php/apps/workflowengine/api/v1/workflows/global/OCA\\Workflow_DocToPdf\\Operation?format=json"
68+
* Retrieve a specific workflow
5869
*
59-
* @throws OCSForbiddenException
70+
* @param string $id Workflow ID to load
71+
* @return DataResponse<Http::STATUS_OK, WorkflowEngineRule|list<empty>, array{}>
72+
*
73+
* 200: Workflow returned or empty array if the ID is unknown in the scope
6074
*/
6175
public function show(string $id): DataResponse {
6276
$context = $this->getScopeContext();
@@ -72,9 +86,19 @@ public function show(string $id): DataResponse {
7286
}
7387

7488
/**
75-
* @throws OCSBadRequestException
76-
* @throws OCSForbiddenException
77-
* @throws OCSException
89+
* Create a workflow
90+
*
91+
* @param class-string<IOperation> $class Operation class to execute
92+
* @param string $name Name of the workflow rule
93+
* @param list<WorkflowEngineCheck> $checks List of conditions that need to apply for the rule to match
94+
* @param string $operation Operation class to execute on match
95+
* @param string $entity The matched entity
96+
* @param list<class-string<IEntityEvent>> $events The list of events on which the rule should be validated
97+
* @return DataResponse<Http::STATUS_OK, WorkflowEngineRule, array{}>
98+
*
99+
* 200: Workflow created
100+
*
101+
* @throws OCSBadRequestException Thrown when a check or check value is invalid
78102
*/
79103
#[PasswordConfirmationRequired]
80104
public function create(
@@ -101,9 +125,20 @@ public function create(
101125
}
102126

103127
/**
104-
* @throws OCSBadRequestException
105-
* @throws OCSForbiddenException
106-
* @throws OCSException
128+
* Modify a workflow
129+
*
130+
* @param int $id Workflow ID to delete
131+
* @param string $name Name of the workflow rule
132+
* @param list<WorkflowEngineCheck> $checks List of conditions that need to apply for the rule to match
133+
* @param string $operation Operation action to execute on match
134+
* @param string $entity The matched entity
135+
* @param list<class-string<IEntityEvent>> $events The list of events on which the rule should be validated
136+
* @return DataResponse<Http::STATUS_OK, WorkflowEngineRule, array{}>
137+
*
138+
* 200: Workflow updated
139+
*
140+
* @throws OCSBadRequestException Thrown when a check or check value is invalid
141+
* @throws OCSForbiddenException Thrown when workflow is from a different scope
107142
*/
108143
#[PasswordConfirmationRequired]
109144
public function update(
@@ -130,9 +165,14 @@ public function update(
130165
}
131166

132167
/**
133-
* @throws OCSBadRequestException
134-
* @throws OCSForbiddenException
135-
* @throws OCSException
168+
* Delete a workflow
169+
*
170+
* @param int $id Workflow ID to delete
171+
* @return DataResponse<Http::STATUS_OK, bool, array{}>|DataResponse<Http::STATUS_FORBIDDEN, list<empty>, array{}>
172+
*
173+
* 200: Workflow deleted
174+
*
175+
* @throws OCSForbiddenException Thrown when workflow is from a different scope
136176
*/
137177
#[PasswordConfirmationRequired]
138178
public function destroy(int $id): DataResponse {

apps/workflowengine/lib/Controller/GlobalWorkflowsController.php

Lines changed: 98 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,109 @@
99
namespace OCA\WorkflowEngine\Controller;
1010

1111
use OCA\WorkflowEngine\Helper\ScopeContext;
12+
use OCA\WorkflowEngine\ResponseDefinitions;
13+
use OCP\AppFramework\Http;
14+
use OCP\AppFramework\Http\Attribute\ApiRoute;
15+
use OCP\AppFramework\Http\Attribute\PasswordConfirmationRequired;
16+
use OCP\AppFramework\Http\DataResponse;
17+
use OCP\AppFramework\OCS\OCSBadRequestException;
18+
use OCP\AppFramework\OCS\OCSForbiddenException;
19+
use OCP\WorkflowEngine\IEntityEvent;
1220
use OCP\WorkflowEngine\IManager;
21+
use OCP\WorkflowEngine\IOperation;
1322

14-
class GlobalWorkflowsController extends AWorkflowController {
23+
/**
24+
* @psalm-import-type WorkflowEngineCheck from ResponseDefinitions
25+
* @psalm-import-type WorkflowEngineRule from ResponseDefinitions
26+
*/
27+
class GlobalWorkflowsController extends AWorkflowOCSController {
1528

1629
private ?ScopeContext $scopeContext = null;
1730

31+
/**
32+
* Retrieve all configured workflow rules
33+
*
34+
* @return DataResponse<Http::STATUS_OK, array<class-string<IOperation>, list<WorkflowEngineRule>>, array{}>
35+
*
36+
* 200: List of workflows returned
37+
*/
38+
#[ApiRoute(verb: 'GET', url: '/api/v1/workflows/global')]
39+
public function index(): DataResponse {
40+
return parent::index();
41+
}
42+
43+
/**
44+
* Retrieve a specific workflow
45+
*
46+
* @param string $id Workflow ID to load
47+
* @return DataResponse<Http::STATUS_OK, WorkflowEngineRule|list<empty>, array{}>
48+
*
49+
* 200: Workflow returned or empty array if the ID is unknown in the scope
50+
*/
51+
#[ApiRoute(verb: 'GET', url: '/api/v1/workflows/global/{id}')]
52+
public function show(string $id): DataResponse {
53+
return parent::show($id);
54+
}
55+
56+
/**
57+
* Create a workflow
58+
*
59+
* @param class-string<IOperation> $class Operation class to execute
60+
* @param string $name Name of the workflow rule
61+
* @param list<WorkflowEngineCheck> $checks List of conditions that need to apply for the rule to match
62+
* @param string $operation Operation class to execute on match
63+
* @param string $entity The matched entity
64+
* @param list<class-string<IEntityEvent>> $events The list of events on which the rule should be validated
65+
* @return DataResponse<Http::STATUS_OK, WorkflowEngineRule, array{}>
66+
*
67+
* 200: Workflow created
68+
*
69+
* @throws OCSBadRequestException Thrown when a check or check value is invalid
70+
*/
71+
#[PasswordConfirmationRequired]
72+
#[ApiRoute(verb: 'POST', url: '/api/v1/workflows/global')]
73+
public function create(string $class, string $name, array $checks, string $operation, string $entity, array $events): DataResponse {
74+
return parent::create($class, $name, $checks, $operation, $entity, $events);
75+
}
76+
77+
/**
78+
* Modify a workflow
79+
*
80+
* @param int $id Workflow ID to delete
81+
* @param string $name Name of the workflow rule
82+
* @param list<WorkflowEngineCheck> $checks List of conditions that need to apply for the rule to match
83+
* @param string $operation Operation action to execute on match
84+
* @param string $entity The matched entity
85+
* @param list<class-string<IEntityEvent>> $events The list of events on which the rule should be validated
86+
* @return DataResponse<Http::STATUS_OK, WorkflowEngineRule, array{}>
87+
*
88+
* 200: Workflow updated
89+
*
90+
* @throws OCSBadRequestException Thrown when a check or check value is invalid
91+
* @throws OCSForbiddenException Thrown when workflow is from a different scope
92+
*/
93+
#[PasswordConfirmationRequired]
94+
#[ApiRoute(verb: 'PUT', url: '/api/v1/workflows/global/{id}')]
95+
public function update(int $id, string $name, array $checks, string $operation, string $entity, array $events): DataResponse {
96+
return parent::update($id, $name, $checks, $operation, $entity, $events);
97+
}
98+
99+
/**
100+
* Delete a workflow
101+
*
102+
* @param int $id Workflow ID to delete
103+
* @return DataResponse<Http::STATUS_OK, bool, array{}>|DataResponse<Http::STATUS_FORBIDDEN, list<empty>, array{}>
104+
*
105+
* 200: Workflow deleted
106+
*
107+
* @throws OCSForbiddenException Thrown when workflow is from a different scope
108+
*/
109+
#[PasswordConfirmationRequired]
110+
#[ApiRoute(verb: 'DELETE', url: '/api/v1/workflows/global/{id}')]
111+
public function destroy(int $id): DataResponse {
112+
return parent::destroy($id);
113+
}
114+
18115
protected function getScopeContext(): ScopeContext {
19116
if ($this->scopeContext === null) {
20117
$this->scopeContext = new ScopeContext(IManager::SCOPE_ADMIN);

apps/workflowengine/lib/Controller/RequestTimeController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
namespace OCA\WorkflowEngine\Controller;
88

99
use OCP\AppFramework\Controller;
10+
use OCP\AppFramework\Http\Attribute\FrontpageRoute;
1011
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
1112
use OCP\AppFramework\Http\JSONResponse;
1213

@@ -17,6 +18,7 @@ class RequestTimeController extends Controller {
1718
* @return JSONResponse
1819
*/
1920
#[NoAdminRequired]
21+
#[FrontpageRoute(verb: 'GET', url: '/timezones')]
2022
public function getTimezones($search = '') {
2123
$timezones = \DateTimeZone::listIdentifiers();
2224

0 commit comments

Comments
 (0)