Skip to content

Commit 02ff027

Browse files
committed
API: add 'v' prefix to version in delta endpoint
1 parent 2c9bdad commit 02ff027

File tree

4 files changed

+34
-25
lines changed

4 files changed

+34
-25
lines changed

server/mergin/sync/files.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ def patch_field(self, data, **kwargs):
334334
class DeltaChangeItemSchema(DeltaChangeBaseSchema):
335335
"""Schema for delta changes response"""
336336

337+
version = fields.Function(lambda obj: f"v{obj.version}")
337338
diffs = fields.List(fields.Nested(DeltaChangeDiffFileSchema()))
338339

339340
@post_dump

server/mergin/sync/public_api_v2.yaml

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -393,16 +393,12 @@ paths:
393393
in: query
394394
required: true
395395
schema:
396-
type: integer
397-
example:
398-
minimum: 0
396+
$ref: "#/components/schemas/VersionName"
399397
description: Start version (exclusive)
400398
- name: to
401399
in: query
402400
schema:
403-
type: integer
404-
example: 2
405-
minimum: 1
401+
$ref: "#/components/schemas/VersionName"
406402
description: End version (inclusive)
407403
responses:
408404
"200":
@@ -858,8 +854,7 @@ components:
858854
type: string
859855
example: 9adb76bf81a34880209040ffe5ee262a090b62ab
860856
version:
861-
type: integer
862-
example: 1
857+
$ref: "#/components/schemas/VersionName"
863858
change:
864859
$ref: "#/components/schemas/ProjectChangeType"
865860
diffs:
@@ -880,3 +875,7 @@ components:
880875
type: array
881876
items:
882877
$ref: "#/components/schemas/ProjectDeltaChange"
878+
VersionName:
879+
type: string
880+
pattern: '^v\d+$'
881+
example: v2

server/mergin/sync/public_api_v2_controller.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -405,11 +405,18 @@ def upload_chunk(id: str):
405405
)
406406

407407

408-
def get_project_delta(id: str, since: int, to: Optional[int] = None):
408+
def get_project_delta(id: str, since: str, to: Optional[str] = None):
409409
"""Get project changes (delta) between two versions"""
410410

411411
project: Project = require_project_by_uuid(id, ProjectPermissions.Read)
412-
to = project.latest_version if to is None else to
412+
since = ProjectVersion.from_v_name(since)
413+
to = project.latest_version if to is None else ProjectVersion.from_v_name(to)
414+
if since < 0 or to < 1:
415+
abort(
416+
400,
417+
"Invalid version number, minimum version for 'since' is 0 and minimum version for 'to' is 1",
418+
)
419+
413420
if to > project.latest_version:
414421
abort(400, "'to' version exceeds latest project version")
415422

server/mergin/tests/test_public_api_v2.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -923,60 +923,60 @@ def test_project_delta(client, diff_project):
923923
os.path.join(working_dir, "base.gpkg"),
924924
)
925925
push_change(initial_project, "added", "base.gpkg", working_dir)
926-
response = client.get(f"v2/projects/{initial_project.id}/delta?since=0")
926+
response = client.get(f"v2/projects/{initial_project.id}/delta?since=v0")
927927
assert response.status_code == 200
928928
changes = response.json["items"]
929929
assert len(changes) == 1
930930
assert changes[0]["change"] == PushChangeType.CREATE.value
931-
assert changes[0]["version"] == 1
931+
assert changes[0]["version"] == "v1"
932932

933933
# remove the file and get changes from 0 -> 2 where base gpgkg is removed -> transparent
934934
push_change(initial_project, "removed", "base.gpkg", working_dir)
935-
response = client.get(f"v2/projects/{initial_project.id}/delta?since=0")
935+
response = client.get(f"v2/projects/{initial_project.id}/delta?since=v0")
936936
assert response.status_code == 200
937937
changes = response.json["items"]
938938
assert len(changes) == 0
939939

940940
# non valid cases
941941
response = client.get(f"v2/projects/{diff_project.id}/delta")
942942
assert response.status_code == 400
943-
response = client.get(f"v2/projects/{diff_project.id}/delta?since=2&to=1")
943+
response = client.get(f"v2/projects/{diff_project.id}/delta?since=v2&to=v1")
944944
assert response.status_code == 400
945-
response = client.get(f"v2/projects/{diff_project.id}/delta?since=-2")
945+
response = client.get(f"v2/projects/{diff_project.id}/delta?since=v-2")
946946
assert response.status_code == 400
947-
response = client.get(f"v2/projects/{diff_project.id}/delta?since=-2&to=-1")
947+
response = client.get(f"v2/projects/{diff_project.id}/delta?since=v-2&to=v-1")
948948
assert response.status_code == 400
949949
# exceeding latest version
950-
response = client.get(f"v2/projects/{diff_project.id}/delta?since=0&to=2000")
950+
response = client.get(f"v2/projects/{diff_project.id}/delta?since=v0&to=v2000")
951951
assert response.status_code == 400
952952
# no changes between versions with same number
953-
response = client.get(f"v2/projects/{diff_project.id}/delta?since=1&to=1")
953+
response = client.get(f"v2/projects/{diff_project.id}/delta?since=v1&to=v1")
954954
assert response.status_code == 400
955955

956956
# since 1 to latest version
957-
response = client.get(f"v2/projects/{diff_project.id}/delta?since=1")
957+
response = client.get(f"v2/projects/{diff_project.id}/delta?since=v1")
958958
assert response.status_code == 200
959959
changes = response.json["items"]
960960
# create of test.gpkg and delete base.gpkg
961961
assert len(changes) == 2
962962
assert changes[0]["change"] == PushChangeType.DELETE.value
963-
assert changes[0]["version"] == 9
963+
assert changes[0]["version"] == "v9"
964964
assert changes[0]["path"] == "base.gpkg"
965965
assert changes[0]["size"] == 98304
966966

967967
assert changes[1]["change"] == PushChangeType.CREATE.value
968-
assert changes[1]["version"] == 9
968+
assert changes[1]["version"] == "v9"
969969
assert changes[1]["path"] == "test.gpkg"
970970
assert changes[1]["size"] == 98304
971971

972972
# simple update
973-
response = client.get(f"v2/projects/{diff_project.id}/delta?since=4&to=8")
973+
response = client.get(f"v2/projects/{diff_project.id}/delta?since=v4&to=v8")
974974
assert response.status_code == 200
975975
changes = response.json["items"]
976976
assert len(changes) == 1
977977
assert changes[0]["change"] == PushChangeType.UPDATE.value
978978
# version is new latest version of the change
979-
assert changes[0]["version"] == 7
979+
assert changes[0]["version"] == "v7"
980980
assert not changes[0].get("diffs")
981981

982982

@@ -990,12 +990,14 @@ def test_project_pull_diffs(client, diff_project):
990990
.order_by(FileDiff.version)
991991
.all()
992992
)
993-
response = client.get(f"v2/projects/{diff_project.id}/delta?since={since}&to={to}")
993+
response = client.get(
994+
f"v2/projects/{diff_project.id}/delta?since=v{since}&to=v{to}"
995+
)
994996
assert response.status_code == 200
995997
delta = response.json["items"]
996998
assert len(delta) == 1
997999
assert delta[0]["change"] == PushChangeType.UPDATE_DIFF.value
998-
assert delta[0]["version"] == 7
1000+
assert delta[0]["version"] == "v7"
9991001
first_diff = delta[0]["diffs"][0]
10001002
second_diff = delta[0]["diffs"][1]
10011003
assert first_diff["path"] == current_diffs[0].path

0 commit comments

Comments
 (0)