Skip to content

Commit d7529d3

Browse files
committed
draft project/services api
1 parent 315de3a commit d7529d3

File tree

3 files changed

+162
-3
lines changed

3 files changed

+162
-3
lines changed

api/specs/web-server/_projects_nodes.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
# pylint: disable=too-many-arguments
55

66

7-
from _common import assert_handler_signature_against_model
8-
from fastapi import APIRouter, status
7+
from typing import Annotated
8+
9+
from _common import as_query, assert_handler_signature_against_model
10+
from fastapi import APIRouter, Depends, status
911
from models_library.api_schemas_directorv2.dynamic_services import DynamicServiceGet
1012
from models_library.api_schemas_long_running_tasks.tasks import TaskGet
1113
from models_library.api_schemas_webserver.projects_nodes import (
@@ -18,12 +20,14 @@
1820
NodePatch,
1921
NodeRetrieve,
2022
NodeRetrieved,
23+
ProjectNodeServicesGet,
2124
ServiceResourcesDict,
2225
)
2326
from models_library.generics import Envelope
2427
from models_library.groups import GroupID
2528
from models_library.projects import ProjectID
2629
from models_library.projects_nodes_io import NodeID
30+
from models_library.rest_pagination import Page, PageQueryParameters
2731
from simcore_service_webserver._meta import API_VTAG
2832
from simcore_service_webserver.projects._crud_handlers import ProjectPathParams
2933
from simcore_service_webserver.projects._nodes_handlers import (
@@ -156,6 +160,24 @@ def replace_node_resources(
156160
#
157161

158162

163+
@router.get(
164+
"/projects/-/nodes/-/services",
165+
response_model=Page[ProjectNodeServicesGet],
166+
)
167+
async def list_projects_services(
168+
_query: Annotated[as_query(PageQueryParameters), Depends()]
169+
):
170+
"""Lists all services used in the user's projects **grouped by project**"""
171+
172+
173+
@router.get(
174+
"/projects/{project_id}/nodes/-/services",
175+
response_model=Envelope[ProjectNodeServicesGet],
176+
)
177+
async def get_project_services(project_id: ProjectID):
178+
...
179+
180+
159181
@router.get(
160182
"/projects/{project_id}/nodes/-/services:access",
161183
response_model=Envelope[_ProjectGroupAccess],

packages/models-library/src/models_library/api_schemas_webserver/projects_nodes.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
# mypy: disable-error-code=truthy-function
22
from typing import Annotated, Any, Literal, TypeAlias
33

4+
from models_library.groups import GroupID
5+
from models_library.projects import ProjectID
6+
from models_library.services_history import ServiceRelease
47
from pydantic import ConfigDict, Field
58

9+
from ..access_rights import AccessRights
610
from ..api_schemas_directorv2.dynamic_services import RetrieveDataOut
711
from ..basic_types import PortInt
812
from ..projects_nodes import InputID, InputsDict, PartialNode
@@ -40,7 +44,7 @@ class NodePatch(InputSchemaWithoutCamelCase):
4044
]
4145
inputs_required: Annotated[
4246
list[InputID] | None,
43-
Field(alias="inputsRequired"),
47+
Field(alias="inputsRequired"),
4448
] = None
4549
input_nodes: Annotated[
4650
list[NodeID] | None,
@@ -197,3 +201,15 @@ class NodeRetrieve(InputSchemaWithoutCamelCase):
197201

198202
class NodeRetrieved(RetrieveDataOut):
199203
model_config = OutputSchema.model_config
204+
205+
206+
class NodeServiceGet(OutputSchema):
207+
key: ServiceKey
208+
release: ServiceRelease
209+
owner: GroupID
210+
my_access_rights: AccessRights
211+
212+
213+
class ProjectNodeServicesGet(OutputSchema):
214+
project_uuid: ProjectID
215+
services: list[NodeServiceGet]

services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4927,6 +4927,58 @@ paths:
49274927
application/json:
49284928
schema:
49294929
$ref: '#/components/schemas/Envelope_dict_Annotated_str__StringConstraints___ImageResources__'
4930+
/v0/projects/-/nodes/-/services:
4931+
get:
4932+
tags:
4933+
- projects
4934+
- nodes
4935+
summary: List Projects Services
4936+
description: Lists all services used in the user's projects **grouped by project**
4937+
operationId: list_projects_services
4938+
parameters:
4939+
- name: limit
4940+
in: query
4941+
required: false
4942+
schema:
4943+
type: integer
4944+
default: 20
4945+
title: Limit
4946+
- name: offset
4947+
in: query
4948+
required: false
4949+
schema:
4950+
type: integer
4951+
default: 0
4952+
title: Offset
4953+
responses:
4954+
'200':
4955+
description: Successful Response
4956+
content:
4957+
application/json:
4958+
schema:
4959+
$ref: '#/components/schemas/Page_ProjectNodeServicesGet_'
4960+
/v0/projects/{project_id}/nodes/-/services:
4961+
get:
4962+
tags:
4963+
- projects
4964+
- nodes
4965+
summary: Get Project Services
4966+
operationId: get_project_services
4967+
parameters:
4968+
- name: project_id
4969+
in: path
4970+
required: true
4971+
schema:
4972+
type: string
4973+
format: uuid
4974+
title: Project Id
4975+
responses:
4976+
'200':
4977+
description: Successful Response
4978+
content:
4979+
application/json:
4980+
schema:
4981+
$ref: '#/components/schemas/Envelope_ProjectNodeServicesGet_'
49304982
/v0/projects/{project_id}/nodes/-/services:access:
49314983
get:
49324984
tags:
@@ -9104,6 +9156,19 @@ components:
91049156
title: Error
91059157
type: object
91069158
title: Envelope[ProjectMetadataGet]
9159+
Envelope_ProjectNodeServicesGet_:
9160+
properties:
9161+
data:
9162+
anyOf:
9163+
- $ref: '#/components/schemas/ProjectNodeServicesGet'
9164+
- type: 'null'
9165+
error:
9166+
anyOf:
9167+
- {}
9168+
- type: 'null'
9169+
title: Error
9170+
type: object
9171+
title: Envelope[ProjectNodeServicesGet]
91079172
Envelope_ProjectState_:
91089173
properties:
91099174
data:
@@ -12059,6 +12124,28 @@ components:
1205912124
- thumbnail_url
1206012125
- file_url
1206112126
title: NodeScreenshot
12127+
NodeServiceGet:
12128+
properties:
12129+
key:
12130+
type: string
12131+
pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$
12132+
title: Key
12133+
release:
12134+
$ref: '#/components/schemas/ServiceRelease'
12135+
owner:
12136+
type: integer
12137+
exclusiveMinimum: true
12138+
title: Owner
12139+
minimum: 0
12140+
myAccessRights:
12141+
$ref: '#/components/schemas/AccessRights'
12142+
type: object
12143+
required:
12144+
- key
12145+
- release
12146+
- owner
12147+
- myAccessRights
12148+
title: NodeServiceGet
1206212149
NodeState:
1206312150
properties:
1206412151
modified:
@@ -12349,6 +12436,24 @@ components:
1234912436
- _links
1235012437
- data
1235112438
title: Page[ProjectListItem]
12439+
Page_ProjectNodeServicesGet_:
12440+
properties:
12441+
_meta:
12442+
$ref: '#/components/schemas/PageMetaInfoLimitOffset'
12443+
_links:
12444+
$ref: '#/components/schemas/PageLinks'
12445+
data:
12446+
items:
12447+
$ref: '#/components/schemas/ProjectNodeServicesGet'
12448+
type: array
12449+
title: Data
12450+
additionalProperties: false
12451+
type: object
12452+
required:
12453+
- _meta
12454+
- _links
12455+
- data
12456+
title: Page[ProjectNodeServicesGet]
1235212457
Page_ServiceRunGet_:
1235312458
properties:
1235412459
_meta:
@@ -13546,6 +13651,22 @@ components:
1354613651
required:
1354713652
- custom
1354813653
title: ProjectMetadataUpdate
13654+
ProjectNodeServicesGet:
13655+
properties:
13656+
projectUuid:
13657+
type: string
13658+
format: uuid
13659+
title: Projectuuid
13660+
services:
13661+
items:
13662+
$ref: '#/components/schemas/NodeServiceGet'
13663+
type: array
13664+
title: Services
13665+
type: object
13666+
required:
13667+
- projectUuid
13668+
- services
13669+
title: ProjectNodeServicesGet
1354913670
ProjectOutputGet:
1355013671
properties:
1355113672
key:

0 commit comments

Comments
 (0)