Skip to content

models

stac_fastapi.api.models

Api request/response models.

CollectionUri

Bases: APIRequest

Get or delete collection.

Source code in stac_fastapi/api/stac_fastapi/api/models.py
95
96
97
98
99
@attr.s
class CollectionUri(APIRequest):
    """Get or delete collection."""

    collection_id: Annotated[str, Path(description="Collection ID")] = attr.ib()

EmptyRequest

Bases: APIRequest

Empty request.

Source code in stac_fastapi/api/stac_fastapi/api/models.py
110
111
112
113
114
@attr.s
class EmptyRequest(APIRequest):
    """Empty request."""

    ...

GeoJSONResponse

Bases: JSONResponse

JSON with custom, vendor content-type.

Source code in stac_fastapi/api/stac_fastapi/api/models.py
132
133
134
135
class GeoJSONResponse(JSONResponse):
    """JSON with custom, vendor content-type."""

    media_type = "application/geo+json"

HealthCheck

Bases: BaseModel

health check response model.

Source code in stac_fastapi/api/stac_fastapi/api/models.py
144
145
146
147
class HealthCheck(BaseModel, extra="allow"):
    """health check response model."""

    status: Literal["UP", "DOWN"]

ItemCollectionUri

Bases: APIRequest, DatetimeMixin

Get item collection.

Source code in stac_fastapi/api/stac_fastapi/api/models.py
117
118
119
120
121
122
123
124
125
126
127
128
129
@attr.s
class ItemCollectionUri(APIRequest, DatetimeMixin):
    """Get item collection."""

    collection_id: Annotated[str, Path(description="Collection ID")] = attr.ib()
    limit: Annotated[
        Optional[Limit],
        Query(
            description="Limits the number of results that are included in each page of the response (capped to 10_000)."  # noqa: E501
        ),
    ] = attr.ib(default=10)
    bbox: Optional[BBox] = attr.ib(default=None, converter=_bbox_converter)  # type: ignore [misc]
    datetime: DateTimeQueryType = attr.ib(default=None, validator=_validate_datetime)

ItemUri

Bases: APIRequest

Get or delete item.

Source code in stac_fastapi/api/stac_fastapi/api/models.py
102
103
104
105
106
107
@attr.s
class ItemUri(APIRequest):
    """Get or delete item."""

    collection_id: Annotated[str, Path(description="Collection ID")] = attr.ib()
    item_id: Annotated[str, Path(description="Item ID")] = attr.ib()

JSONSchemaResponse

Bases: JSONResponse

JSON with custom, vendor content-type.

Source code in stac_fastapi/api/stac_fastapi/api/models.py
138
139
140
141
class JSONSchemaResponse(JSONResponse):
    """JSON with custom, vendor content-type."""

    media_type = "application/schema+json"

create_get_request_model

create_get_request_model(
    extensions: Optional[List[ApiExtension]], base_model: Type[APIRequest] = BaseSearchGetRequest
) -> Type[APIRequest]

Wrap create_request_model to create the GET request model.

Source code in stac_fastapi/api/stac_fastapi/api/models.py
67
68
69
70
71
72
73
74
75
76
77
78
def create_get_request_model(
    extensions: Optional[List[ApiExtension]],
    base_model: Type[APIRequest] = BaseSearchGetRequest,
) -> Type[APIRequest]:
    """Wrap create_request_model to create the GET request model."""
    model = create_request_model(
        "SearchGetRequest",
        base_model=base_model,
        extensions=extensions,
        request_type="GET",
    )
    return cast(Type[APIRequest], model)

create_post_request_model

create_post_request_model(
    extensions: Optional[List[ApiExtension]], base_model: Type[BaseModel] = BaseSearchPostRequest
) -> Type[BaseModel]

Wrap create_request_model to create the POST request model.

Source code in stac_fastapi/api/stac_fastapi/api/models.py
81
82
83
84
85
86
87
88
89
90
91
92
def create_post_request_model(
    extensions: Optional[List[ApiExtension]],
    base_model: Type[BaseModel] = BaseSearchPostRequest,
) -> Type[BaseModel]:
    """Wrap create_request_model to create the POST request model."""
    model = create_request_model(
        "SearchPostRequest",
        base_model=base_model,
        extensions=extensions,
        request_type="POST",
    )
    return cast(Type[BaseModel], model)

create_request_model

create_request_model(
    model_name="SearchGetRequest",
    base_model: Union[Type[BaseModel], Type[APIRequest]] = BaseSearchGetRequest,
    extensions: Optional[List[ApiExtension]] = None,
    mixins: Optional[Union[List[Type[BaseModel]], List[Type[APIRequest]]]] = None,
    request_type: str = "GET",
) -> Union[Type[BaseModel], Type[APIRequest]]

Create a pydantic model for validating request bodies.

Source code in stac_fastapi/api/stac_fastapi/api/models.py
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
def create_request_model(
    model_name="SearchGetRequest",
    base_model: Union[Type[BaseModel], Type[APIRequest]] = BaseSearchGetRequest,
    extensions: Optional[List[ApiExtension]] = None,
    mixins: Optional[Union[List[Type[BaseModel]], List[Type[APIRequest]]]] = None,
    request_type: str = "GET",
) -> Union[Type[BaseModel], Type[APIRequest]]:
    """Create a pydantic model for validating request bodies."""
    fields = {}
    extension_models: List[Union[Type[BaseModel], Type[APIRequest]]] = []

    # Check extensions for additional parameters to search
    for extension in extensions or []:
        if extension_model := extension.get_request_model(request_type):
            extension_models.append(extension_model)

    mixins = mixins or []

    models = [base_model] + extension_models + mixins

    # Handle GET requests
    if all([issubclass(m, APIRequest) for m in models]):
        get_model = attr.make_class(model_name, attrs={}, bases=tuple(models))
        return cast(Type[APIRequest], get_model)

    # Handle POST requests
    elif all([issubclass(m, BaseModel) for m in models]):
        for model in models:
            for k, field_info in model.model_fields.items():  # type: ignore
                fields[k] = (field_info.annotation, field_info)

        post_model = create_model(model_name, **fields, __base__=base_model)  # type: ignore
        return cast(Type[BaseModel], post_model)

    raise TypeError("Mixed Request Model types. Check extension request types.")