|
2 | 2 |
|
3 | 3 | import asyncio |
4 | 4 | import logging |
5 | | -import urllib.parse |
6 | 5 | from typing import Annotated, Any, TypeAlias, cast |
7 | 6 |
|
8 | 7 | from aiocache import cached # type: ignore[import-untyped] |
9 | 8 | from fastapi import APIRouter, Depends, Header, HTTPException, status |
10 | | -from models_library.api_schemas_catalog.services import ServiceGet, ServiceUpdate |
11 | | -from models_library.services import ServiceKey, ServiceType, ServiceVersion |
| 9 | +from models_library.api_schemas_catalog.services import ServiceGet |
| 10 | +from models_library.services import ServiceType |
12 | 11 | from models_library.services_authoring import Author |
13 | 12 | from models_library.services_metadata_published import ServiceMetaDataPublished |
14 | 13 | from pydantic import ValidationError |
|
25 | 24 | from ...db.repositories.services import ServicesRepository |
26 | 25 | from ...models.services_db import ServiceAccessRightsAtDB, ServiceMetaDataAtDB |
27 | 26 | from ...services.director import DirectorApi |
28 | | -from ...services.function_services import is_function_service |
29 | 27 | from ..dependencies.database import get_repository |
30 | 28 | from ..dependencies.director import get_director_api |
31 | 29 | from ..dependencies.services import get_service_from_manifest |
@@ -266,121 +264,3 @@ async def get_service( |
266 | 264 | | service_in_db.model_dump(exclude_unset=True, exclude={"owner"}) |
267 | 265 | ) |
268 | 266 | return service_data |
269 | | - |
270 | | - |
271 | | -# @router.patch( |
272 | | -# "/{service_key:path}/{service_version}", |
273 | | -# response_model=ServiceGet, |
274 | | -# **RESPONSE_MODEL_POLICY, |
275 | | -# ) |
276 | | -async def update_service( |
277 | | - # pylint: disable=too-many-arguments |
278 | | - user_id: int, |
279 | | - service_key: ServiceKey, |
280 | | - service_version: ServiceVersion, |
281 | | - updated_service: ServiceUpdate, |
282 | | - director_client: Annotated[DirectorApi, Depends(get_director_api)], |
283 | | - groups_repository: Annotated[ |
284 | | - GroupsRepository, Depends(get_repository(GroupsRepository)) |
285 | | - ], |
286 | | - services_repo: Annotated[ |
287 | | - ServicesRepository, Depends(get_repository(ServicesRepository)) |
288 | | - ], |
289 | | - x_simcore_products_name: Annotated[str | None, Header()] = None, |
290 | | -): |
291 | | - if is_function_service(service_key): |
292 | | - # NOTE: this is a temporary decision after discussing with OM |
293 | | - raise HTTPException( |
294 | | - status_code=status.HTTP_403_FORBIDDEN, |
295 | | - detail="Cannot update front-end services", |
296 | | - ) |
297 | | - |
298 | | - # check the service exists |
299 | | - await director_client.get( |
300 | | - f"/services/{urllib.parse.quote_plus(service_key)}/{service_version}" |
301 | | - ) |
302 | | - # the director client already raises an exception if not found |
303 | | - |
304 | | - # get the user groups |
305 | | - user_groups = await groups_repository.list_user_groups(user_id) |
306 | | - if not user_groups: |
307 | | - # deny access |
308 | | - raise HTTPException( |
309 | | - status_code=status.HTTP_403_FORBIDDEN, |
310 | | - detail="You have unsufficient rights to access the service", |
311 | | - ) |
312 | | - # check the user has write access to this service |
313 | | - writable_service = await services_repo.get_service( |
314 | | - service_key, |
315 | | - service_version, |
316 | | - gids=[group.gid for group in user_groups], |
317 | | - write_access=True, |
318 | | - product_name=x_simcore_products_name, |
319 | | - ) |
320 | | - if not writable_service: |
321 | | - # deny access |
322 | | - raise HTTPException( |
323 | | - status_code=status.HTTP_403_FORBIDDEN, |
324 | | - detail="You have unsufficient rights to modify the service", |
325 | | - ) |
326 | | - |
327 | | - # let's modify the service then |
328 | | - await services_repo.update_service( |
329 | | - ServiceMetaDataAtDB( |
330 | | - key=service_key, |
331 | | - version=service_version, |
332 | | - **updated_service.model_dump(exclude_unset=True), |
333 | | - ) |
334 | | - ) |
335 | | - # let's modify the service access rights (they can be added/removed/modified) |
336 | | - current_gids_in_db = [ |
337 | | - r.gid |
338 | | - for r in await services_repo.get_service_access_rights( |
339 | | - service_key, service_version, product_name=x_simcore_products_name |
340 | | - ) |
341 | | - ] |
342 | | - |
343 | | - if updated_service.access_rights: |
344 | | - # start by updating/inserting new entries |
345 | | - assert x_simcore_products_name # nosec |
346 | | - new_access_rights = [ |
347 | | - ServiceAccessRightsAtDB( |
348 | | - key=service_key, |
349 | | - version=service_version, |
350 | | - gid=gid, |
351 | | - execute_access=rights.execute_access, |
352 | | - write_access=rights.write_access, |
353 | | - product_name=x_simcore_products_name, |
354 | | - ) |
355 | | - for gid, rights in updated_service.access_rights.items() |
356 | | - ] |
357 | | - await services_repo.upsert_service_access_rights(new_access_rights) |
358 | | - |
359 | | - # then delete the ones that were removed |
360 | | - removed_gids = [ |
361 | | - gid |
362 | | - for gid in current_gids_in_db |
363 | | - if gid not in updated_service.access_rights |
364 | | - ] |
365 | | - deleted_access_rights = [ |
366 | | - ServiceAccessRightsAtDB( |
367 | | - key=service_key, |
368 | | - version=service_version, |
369 | | - gid=gid, |
370 | | - product_name=x_simcore_products_name, |
371 | | - ) |
372 | | - for gid in removed_gids |
373 | | - ] |
374 | | - await services_repo.delete_service_access_rights(deleted_access_rights) |
375 | | - |
376 | | - # now return the service |
377 | | - assert x_simcore_products_name # nosec |
378 | | - return await get_service( |
379 | | - user_id=user_id, |
380 | | - service_in_manifest=await get_service_from_manifest( |
381 | | - service_key, service_version, director_client |
382 | | - ), |
383 | | - groups_repository=groups_repository, |
384 | | - services_repo=services_repo, |
385 | | - x_simcore_products_name=x_simcore_products_name, |
386 | | - ) |
0 commit comments