Skip to content

Commit 0b9667a

Browse files
committed
fixing api v3
1 parent 53d710c commit 0b9667a

File tree

3 files changed

+132
-83
lines changed

3 files changed

+132
-83
lines changed

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,7 @@ reset:
3333
# Remove all virtual environments in subdirectories and re-create the main one
3434
find . -name ".venv" -type d -exec rm -rf {} +
3535
make all
36+
37+
v3-local:
38+
docker build -t macrostrat-api-v3 -f services/api-v3/Dockerlocal .
39+
docker run --rm -p 8080:80 --env-file services/api-v3/.env macrostrat-api-v3

services/api-v3/.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ __pycache__/
66

77
# C extensions
88
*.so
9-
9+
Dockerlocal
1010
# Distribution / packaging
1111
.Python
1212
build/

services/api-v3/api/schemas.py

Lines changed: 127 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
BOOLEAN,
1717
ENUM,
1818
INTEGER,
19+
JSON,
1920
JSONB,
2021
TEXT,
2122
VARCHAR,
@@ -27,56 +28,89 @@ class Base(DeclarativeBase):
2728
pass
2829

2930

30-
# maps.sources
3131
class Sources(Base):
3232
__tablename__ = "sources"
3333
__table_args__ = {"schema": "maps"}
34-
3534
source_id: Mapped[int] = mapped_column(primary_key=True)
36-
name: Mapped[str | None] = mapped_column(VARCHAR(255))
37-
primary_table: Mapped[str | None] = mapped_column(VARCHAR(255))
38-
url: Mapped[str | None] = mapped_column(VARCHAR(255))
39-
40-
ref_title: Mapped[str | None] = mapped_column(TEXT)
41-
authors: Mapped[str | None] = mapped_column(VARCHAR(255))
42-
ref_year: Mapped[str | None] = mapped_column(TEXT)
43-
ref_source: Mapped[str | None] = mapped_column(VARCHAR(255))
44-
isbn_doi: Mapped[str | None] = mapped_column(VARCHAR(100))
35+
name: Mapped[str] = mapped_column(VARCHAR(255))
36+
primary_table: Mapped[str] = mapped_column(VARCHAR(255))
37+
url: Mapped[str] = mapped_column(VARCHAR(255))
38+
raster_url: Mapped[str] = mapped_column(VARCHAR(255))
39+
ref_title: Mapped[str] = mapped_column(TEXT)
40+
authors: Mapped[str] = mapped_column(VARCHAR(255))
41+
ref_year: Mapped[str] = mapped_column(TEXT)
42+
ref_source: Mapped[str] = mapped_column(VARCHAR(255))
43+
isbn_doi: Mapped[str] = mapped_column(VARCHAR(100))
44+
scale: Mapped[str] = mapped_column(VARCHAR(20))
45+
primary_line_table: Mapped[str] = mapped_column(VARCHAR(50))
46+
license: Mapped[str] = mapped_column(VARCHAR(100))
47+
features: Mapped[int] = mapped_column(INTEGER)
48+
area: Mapped[int] = mapped_column(INTEGER)
49+
priority: Mapped[bool] = mapped_column(BOOLEAN)
50+
rgeom: Mapped[str] = mapped_column(Geometry("POLYGON"))
51+
display_scales: Mapped[list[str]] = mapped_column(ARRAY(TEXT))
52+
web_geom: Mapped[str] = mapped_column(Geometry("POLYGON"))
53+
new_priority: Mapped[int] = mapped_column(INTEGER)
54+
status_code: Mapped[str] = mapped_column(TEXT)
55+
slug: Mapped[str] = mapped_column(VARCHAR(255))
56+
57+
# Relationship
58+
ingest_process: Mapped["IngestProcess"] = relationship(back_populates="source")
4559

46-
scale: Mapped[str | None] = mapped_column(VARCHAR(20))
47-
primary_line_table: Mapped[str | None] = mapped_column(VARCHAR(50))
48-
license: Mapped[str | None] = mapped_column(VARCHAR(100))
4960

