Skip to content

Commit 75b4116

Browse files
authored
feat: add visibility field to GET /repository response (#1214)
Closes #1213.
1 parent 36e8a00 commit 75b4116

6 files changed

Lines changed: 63 additions & 69 deletions

File tree

components/renku_data_services/repositories/api.spec.yaml

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,12 @@ components:
5555
type: boolean
5656
push_permission:
5757
type: boolean
58+
visibility:
59+
$ref: "#/components/schemas/RepositoryVisibility"
5860
required:
5961
- git_url
6062
- pull_permission
63+
- visibility
6164
RepositoryProviderData:
6265
type: object
6366
additionalProperties: false
@@ -115,31 +118,6 @@ components:
115118
- id
116119
- name
117120
- url
118-
RepositoryMetadata:
119-
type: object
120-
additionalProperties: false
121-
properties:
122-
git_http_url:
123-
$ref: "#/components/schemas/WebUrl"
124-
web_url:
125-
$ref: "#/components/schemas/WebUrl"
126-
permissions:
127-
$ref: "#/components/schemas/RepositoryPermissions"
128-
required:
129-
- git_http_url
130-
- web_url
131-
- permissions
132-
RepositoryPermissions:
133-
type: object
134-
additionalProperties: false
135-
properties:
136-
pull:
137-
type: boolean
138-
push:
139-
type: boolean
140-
required:
141-
- pull
142-
- push
143121
Ulid:
144122
description: ULID identifier
145123
type: string
@@ -150,10 +128,15 @@ components:
150128
description: ID of a OAuth2 provider, e.g. "gitlab.com".
151129
type: string
152130
example: "some-id"
153-
WebUrl:
154-
description: A URL which can be opened in a browser, i.e. a web page.
131+
RepositoryVisibility:
132+
description: |
133+
The visibility of a repository:
134+
- public: the repository can be pulled without credentials
135+
- private: the repository requires credentials to be pulled
155136
type: string
156-
example: "https://example.org"
137+
enum:
138+
- public
139+
- private
157140
ErrorResponse:
158141
type: object
159142
properties:

components/renku_data_services/repositories/apispec.py

Lines changed: 15 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# generated by datamodel-codegen:
22
# filename: api.spec.yaml
3-
# timestamp: 2025-11-26T07:52:19+00:00
3+
# timestamp: 2026-02-17T12:23:26+00:00
44

55
from __future__ import annotations
66

@@ -11,16 +11,6 @@
1111
from renku_data_services.repositories.apispec_base import BaseAPISpec
1212

1313

14-
class Metadata(BaseAPISpec):
15-
model_config = ConfigDict(
16-
extra="forbid",
17-
)
18-
git_url: str
19-
web_url: Optional[str] = None
20-
pull_permission: bool
21-
push_permission: Optional[bool] = None
22-
23-
2414
class Status(Enum):
2515
valid = "valid"
2616
invalid = "invalid"
@@ -40,12 +30,9 @@ class ErrorCode(Enum):
4030
metadata_validation = "metadata_validation"
4131

4232

43-
class RepositoryPermissions(BaseAPISpec):
44-
model_config = ConfigDict(
45-
extra="forbid",
46-
)
47-
pull: bool
48-
push: bool
33+
class RepositoryVisibility(Enum):
34+
public = "public"
35+
private = "private"
4936

5037

5138
class Error(BaseAPISpec):
@@ -66,6 +53,17 @@ class RepositoryGetParametersQuery(BaseAPISpec):
6653
url: str
6754

6855

56+
class Metadata(BaseAPISpec):
57+
model_config = ConfigDict(
58+
extra="forbid",
59+
)
60+
git_url: str
61+
web_url: Optional[str] = None
62+
pull_permission: bool
63+
push_permission: Optional[bool] = None
64+
visibility: RepositoryVisibility
65+
66+
6967
class ProviderConnection(BaseAPISpec):
7068
id: str = Field(
7169
...,
@@ -92,23 +90,6 @@ class ProviderData(BaseAPISpec):
9290
url: str
9391

9492

95-
class RepositoryMetadata(BaseAPISpec):
96-
model_config = ConfigDict(
97-
extra="forbid",
98-
)
99-
git_http_url: str = Field(
100-
...,
101-
description="A URL which can be opened in a browser, i.e. a web page.",
102-
examples=["https://example.org"],
103-
)
104-
web_url: str = Field(
105-
...,
106-
description="A URL which can be opened in a browser, i.e. a web page.",
107-
examples=["https://example.org"],
108-
)
109-
permissions: RepositoryPermissions
110-
111-
11293
class RepositoryProviderData(BaseAPISpec):
11394
model_config = ConfigDict(
11495
extra="forbid",

components/renku_data_services/repositories/blueprints.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ def _make_result(self, r: models.RepositoryDataResult) -> apispec.RepositoryProv
7575
web_url=r.metadata.web_url,
7676
pull_permission=r.metadata.pull_permission,
7777
push_permission=r.metadata.push_permission,
78+
visibility=apispec.RepositoryVisibility(r.metadata.visibility.value),
7879
)
7980
if r.metadata and r.metadata != "Unmodified"
8081
else None

components/renku_data_services/repositories/db.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,12 @@ async def get_repository(
9797
# don't overwrite previous errors
9898
result = result.with_error(repo_err) if not result.error else result
9999
if repo_err is None:
100-
result = result.with_metadata(models.Metadata(git_url=valid_url.render(), pull_permission=True))
100+
# NOTE: we assume public visibility since we can request git-upload-pack
101+
result = result.with_metadata(
102+
models.Metadata(
103+
git_url=valid_url.render(), pull_permission=True, visibility=models.RepositoryVisibility.public
104+
)
105+
)
101106

102107
return result
103108

components/renku_data_services/repositories/external_models.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ def to_repository(
8181
if self.permissions is not None
8282
else default_permissions or models.RepositoryPermissions.default()
8383
),
84+
visibility=(
85+
models.RepositoryVisibility.public
86+
if self.visibility == GitLabVisibility.public.value
87+
else models.RepositoryVisibility.private
88+
),
8489
)
8590

8691

@@ -127,4 +132,9 @@ def to_repository(
127132
if self.permissions is not None
128133
else default_permissions or models.RepositoryPermissions.default()
129134
),
135+
visibility=(
136+
models.RepositoryVisibility.public
137+
if self.visibility == GitHubVisibility.public.value
138+
else models.RepositoryVisibility.private
139+
),
130140
)

components/renku_data_services/repositories/models.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,15 @@ def default(cls) -> RepositoryPermissions:
2626
return cls(pull=False, push=False)
2727

2828

29+
@dataclass(frozen=True, eq=True, kw_only=True)
30+
class RepositoryProviderData:
31+
"""Repository provider match data."""
32+
33+
provider: ProviderData
34+
connection: ProviderConnection | None
35+
repository_metadata: RepositoryMetadata | None
36+
37+
2938
@dataclass(frozen=True, eq=True, kw_only=True)
3039
class RepositoryMetadata:
3140
"""Repository metadata."""
@@ -34,6 +43,7 @@ class RepositoryMetadata:
3443
git_http_url: str
3544
web_url: str
3645
permissions: RepositoryPermissions
46+
visibility: RepositoryVisibility
3747

3848

3949
@dataclass(frozen=True, eq=True, kw_only=True)
@@ -73,13 +83,15 @@ def fromORM(cls, e: OAuth2ClientORM) -> ProviderData:
7383
return ProviderData(id=e.id, name=e.display_name, url=e.url)
7484

7585

76-
@dataclass(frozen=True, eq=True, kw_only=True)
77-
class RepositoryProviderData:
78-
"""Repository provider match data."""
86+
class RepositoryVisibility(StrEnum):
87+
"""The visibility of a repository.
7988
80-
provider: ProviderData
81-
connection: ProviderConnection | None
82-
repository_metadata: RepositoryMetadata | None
89+
public: the repository can be pulled without credentials
90+
private: the repository requires credentials to be pulled
91+
"""
92+
93+
public = "public"
94+
private = "private"
8395

8496

8597
@dataclass(frozen=True, eq=True, kw_only=True)
@@ -91,6 +103,7 @@ class Metadata:
91103
web_url: str | None = None
92104
pull_permission: bool
93105
push_permission: bool | None = None
106+
visibility: RepositoryVisibility = RepositoryVisibility.private
94107

95108
@classmethod
96109
def fromRepoMeta(cls, rm: RepositoryMetadata) -> Metadata:
@@ -101,6 +114,7 @@ def fromRepoMeta(cls, rm: RepositoryMetadata) -> Metadata:
101114
web_url=rm.web_url,
102115
pull_permission=rm.permissions.pull,
103116
push_permission=rm.permissions.push,
117+
visibility=rm.visibility,
104118
)
105119

106120

0 commit comments

Comments
 (0)