Skip to content

Commit f405d28

Browse files
committed
draft project/services api
1 parent 2472861 commit f405d28

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
@@ -4963,6 +4963,58 @@ paths:
49634963
application/json:
49644964
schema:
49654965
$ref: '#/components/schemas/Envelope_dict_Annotated_str__StringConstraints___ImageResources__'
4966+
/v0/projects/-/nodes/-/services:
4967+
get:
4968+
tags:
4969+
- projects
4970+
- nodes
4971+
summary: List Projects Services
4972+
description: Lists all services used in the user's projects **grouped by project**
4973+
operationId: list_projects_services
4974+
parameters:
4975+
- name: limit
4976+
in: query
4977+
required: false
4978+
schema:
4979+
type: integer
4980+
default: 20
4981+
title: Limit
4982+
- name: offset
4983+
in: query
4984+
required: false
4985+
schema:
4986+
type: integer
4987+
default: 0
4988+
title: Offset
4989+
responses:
4990+
'200':
4991+
description: Successful Response
4992+
content:
4993+
application/json:
4994+
schema:
4995+
$ref: '#/components/schemas/Page_ProjectNodeServicesGet_'
4996+
/v0/projects/{project_id}/nodes/-/services:
4997+
get:
4998+
tags:
4999+
- projects
5000+
- nodes
5001+
summary: Get Project Services
5002+
operationId: get_project_services
5003+
parameters:
5004+
- name: project_id
5005+
in: path
5006+
required: true
5007+
schema:
5008+
type: string
5009+
format: uuid
5010+
title: Project Id
5011+
responses:
5012+
'200':
5013+
description: Successful Response
5014+
content:
5015+
application/json:
5016+
schema:
5017+
$ref: '#/components/schemas/Envelope_ProjectNodeServicesGet_'
49665018
/v0/projects/{project_id}/nodes/-/services:access:
49675019
get:
49685020
tags:
@@ -9113,6 +9165,19 @@ components:
91139165
title: Error
91149166
type: object
91159167
title: Envelope[ProjectMetadataGet]
9168+
Envelope_ProjectNodeServicesGet_:
9169+
properties:
9170+
data:
9171+
anyOf:
9172+
- $ref: '#/components/schemas/ProjectNodeServicesGet'
9173+
- type: 'null'
9174+
error:
9175+
anyOf:
9176+
- {}
9177+
- type: 'null'
9178+
title: Error
9179+
type: object
9180+
title: Envelope[ProjectNodeServicesGet]
91169181
Envelope_ProjectState_:
91179182
properties:
91189183
data:
@@ -12110,6 +12175,28 @@ components:
1211012175
- thumbnail_url
1211112176
- file_url
1211212177
title: NodeScreenshot
12178+
NodeServiceGet:
12179+
properties:
12180+
key:
12181+
type: string
12182+
pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$
12183+
title: Key
12184+
release:
12185+
$ref: '#/components/schemas/ServiceRelease'
12186+
owner:
12187+
type: integer
12188+
exclusiveMinimum: true
12189+
title: Owner
12190+
minimum: 0
12191+
myAccessRights:
12192+
$ref: '#/components/schemas/AccessRights'
12193+
type: object
12194+
required:
12195+
- key
12196+
- release
12197+
- owner
12198+
- myAccessRights
12199+
title: NodeServiceGet
1211312200
NodeState:
1211412201
properties:
1211512202
modified:
@@ -12400,6 +12487,24 @@ components:
1240012487
- _links
1240112488
- data
1240212489
title: Page[ProjectListItem]
12490+
Page_ProjectNodeServicesGet_:
12491+
properties:
12492+
_meta:
12493+
$ref: '#/components/schemas/PageMetaInfoLimitOffset'
12494+
_links:
12495+
$ref: '#/components/schemas/PageLinks'
12496+
data:
12497+
items:
12498+
$ref: '#/components/schemas/ProjectNodeServicesGet'
12499+
type: array
12500+
title: Data
12501+
additionalProperties: false
12502+
type: object
12503+
required:
12504+
- _meta
12505+
- _links
12506+
- data
12507+
title: Page[ProjectNodeServicesGet]
1240312508
Page_ServiceRunGet_:
1240412509
properties:
1240512510
_meta:
@@ -13582,6 +13687,22 @@ components:
1358213687
required:
1358313688
- custom
1358413689
title: ProjectMetadataUpdate
13690+
ProjectNodeServicesGet:
13691+
properties:
13692+
projectUuid:
13693+
type: string
13694+
format: uuid
13695+
title: Projectuuid
13696+
services:
13697+
items:
13698+
$ref: '#/components/schemas/NodeServiceGet'
13699+
type: array
13700+
title: Services
13701+
type: object
13702+
required:
13703+
- projectUuid
13704+
- services
13705+
title: ProjectNodeServicesGet
1358513706
ProjectOutputGet:
1358613707
properties:
1358713708
key:

0 commit comments

Comments
 (0)