Skip to content

[Improvement-18224][API] Migrate small-service Map<String,Object> returns to typed returns#18230

Open
ruanwenjun wants to merge 1 commit intoapache:devfrom
ruanwenjun:chore/api-small-services-typed-returns
Open

[Improvement-18224][API] Migrate small-service Map<String,Object> returns to typed returns#18230
ruanwenjun wants to merge 1 commit intoapache:devfrom
ruanwenjun:chore/api-small-services-typed-returns

Conversation

@ruanwenjun
Copy link
Copy Markdown
Member

Was this PR generated or assisted by AI?

YES, ops 4.7

Purpose of the pull request

Brief change log

Batch-migrate seven Map<String, Object> methods across five small services to typed return / void + ServiceException, with cascading updates to the controllers, PythonGateway and unit tests:

TenantService

  • queryByTenantCode(String): Tenant (nullable; only consumed by PythonGateway)

TaskGroupQueueService

  • queryTasksByGroupId(...): PageInfo

ProjectWorkerGroupRelationService

  • queryAssignedWorkerGroupsByProject(User, Long): List

UiPluginService

  • queryUiPluginsByType(PluginType): List
  • queryUiPluginDetailById(int): PluginDefine

EnvironmentWorkerGroupRelationService

  • queryEnvironmentWorkerGroupRelation(Long): List
  • queryAllEnvironmentWorkerGroupRelationList(): List

HTTP wire format is preserved:

  • Standard endpoints (TaskGroup, UiPlugin) now wrap the typed return in Result.success(data); ApiExceptionHandler converts ServiceException to the same Result(code, msg) shape that BaseController.returnDataList(map) produced.
  • The non-standard ProjectWorkerGroupController.queryAssignedWorkerGroups endpoint still returns a raw Map<String, Object>; the controller now builds the {STATUS, MSG, DATA_LIST} map from the typed service return so the JSON body remains byte-for-byte identical on success. Permission failures translate the legacy hasProjectAndPerm(Map) status into a ServiceException, so the error path now goes through ApiExceptionHandler (Result shape) instead of the raw Map.

Py4J boundary is preserved: PythonGateway.queryTenantByCode now returns the Tenant directly from the service (still null on miss, matching the previous behavior where DATA_LIST was unset).

ExecutorService.forceStartTaskInstance is intentionally deferred — its only caller is TaskGroupServiceImpl.forceStartTask, which itself returns Map<String, Object> and is part of the larger TaskGroupService migration. Migrating it now would require a temporary Map-rebuild in TaskGroupServiceImpl that the next PR would immediately undo.

Part of the migration series tracked by #18224.

Verify this pull request

This pull request is code cleanup without any test coverage.

(or)

This pull request is already covered by existing tests, such as (please describe tests).

(or)

This change added tests and can be verified as follows:

(or)

Pull Request Notice

Pull Request Notice

If your pull request contains incompatible change, you should also add it to docs/docs/en/guide/upgrade/incompatible.md

…urns to typed returns

Batch-migrate seven Map<String, Object> methods across five small services
to typed return / void + ServiceException, with cascading updates to the
controllers, PythonGateway and unit tests:

TenantService
- queryByTenantCode(String): Tenant (nullable; only consumed by PythonGateway)

TaskGroupQueueService
- queryTasksByGroupId(...): PageInfo<TaskGroupQueue>

ProjectWorkerGroupRelationService
- queryAssignedWorkerGroupsByProject(User, Long): List<ProjectWorkerGroup>

UiPluginService
- queryUiPluginsByType(PluginType): List<PluginDefine>
- queryUiPluginDetailById(int): PluginDefine

EnvironmentWorkerGroupRelationService
- queryEnvironmentWorkerGroupRelation(Long): List<EnvironmentWorkerGroupRelation>
- queryAllEnvironmentWorkerGroupRelationList(): List<EnvironmentWorkerGroupRelation>

HTTP wire format is preserved:
* Standard endpoints (TaskGroup, UiPlugin) now wrap the typed return in
  Result.success(data); ApiExceptionHandler converts ServiceException to
  the same Result(code, msg) shape that BaseController.returnDataList(map)
  produced.
* The non-standard ProjectWorkerGroupController.queryAssignedWorkerGroups
  endpoint still returns a raw Map<String, Object>; the controller now
  builds the {STATUS, MSG, DATA_LIST} map from the typed service return so
  the JSON body remains byte-for-byte identical on success. Permission
  failures translate the legacy hasProjectAndPerm(Map) status into a
  ServiceException, so the error path now goes through ApiExceptionHandler
  (Result shape) instead of the raw Map.

Py4J boundary is preserved: PythonGateway.queryTenantByCode now returns
the Tenant directly from the service (still null on miss, matching the
previous behavior where DATA_LIST was unset).

ExecutorService.forceStartTaskInstance is intentionally deferred — its
only caller is TaskGroupServiceImpl.forceStartTask, which itself returns
Map<String, Object> and is part of the larger TaskGroupService migration.
Migrating it now would require a temporary Map-rebuild in TaskGroupServiceImpl
that the next PR would immediately undo.

Part of the migration series tracked by apache#18224.

Map<String, Object> result = uiPluginService.queryUiPluginsByType(pluginType);
return returnDataList(result);
public Result<List<PluginDefine>> queryUiPluginsByType(@Parameter(hidden = true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser,

Map<String, Object> result = uiPluginService.queryUiPluginDetailById(pluginId);
return returnDataList(result);
public Result<PluginDefine> queryUiPluginDetailById(@Parameter(hidden = true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud Bot commented May 8, 2026

Quality Gate Failed Quality Gate failed

Failed conditions
0.0% Coverage on New Code (required ≥ 60%)

See analysis details on SonarQube Cloud

@ruanwenjun ruanwenjun added refactor improvement make more easy to user or prompt friendly labels May 8, 2026
@ruanwenjun ruanwenjun added this to the 3.4.2 milestone May 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backend improvement make more easy to user or prompt friendly refactor test

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants