Coverage for heritrace / utils / primary_source_utils.py: 97%
32 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-07-02 10:16 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-07-02 10:16 +0000
1# SPDX-FileCopyrightText: 2025 Arcangelo Massari <arcangelo.massari@unibo.it>
2#
3# SPDX-License-Identifier: ISC
5from typing import TYPE_CHECKING, cast
7from flask import current_app
8from redis import RedisError
10from heritrace.utils.uri_utils import is_valid_url
12if TYPE_CHECKING:
13 from redis import Redis
15USER_DEFAULT_SOURCE_KEY = "user:{user_id}:default_primary_source"
18def get_user_default_primary_source(user_id: str) -> str | None:
19 """
20 Get the user's default primary source from Redis
22 Args:
23 user_id: The user's ID (e.g. ORCID)
25 Returns:
26 The user's default primary source or None if not set or error
27 """
28 user_default_source = None
29 if user_id:
30 key = USER_DEFAULT_SOURCE_KEY.format(user_id=user_id)
31 try:
32 redis_client: Redis = current_app.extensions["redis_client"] # type: ignore[type-arg]
33 user_default_source = cast("str | None", redis_client.get(key))
34 except RedisError:
35 current_app.logger.exception(
36 "Failed to get user default primary source from Redis"
37 )
38 user_default_source = None
40 return user_default_source
43def get_default_primary_source(user_id: str) -> str:
44 """
45 Get the default primary source to use, falling back to app config if user has none
47 Args:
48 user_id: The user's ID (e.g. ORCID)
50 Returns:
51 The primary source to use (user's default or app default)
52 """
53 user_default = get_user_default_primary_source(user_id)
54 return user_default or current_app.config["PRIMARY_SOURCE"]
57def save_user_default_primary_source(user_id: str, primary_source: str) -> bool | None:
58 """
59 Save the user's default primary source to Redis
61 Args:
62 user_id: The user's ID (e.g. ORCID)
63 primary_source: The URL to save as default primary source
65 Returns:
66 True if saved successfully, False otherwise
67 """
68 if not user_id or not primary_source or not is_valid_url(primary_source):
69 return False
71 key = USER_DEFAULT_SOURCE_KEY.format(user_id=user_id)
72 try:
73 redis_client: Redis = current_app.extensions["redis_client"] # type: ignore[type-arg]
74 redis_client.set(key, primary_source)
75 except RedisError:
76 current_app.logger.exception(
77 "Failed to save user default primary source to Redis"
78 )
79 return False
80 else:
81 return True