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
94
95
96
97
98
@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
109
110
111
112
113
@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
131
132
133
134
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
143
144
145
146
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
116
117
118
119
120
121
122
123
124
125
126
127
128
@attr.s
class ItemCollectionUri(APIRequest, DatetimeMixin):
    """Get item collection."""

    collection_id: Annotated[str, Path(description="Collection ID")] = attr.ib()
    limit: Annotated[
        Limit | None,
        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: BBox | None = 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
101
102
103
104
105
106
@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
137
138
139
140
class JSONSchemaResponse(JSONResponse):
    """JSON with custom, vendor content-type."""

    media_type = "application/schema+json"

create_get_request_model

create_get_request_model(
    extensions: list[ApiExtension] | None, 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
66
67
68
69
70
71
72
73
74
75
76
77
def create_get_request_model(
    extensions: list[ApiExtension] | None,
    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: list[ApiExtension] | None, 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
80
81
82
83
84
85
86
87
88
89
90
91
def create_post_request_model(
    extensions: list[ApiExtension] | None,
    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: type[BaseModel] | type[APIRequest] = BaseSearchGetRequest,
    extensions: list[ApiExtension] | None = None,
    mixins: list[type[BaseModel]] | list[type[APIRequest]] | None = None,
    request_type: str = "GET",
) -> type[BaseModel] | type[APIRequest]

Create a pydantic model for validating request bodies.

Source code in stac_fastapi/api/stac_fastapi/api/models.py
29
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
def create_request_model(
    model_name="SearchGetRequest",
    base_model: type[BaseModel] | type[APIRequest] = BaseSearchGetRequest,
    extensions: list[ApiExtension] | None = None,
    mixins: list[type[BaseModel]] | list[type[APIRequest]] | None = None,
    request_type: str = "GET",
) -> type[BaseModel] | type[APIRequest]:
    """Create a pydantic model for validating request bodies."""
    fields = {}
    extension_models: list[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.")