Skip to content

Commit f3cecde

Browse files
feat: implement get_datasets endpoint
1 parent bb7f1c3 commit f3cecde

File tree

8 files changed

+107
-5
lines changed

8 files changed

+107
-5
lines changed

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,22 @@ source .venv/bin/activate
1414
pip install -r requirements_dev.txt
1515
```
1616

17+
### Set database enrivonment variable
18+
19+
```
20+
export DATABASE_URL="postgresql://oc4ids_datastore_read_only@localhost/oc4ids_datastore"
21+
```
22+
1723
### Run app
1824

1925
```
2026
fastapi dev oc4ids_datastore_api/main.py
2127
```
2228

29+
### View the OpenAPI schema
30+
31+
While the app is running, go to `http://127.0.0.1:8000/docs/`
32+
2333
### Run linting and type checking
2434

2535
```

oc4ids_datastore_api/database.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import os
2+
from typing import Sequence
3+
4+
from sqlmodel import Session, create_engine, select
5+
6+
from oc4ids_datastore_api.models import DatasetSQLModel
7+
8+
engine = create_engine(os.environ["DATABASE_URL"])
9+
10+
11+
def fetch_all_datasets() -> Sequence[DatasetSQLModel]:
12+
with Session(engine) as session:
13+
return session.exec(select(DatasetSQLModel)).all()

oc4ids_datastore_api/main.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
from fastapi import FastAPI
22

3+
from oc4ids_datastore_api.schemas import Dataset
4+
from oc4ids_datastore_api.services import get_all_datasets
5+
36
app = FastAPI()
47

58

6-
@app.get("/")
7-
def index() -> str:
8-
return "Hello, World!"
9+
@app.get("/datasets")
10+
def get_datasets() -> list[Dataset]:
11+
return get_all_datasets()

oc4ids_datastore_api/models.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import datetime
2+
3+
from sqlmodel import Field, SQLModel
4+
5+
6+
class DatasetSQLModel(SQLModel, table=True):
7+
__tablename__ = "dataset"
8+
9+
dataset_id: str = Field(primary_key=True)
10+
source_url: str
11+
publisher_name: str
12+
license_url: str | None
13+
license_name: str | None
14+
json_url: str | None
15+
csv_url: str | None
16+
xlsx_url: str | None
17+
updated_at: datetime.datetime

oc4ids_datastore_api/schemas.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import datetime
2+
3+
from pydantic import BaseModel
4+
5+
6+
class Publisher(BaseModel):
7+
name: str
8+
9+
10+
class License(BaseModel):
11+
url: str | None
12+
name: str | None
13+
14+
15+
class Download(BaseModel):
16+
format: str
17+
url: str
18+
19+
20+
class Dataset(BaseModel):
21+
loaded_at: datetime.datetime
22+
source_url: str
23+
publisher: Publisher
24+
license: License
25+
downloads: list[Download]

oc4ids_datastore_api/services.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from oc4ids_datastore_api.database import fetch_all_datasets
2+
from oc4ids_datastore_api.models import DatasetSQLModel
3+
from oc4ids_datastore_api.schemas import Dataset, Download, License, Publisher
4+
5+
6+
def _transform_dataset(dataset: DatasetSQLModel) -> Dataset:
7+
downloads = [
8+
Download(format="json", url=(dataset.json_url or "")),
9+
Download(format="csv", url=(dataset.csv_url or "")),
10+
Download(format="xlsx", url=(dataset.xlsx_url or "")),
11+
]
12+
return Dataset(
13+
loaded_at=dataset.updated_at,
14+
source_url=dataset.source_url,
15+
publisher=Publisher(name=dataset.publisher_name),
16+
license=License(url=dataset.license_url, name=dataset.license_name),
17+
downloads=downloads,
18+
)
19+
20+
21+
def get_all_datasets() -> list[Dataset]:
22+
datasets = fetch_all_datasets()
23+
return [_transform_dataset(dataset) for dataset in datasets]

pyproject.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ description = "OC4IDS Datastore API"
88
version = "0.1.0"
99
readme = "README.md"
1010
dependencies = [
11-
"fastapi[standard]"
11+
"fastapi[standard]",
12+
"psycopg2",
13+
"sqlmodel",
1214
]
1315

1416
[project.optional-dependencies]

requirements_dev.txt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,14 @@ pathspec==0.12.1
7676
# via black
7777
platformdirs==4.3.6
7878
# via black
79+
psycopg2==2.9.10
80+
# via oc4ids-datastore-api (pyproject.toml)
7981
pycodestyle==2.12.1
8082
# via flake8
8183
pydantic==2.10.6
82-
# via fastapi
84+
# via
85+
# fastapi
86+
# sqlmodel
8387
pydantic-core==2.27.2
8488
# via pydantic
8589
pyflakes==3.2.0
@@ -102,6 +106,10 @@ shellingham==1.5.4
102106
# via typer
103107
sniffio==1.3.1
104108
# via anyio
109+
sqlalchemy==2.0.37
110+
# via sqlmodel
111+
sqlmodel==0.0.22
112+
# via oc4ids-datastore-api (pyproject.toml)
105113
starlette==0.45.3
106114
# via fastapi
107115
typer==0.15.1
@@ -114,6 +122,7 @@ typing-extensions==4.12.2
114122
# pydantic
115123
# pydantic-core
116124
# rich-toolkit
125+
# sqlalchemy
117126
# typer
118127
uvicorn[standard]==0.34.0
119128
# via

0 commit comments

Comments
 (0)