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/models.py
91
92
93
94
95
@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/models.py
106
107
108
109
110
@attr.s
class EmptyRequest(APIRequest):
    """Empty request."""

    ...

GeoJSONResponse

Bases: JSONResponse

JSON with custom, vendor content-type.

Source code in stac_fastapi/api/models.py
128
129
130
131
class GeoJSONResponse(JSONResponse):
    """JSON with custom, vendor content-type."""

    media_type = "application/geo+json"

ItemCollectionUri

Bases: APIRequest, DatetimeMixin

Get item collection.

Source code in stac_fastapi/api/models.py
113
114
115
116
117
118
119
120
121
122
123
124
125
@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)
    datetime: DateTimeQueryType = attr.ib(default=None, validator=_validate_datetime)

ItemUri

Bases: APIRequest

Get or delete item.

Source code in stac_fastapi/api/models.py
 98
 99
100
101
102
103
@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/models.py
134
135
136
137
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: BaseSearchGetRequest = BaseSearchGetRequest,
) -> APIRequest

Wrap create_request_model to create the GET request model.

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

    return create_request_model(
        "SearchGetRequest",
        base_model=base_model,
        extensions=extensions,
        request_type="GET",
    )

create_post_request_model

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

Wrap create_request_model to create the POST request model.

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

create_request_model

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

Create a pydantic model for validating request bodies.

Source code in 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
def create_request_model(
    model_name="SearchGetRequest",
    base_model: Union[Type[BaseModel], APIRequest] = BaseSearchGetRequest,
    extensions: Optional[List[ApiExtension]] = None,
    mixins: Optional[Union[List[BaseModel], List[APIRequest]]] = None,
    request_type: Optional[str] = "GET",
) -> Union[Type[BaseModel], APIRequest]:
    """Create a pydantic model for validating request bodies."""
    fields = {}
    extension_models = []

    # 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]):
        return attr.make_class(model_name, attrs={}, bases=tuple(models))

    # 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():
                fields[k] = (field_info.annotation, field_info)
        return create_model(model_name, **fields, __base__=base_model)

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