50-
features: Mapped[int | None] = mapped_column(INTEGER)
51-
area: Mapped[int | None] = mapped_column(INTEGER)
52-
priority: Mapped[bool] = mapped_column(BOOLEAN, default=False)
61+
class GroupMembers(Base):
62+
__tablename__ = "group_members"
63+
__table_args__ = {"schema": "macrostrat_auth"}
64+
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
65+
group_id: Mapped[int] = mapped_column(ForeignKey("macrostrat_auth.group.id"))
66+
user_id: Mapped[int] = mapped_column(ForeignKey("macrostrat_auth.user.id"))
5367

54-
rgeom: Mapped[str | None] = mapped_column(Geometry)
55-
display_scales: Mapped[list[str] | None] = mapped_column(ARRAY(TEXT))
56-
web_geom: Mapped[str | None] = mapped_column(Geometry)
5768

58-
new_priority: Mapped[int] = mapped_column(INTEGER, default=0)
59-
status_code: Mapped[str] = mapped_column(TEXT, default="active")
69+
class Group(Base):
70+
__tablename__ = "group"
71+
__table_args__ = {"schema": "macrostrat_auth"}
72+
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
73+
name: Mapped[str] = mapped_column(VARCHAR(255))
74+
users: Mapped[List["User"]] = relationship(
75+
secondary="macrostrat_auth.group_members",
76+
lazy="joined",
77+
back_populates="groups",
78+
)
6079

61-
slug: Mapped[str] = mapped_column(TEXT, unique=True)
6280

