from enum import Enum
import os
from typing import Optional, Callable, TypeVar, Union, Any
T = TypeVar('T')
[docs]
class MessageStatus(Enum):
"""Enum for message status values."""
SUCCESS = "success"
ERROR = "error"
[docs]
class HTTPStatus(Enum):
"""Enum for standard HTTP status codes."""
BAD_REQUEST = 400
INTERNAL_SERVER_ERROR = 500
OK = 200
#TODO these should come from env vars with defaults
[docs]
class HTTPResponse(Enum):
"""Enum for standard HTTP response messages."""
STATUS = "status"
DETAILS = "details"
[docs]
class ConfigurableEnum(Enum):
[docs]
@classmethod
def get_env_value(cls, env_var: str, default_method: Optional[Callable[[], str]] = None, static_default: Optional[str] = None) -> Optional[str]:
"""
Generic method to get values from environment with fallbacks
Parameters
----------
env_var : str
The environment variable name to look up
default_method : callable, optional
A method that returns a default value if provided
static_default : str, optional
A static default value to use if the environment variable is not set and no default_method is provided
Returns
-------
str
The value from the environment variable or a default value
"""
if default_method:
return os.environ.get(env_var, default_method())
return os.environ.get(env_var, static_default)
[docs]
class ProjectId(ConfigurableEnum):
"""Enum for project IDs."""
TEST_ENVIRONMENT = "zipbio-cloud-test-1"
PROD_ENVIRONMENT = "zipbio-research"
INTEGRATION_TEST_ENVIRONMENT = "test-project"
[docs]
@classmethod
def infer_default_environment(cls) -> str:
"""
Infer the default environment based on environment variables.
Returns
-------
str
The default environment project ID.
"""
if os.environ.get("INTEGRATION_TEST_MODE", "false").lower() == "true":
return cls.INTEGRATION_TEST_ENVIRONMENT.value
return cls.TEST_ENVIRONMENT.value
[docs]
@classmethod
def current(cls) -> str:
result = cls.get_env_value("GCP_PROJECT_ID", cls.infer_default_environment)
if result is None:
# Fallback to test environment if no environment variable is set
return cls.TEST_ENVIRONMENT.value
return result
[docs]
class LocationId(Enum):
"""Enum for location IDs."""
US_CENTRAL1 = "us-central1"
CURRENT_LOCATION = os.environ.get("GCP_LOCATION_ID", "us-central1")
[docs]
class RedisInstanceId(Enum):
"""Enum for Redis instance IDs."""
TEST_REDIS_INSTANCE = "test-redis-instance"
PROD_REDIS_INSTANCE = "prod-redis-instance"
CURRENT_REDIS_INSTANCE = os.environ.get("REDIS_INSTANCE_ID", None)
[docs]
class SIORedisChannel(Enum):
"""Enum for SIO Redis channels."""
WEBSOCKET_CHANNEL = os.environ.get("WEBSOCKET_CHANNEL", None)
#HACK: these endpoints are hardcoded to the test project, and should be custom domain mappings instead
#TODO: create custom domain mappings and point to those as defaults
[docs]
class APIEndpoint(Enum):
"""Enum for API endpoints."""
BENCHLING_SERVICE_URL = os.environ.get("BENCHLING_SERVICE_URL", "https://benchling-editor-523495735651.us-central1.run.app")
METADATA_VALIDATOR_URL = os.environ.get("METADATA_VALIDATOR_URL", "https://get-schemas-523495735651.us-central1.run.app")
SCU_VALIDATOR_URL = os.environ.get("SCU_VALIDATOR_URL", "https://get-schemas-523495735651.us-central1.run.app")
MONDAY_SERVICE_URL = os.environ.get("MONDAY_SERVICE_URL", "https://monday-service-523495735651.us-central1.run.app")
JIRA_SERVICE_URL = os.environ.get("JIRA_SERVICE_URL", "https://get-jira-ticket-523495735651.us-central1.run.app")