Skip to content

Commit dd43a84

Browse files
committed
Add head request x-mm-project-version header to GET v2/projects
1 parent 7a6b4ca commit dd43a84

3 files changed

Lines changed: 40 additions & 0 deletions

File tree

server/mergin/sync/public_api_v2_controller.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,10 @@ def download_diff_file(id: str, file: str):
203203
def get_project(id, files_at_version=None):
204204
"""Get project info. Include list of files at specific version if requested."""
205205
project = require_project_by_uuid(id, ProjectPermissions.Read, expose=False)
206+
if request.method == "HEAD":
207+
headers = {"X-Mm-Project-Version": project.latest_version}
208+
return ProjectSchemaV2().dump(project), 200, headers
209+
206210
data = ProjectSchemaV2().dump(project)
207211
if files_at_version:
208212
pv = ProjectVersion.query.filter_by(

server/mergin/tests/test_public_api_v2.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,38 @@ def test_get_project(client):
852852
assert response.status_code == 400
853853

854854

855+
def test_head_project(client):
856+
"""Test head project endpoint returns version header."""
857+
admin = User.query.filter_by(username=DEFAULT_USER[0]).first()
858+
test_workspace = create_workspace()
859+
project = create_project("head_project", test_workspace, admin)
860+
861+
logout(client)
862+
response = client.head(f"v2/projects/{project.id}")
863+
assert response.status_code == 404
864+
865+
user = add_user("head_test", "tests")
866+
login(client, user.username, "tests")
867+
response = client.head(f"v2/projects/{project.id}")
868+
assert response.status_code == 403
869+
870+
project.public = True
871+
db.session.commit()
872+
response = client.head(f"v2/projects/{project.id}")
873+
assert response.status_code == 200
874+
assert response.headers["X-Mm-Project-Version"] == ProjectVersion.to_v_name(
875+
project.latest_version
876+
)
877+
assert response.data == b""
878+
879+
login_as_admin(client)
880+
project.public = False
881+
project.removed_at = datetime.utcnow()
882+
db.session.commit()
883+
response = client.head(f"v2/projects/{project.id}")
884+
assert response.status_code == 404
885+
886+
855887
push_data = [
856888
# success
857889
(

web-app/packages/lib/src/modules/project/projectApi.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,5 +344,9 @@ export const ProjectApi = {
344344
return ProjectModule.httpService.get(
345345
`/v2/projects/${projectId}/collaborators`
346346
)
347+
},
348+
349+
async headProject(projectId: string): Promise<AxiosResponse<void>> {
350+
return ProjectModule.httpService.head(`/v2/projects/${projectId}`)
347351
}
348352
}

0 commit comments

Comments
 (0)