11import logging
22import uuid
3- from collections import deque
43from functools import lru_cache
54
6- import sqlalchemy as sa
75from aiohttp import web
8- from models_library .services import ServiceVersion
96from models_library .utils .pydantic_tools_extension import parse_obj_or_none
10- from pydantic import ByteSize , TypeAdapter , ValidationError
7+ from pydantic import ByteSize
118from servicelib .logging_utils import log_decorator
12- from simcore_postgres_database .models .services_consume_filetypes import (
13- services_consume_filetypes ,
14- )
15- from sqlalchemy .dialects .postgresql import ARRAY , INTEGER
169
17- from ..db .plugin import get_database_engine_legacy
1810from ._errors import FileToLargeError , IncompatibleServiceError
1911from ._models import ViewerInfo
12+ from ._repository import StudiesDispatcherRepository
2013from .settings import get_plugin_settings
2114
2215_BASE_UUID = uuid .UUID ("ca2144da-eabb-4daf-a1df-a3682050e25f" )
@@ -34,39 +27,8 @@ def compose_uuid_from(*values) -> uuid.UUID:
3427async def list_viewers_info (
3528 app : web .Application , file_type : str | None = None , * , only_default : bool = False
3629) -> list [ViewerInfo ]:
37- #
38- # TODO: These services MUST be shared with EVERYBODY! Setup check on startup and fill
39- # with !?
40- #
41- consumers : deque = deque ()
42-
43- async with get_database_engine_legacy (app ).acquire () as conn :
44- # FIXME: ADD CONDITION: service MUST be shared with EVERYBODY!
45- query = services_consume_filetypes .select ()
46- if file_type :
47- query = query .where (services_consume_filetypes .c .filetype == file_type )
48-
49- query = query .order_by ("filetype" , "preference_order" )
50-
51- if file_type and only_default :
52- query = query .limit (1 )
53-
54- _logger .debug ("Listing viewers:\n %s" , query )
55-
56- listed_filetype = set ()
57- async for row in await conn .execute (query ):
58- try :
59- # TODO: filter in database (see test_list_default_compatible_services )
60- if only_default and row ["filetype" ] in listed_filetype :
61- continue
62- listed_filetype .add (row ["filetype" ])
63- consumer = ViewerInfo .create_from_db (row )
64- consumers .append (consumer )
65-
66- except ValidationError as err :
67- _logger .warning ("Review invalid service metadata %s: %s" , row , err )
68-
69- return list (consumers )
30+ repo = StudiesDispatcherRepository .create_from_app (app )
31+ return await repo .list_viewers_info (file_type = file_type , only_default = only_default )
7032
7133
7234async def get_default_viewer (
@@ -80,11 +42,11 @@ async def get_default_viewer(
8042 IncompatibleService
8143 FileToLarge
8244 """
83- try :
84- viewers = await list_viewers_info ( app , file_type , only_default = True )
85- viewer = viewers [ 0 ]
86- except IndexError as err :
87- raise IncompatibleServiceError (file_type = file_type ) from err
45+ repo = StudiesDispatcherRepository . create_from_app ( app )
46+ viewer = await repo . get_default_viewer_for_filetype ( file_type = file_type )
47+
48+ if viewer is None :
49+ raise IncompatibleServiceError (file_type = file_type )
8850
8951 if current_size := parse_obj_or_none (ByteSize , file_size ):
9052 max_size : ByteSize = get_plugin_settings (app ).STUDIES_MAX_FILE_SIZE_ALLOWED
@@ -108,38 +70,18 @@ async def validate_requested_viewer(
10870 IncompatibleService: When there is no match
10971
11072 """
111-
112- def _version (column_or_value ):
113- # converts version value string to array[integer] that can be compared
114- return sa .func .string_to_array (column_or_value , "." ).cast (ARRAY (INTEGER ))
115-
11673 if not service_key and not service_version :
11774 return await get_default_viewer (app , file_type , file_size )
11875
11976 if service_key and service_version :
120- async with get_database_engine_legacy (app ).acquire () as conn :
121- query = (
122- services_consume_filetypes .select ()
123- .where (
124- (services_consume_filetypes .c .filetype == file_type )
125- & (services_consume_filetypes .c .service_key == service_key )
126- & (
127- _version (services_consume_filetypes .c .service_version )
128- <= _version (service_version )
129- )
130- )
131- .order_by (_version (services_consume_filetypes .c .service_version ).desc ())
132- .limit (1 )
133- )
134-
135- result = await conn .execute (query )
136- row = await result .first ()
137- if row :
138- view = ViewerInfo .create_from_db (row )
139- view .version = TypeAdapter (ServiceVersion ).validate_python (
140- service_version
141- )
142- return view
77+ repo = StudiesDispatcherRepository .create_from_app (app )
78+ viewer = await repo .find_compatible_viewer (
79+ file_type = file_type ,
80+ service_key = service_key ,
81+ service_version = service_version ,
82+ )
83+ if viewer :
84+ return viewer
14385
14486 raise IncompatibleServiceError (file_type = file_type )
14587
0 commit comments