63-
raster_url: Mapped[str | None] = mapped_column(TEXT)
64-
scale_denominator: Mapped[int | None] = mapped_column(INTEGER)
65-
is_finalized: Mapped[bool] = mapped_column(BOOLEAN, default=False)
66-
lines_oriented: Mapped[bool | None] = mapped_column(BOOLEAN)
67-
date_finalized: Mapped[datetime.datetime | None] = mapped_column(
68-
DateTime(timezone=True)
81+
class User(Base):
82+
__tablename__ = "user"
83+
__table_args__ = {"schema": "macrostrat_auth"}
84+
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
85+
sub: Mapped[str] = mapped_column(VARCHAR(255))
86+
name: Mapped[str] = mapped_column(VARCHAR(255))
87+
email: Mapped[str] = mapped_column(VARCHAR(255))
88+
groups: Mapped[List[Group]] = relationship(
89+
secondary="macrostrat_auth.group_members", lazy="joined", back_populates="users"
90+
)
91+
created_on: Mapped[datetime.datetime] = mapped_column(
92+
DateTime(timezone=True), server_default=func.now()
93+
)
94+
updated_on: Mapped[datetime.datetime] = mapped_column(
95+
DateTime(timezone=True), server_default=func.now(), onupdate=func.now()
6996
)
7097

71-
ingested_by: Mapped[str | None] = mapped_column(TEXT)
72-
keywords: Mapped[list[str] | None] = mapped_column(ARRAY(TEXT))
73-
language: Mapped[str | None] = mapped_column(TEXT)
74-
description: Mapped[str | None] = mapped_column(VARCHAR)
7598

76-
ingest_process: Mapped["IngestProcess"] = relationship(back_populates="source")
99+
class Token(Base):
100+
__tablename__ = "token"
101+
__table_args__ = {"schema": "macrostrat_auth"}
102+
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
103+
token: Mapped[str] = mapped_column(VARCHAR(255), unique=True)
104+
group: Mapped[Group] = mapped_column(ForeignKey("macrostrat_auth.group.id"))
105+
used_on: Mapped[datetime.datetime] = mapped_column(
106+
DateTime(timezone=True), nullable=True
107+
)
108+
expires_on: Mapped[datetime.datetime] = mapped_column(DateTime(timezone=True))
109+
created_on: Mapped[datetime.datetime] = mapped_column(
110+
DateTime(timezone=True), server_default=func.now()
111+
)
77112

78113

79-
# storage.object
80114
class SchemeEnum(enum.Enum):
81115
http = "http"
82116
s3 = "s3"
@@ -88,47 +122,44 @@ class Object(Base):
88122
UniqueConstraint("scheme", "host", "bucket", "key", name="unique_file"),
89123
{"schema": "storage"},
90124
)
91-
92125
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
93-
scheme: Mapped[SchemeEnum] = mapped_column(Enum(SchemeEnum), nullable=False)
126+
# delete object_group_id
127+
object_group_id: Mapped[int] = mapped_column(
128+
ForeignKey("storage.object_group.id"), nullable=True
129+
)
130+
scheme: Mapped[str] = mapped_column(Enum(SchemeEnum))
94131
host: Mapped[str] = mapped_column(VARCHAR(255), nullable=False)
95132
bucket: Mapped[str] = mapped_column(VARCHAR(255), nullable=False)
96133
key: Mapped[str] = mapped_column(VARCHAR(255), nullable=False)
97-
98-
source: Mapped[dict | None] = mapped_column(JSONB)
99-
mime_type: Mapped[str | None] = mapped_column(VARCHAR(255))
100-
sha256_hash: Mapped[str | None] = mapped_column(VARCHAR(255))
101-
134+
source: Mapped[dict] = mapped_column(JSONB, nullable=True)
135+
mime_type: Mapped[str] = mapped_column(VARCHAR(255), nullable=True)
136+
sha256_hash: Mapped[str] = mapped_column(VARCHAR(255), nullable=True)
102137
created_on: Mapped[datetime.datetime] = mapped_column(
103138
DateTime(timezone=True), server_default=func.now()
104139
)
105140
updated_on: Mapped[datetime.datetime] = mapped_column(
106141
DateTime(timezone=True), server_default=func.now(), onupdate=func.now()
107142
)
108-
deleted_on: Mapped[datetime.datetime | None] = mapped_column(
109-
DateTime(timezone=True)
143+
deleted_on: Mapped[datetime.datetime] = mapped_column(
144+
DateTime(timezone=True), nullable=True
110145
)
111146

147+
# Relationships
148+
object_group: Mapped["ObjectGroup"] = relationship(back_populates="objects")
112149

113-
# storage.map_files (NEW! intersection table)
114-
class MapFiles(Base):
115-
__tablename__ = "map_files"
116-
__table_args__ = {"schema": "storage"}
117150

151+
class ObjectGroup(Base):
152+
__tablename__ = "object_group"
153+
__table_args__ = {"schema": "storage"}
118154
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
119155

120-
ingest_process_id: Mapped[int] = mapped_column(
121-
ForeignKey("maps_metadata.ingest_process.id", ondelete="CASCADE"),
122-
nullable=False,
123-
)
124-
125-
object_id: Mapped[int] = mapped_column(
126-
ForeignKey("storage.object.id", ondelete="CASCADE"),
127-
nullable=False,
156+
# Relationships
157+
objects: Mapped[List["Object"]] = relationship(back_populates="object_group")
158+
ingest_process: Mapped["IngestProcess"] = relationship(
159+
back_populates="object_group"
128160
)
129161

130162

131-
# ingest enums
132163
class IngestState(enum.Enum):
133164
pending = "pending"
134165
ingested = "ingested"
@@ -139,55 +170,68 @@ class IngestState(enum.Enum):
139170

140171

141172
class IngestType(enum.Enum):
142-
raster = "raster"
143-
vector = "vector"
173+
raster = "vector"
144174
ta1_output = "ta1_output"
145175

146176

147-
# maps_metadata.ingest_process
148177
class IngestProcess(Base):
149178
__tablename__ = "ingest_process"
150179
__table_args__ = {"schema": "maps_metadata"}
151180

152181
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
153182

154-
state: Mapped[IngestState | None] = mapped_column(
183+
state: Mapped[IngestState] = mapped_column(
155184
ENUM(IngestState, name="ingest_state", schema="maps", native_enum=True),
156185
nullable=True,
157186
)
158187

159-
comments: Mapped[str | None] = mapped_column(TEXT)
160-
source_id: Mapped[int | None] = mapped_column(ForeignKey("maps.sources.source_id"))
188+
type: Mapped[str] = mapped_column(
189+
Enum(IngestType, name="ingest_type"), nullable=True
190+
)
161191

192+
comments: Mapped[str] = mapped_column(TEXT, nullable=True)
193+
map_id: Mapped[str] = mapped_column(TEXT, nullable=True)
194+
source_id: Mapped[int] = mapped_column(
195+
ForeignKey("maps.sources.source_id"), nullable=True
196+
)
197+
access_group_id: Mapped[int] = mapped_column(
198+
ForeignKey("macrostrat_auth.group.id"), nullable=True
199+
)
200+
object_group_id: Mapped[ObjectGroup] = mapped_column(
201+
ForeignKey("storage.object_group.id")
202+
)
162203
created_on: Mapped[datetime.datetime] = mapped_column(
163204
DateTime(timezone=True), server_default=func.now()
164205
)
165-
completed_on: Mapped[datetime.datetime | None] = mapped_column(
166-
DateTime(timezone=True)
206+
completed_on: Mapped[datetime.datetime] = mapped_column(
207+
DateTime(timezone=True), nullable=True
167208
)
168209

169-
map_id: Mapped[str | None] = mapped_column(TEXT)
170-
type: Mapped[IngestType | None] = mapped_column(
171-
Enum(IngestType, name="ingest_type")
210+
# Relationships
211+
object_group: Mapped[ObjectGroup] = relationship(
212+
back_populates="ingest_process", lazy="joined"
213+
)
214+
source: Mapped[Sources] = relationship(back_populates="ingest_process")
215+
tags: Mapped[List["IngestProcessTag"]] = relationship(
216+
back_populates="ingest_process", lazy="joined"
172217
)
173218

174-
polygon_state: Mapped[dict | None] = mapped_column(JSONB)
175-
line_state: Mapped[dict | None] = mapped_column(JSONB)
176-
point_state: Mapped[dict | None] = mapped_column(JSONB)
177-
178-
ingest_pipeline: Mapped[str | None] = mapped_column(TEXT)
179-
map_url: Mapped[str | None] = mapped_column(TEXT)
180-
ingested_by: Mapped[str | None] = mapped_column(TEXT)
181-
slug: Mapped[str | None] = mapped_column(TEXT)
219+
class MapFiles(Base):
220+
__tablename__ = "map_files"
221+
__table_args__ = {"schema": "storage"}
182222

183-
source: Mapped[Sources] = relationship(back_populates="ingest_process")
223+
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
184224

185-
tags: Mapped[List["IngestProcessTag"]] = relationship(
186-
back_populates="ingest_process"
225+
ingest_process_id: Mapped[int] = mapped_column(
226+
ForeignKey("maps_metadata.ingest_process.id", ondelete="CASCADE"),
227+
nullable=False,
187228
)
188229

230+
object_id: Mapped[int] = mapped_column(
231+
ForeignKey("storage.object.id", ondelete="CASCADE"),
232+
nullable=False,
233+
)
189234

190-
# maps_metadata.ingest_process_tag
191235
class IngestProcessTag(Base):
192236
__tablename__ = "ingest_process_tag"
193237
__table_args__ = (
@@ -196,8 +240,9 @@ class IngestProcessTag(Base):
196240
)
197241

198242
ingest_process_id: Mapped[int] = mapped_column(
199-
ForeignKey("maps_metadata.ingest_process.id", ondelete="CASCADE")
243+
ForeignKey("maps_metadata.ingest_process.id")
200244
)
201245
tag: Mapped[str] = mapped_column(VARCHAR(255))
202246

203-
ingest_process: Mapped[IngestProcess] = relationship(back_populates="tags")
247+
# Relationships
248+
ingest_process: Mapped[IngestProcess] = relationship(back_populates="tags")

0 commit comments

Comments
 (0)