Skip to content

Commit 970618b

Browse files
authored
feat(server): adjust visibility handling [VIZ-2110] (#1757)
1 parent 99a3cb6 commit 970618b

File tree

8 files changed

+79
-33
lines changed

8 files changed

+79
-33
lines changed

server/e2e/gql_project_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -573,10 +573,10 @@ func TestFindVisibilityProjects(t *testing.T) {
573573
},
574574
}
575575

576-
// default private
576+
// default public
577577
edges := Request(e, uID.String(), requestBody).
578578
Path("$.data.projects.edges").Array()
579-
edges.Value(1).Path("$.node.visibility").IsEqual("private")
579+
edges.Value(1).Path("$.node.visibility").IsEqual("public")
580580

581581
// update public
582582
updateVisibilityProject(e, project1ID)
@@ -732,19 +732,19 @@ func testData(e *httpexpect.Expect) {
732732
"visualizer": "CESIUM",
733733
}).Object().
734734
HasValue("name", "test1-1").
735-
HasValue("coreSupport", false). //default(=false)
736-
HasValue("visibility", "private") //default(=private)
735+
HasValue("coreSupport", false). //default(=false)
736+
HasValue("visibility", "public") //default(=private)
737737

738-
// create coreSupport default(=false) visibility default(=private) `delete` project
738+
// create coreSupport default(=false) visibility default(=public) `delete` project
739739
id := createProject2(e, uID, map[string]any{
740740
"name": "test1-2",
741741
"description": "abc",
742742
"workspaceId": wID.String(),
743743
"visualizer": "CESIUM",
744744
}).Object().
745745
HasValue("name", "test1-2").
746-
HasValue("coreSupport", false). //default(=false)
747-
HasValue("visibility", "private"). //default(=private)
746+
HasValue("coreSupport", false). //default(=false)
747+
HasValue("visibility", "public"). //default(=public)
748748
Value("id").Raw().(string)
749749

750750
deleteProject(e, id) // delete

server/e2e/proto_project_user_test.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ func TestInternalAPI_private(t *testing.T) {
2626
// user1 call api
2727
runTestWithUser(t, uID.String(), func(client pb.ReEarthVisualizerClient, ctx context.Context) {
2828

29-
// create default Project -> private
30-
createProjectInternal(t, ctx, r, client, "private", &pb.CreateProjectRequest{
29+
// create default Project -> public
30+
createProjectInternal(t, ctx, r, client, "public", &pb.CreateProjectRequest{
3131
WorkspaceId: testWorkspace1,
3232
Visualizer: pb.Visualizer_VISUALIZER_CESIUM,
3333
Name: lo.ToPtr("Test User1 Default Project1"),
@@ -76,7 +76,7 @@ func TestInternalAPI_private(t *testing.T) {
7676
assert.Equal(t, res.Projects[1].Id, res.Projects[1].Metadata.ProjectId)
7777

7878
assert.Equal(t, "Test User1 Default Project1", res.Projects[2].Name)
79-
assert.Equal(t, "private", res.Projects[2].Visibility)
79+
assert.Equal(t, "public", res.Projects[2].Visibility)
8080
assert.Equal(t, res.Projects[2].Id, res.Projects[2].Metadata.ProjectId)
8181
})
8282

@@ -88,8 +88,8 @@ func TestInternalAPI_private(t *testing.T) {
8888
// user2 call api
8989
runTestWithUser(t, uID2.String(), func(client pb.ReEarthVisualizerClient, ctx context.Context) {
9090

91-
// create default Project -> private
92-
createProjectInternal(t, ctx, r, client, "private", &pb.CreateProjectRequest{
91+
// create default Project -> public
92+
createProjectInternal(t, ctx, r, client, "public", &pb.CreateProjectRequest{
9393
WorkspaceId: testWorkspace2,
9494
Visualizer: pb.Visualizer_VISUALIZER_CESIUM,
9595
Name: lo.ToPtr("Test User2 Default Project1"),
@@ -138,7 +138,7 @@ func TestInternalAPI_private(t *testing.T) {
138138
assert.Equal(t, res.Projects[1].Id, res.Projects[1].Metadata.ProjectId)
139139

140140
assert.Equal(t, "Test User2 Default Project1", res.Projects[2].Name)
141-
assert.Equal(t, "private", res.Projects[2].Visibility)
141+
assert.Equal(t, "public", res.Projects[2].Visibility)
142142
assert.Equal(t, res.Projects[2].Id, res.Projects[2].Metadata.ProjectId)
143143

144144
// get User1 Workspace => list size 1 public only
@@ -148,7 +148,7 @@ func TestInternalAPI_private(t *testing.T) {
148148
})
149149

150150
assert.Nil(t, err)
151-
assert.Equal(t, 1, len(res.Projects))
151+
assert.Equal(t, 2, len(res.Projects))
152152

153153
assert.Equal(t, "Test User1 Public Project3", res.Projects[0].Name)
154154
assert.Equal(t, "public", res.Projects[0].Visibility)
@@ -167,7 +167,7 @@ func TestInternalAPI_private(t *testing.T) {
167167
WorkspaceId: &testWorkspace2, // User2 Workspace
168168
})
169169
assert.Nil(t, err)
170-
assert.Equal(t, 1, len(res.Projects))
170+
assert.Equal(t, 2, len(res.Projects))
171171

172172
assert.Equal(t, "Test User2 Public Project3", res.Projects[0].Name)
173173
assert.Equal(t, "public", res.Projects[0].Visibility)
@@ -192,7 +192,7 @@ func TestInternalAPI_private(t *testing.T) {
192192
})
193193

194194
assert.Nil(t, err)
195-
assert.Equal(t, 0, len(res.Projects)) // Enmpty!
195+
assert.Equal(t, 1, len(res.Projects))
196196

197197
})
198198
}

server/internal/adapter/gql/gqlmodel/convert_project.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ type ProjectExport struct {
158158
Description string `json:"description"`
159159
ImageURL *url.URL `json:"imageUrl,omitempty"`
160160

161+
Visibility string `json:"visibility,omitempty"`
162+
161163
License *string `json:"readme,omitempty"`
162164
Readme *string `json:"license,omitempty"`
163165
Topics *string `json:"topics,omitempty"`
@@ -173,6 +175,7 @@ func ToProjectExport(p *project.Project) *ProjectExport {
173175
Name: p.Name(),
174176
Description: p.Description(),
175177
ImageURL: p.ImageURL(),
178+
Visibility: p.Visibility(),
176179
}
177180

178181
if pm := p.Metadata(); pm != nil {

server/internal/adapter/gql/resolver_mutation_project.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ func (r *mutationResolver) CreateProject(ctx context.Context, input gqlmodel.Cre
3737
Readme: input.Readme,
3838
License: input.License,
3939
Topics: input.Topics,
40-
}, getOperator(ctx))
40+
},
41+
getOperator(ctx),
42+
false, // isImport
43+
)
4144
if err != nil {
4245
return nil, err
4346
}

server/internal/adapter/internalapi/server.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,10 @@ func (s server) CreateProject(ctx context.Context, req *pb.CreateProjectRequest)
214214
Readme: req.Readme,
215215
License: req.License,
216216
Topics: req.Topics,
217-
}, op)
217+
},
218+
op,
219+
false, // isImport
220+
)
218221
if err != nil {
219222
return nil, err
220223
}

server/internal/app/file_uploader.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,10 @@ func CreateProcessingProject(ctx context.Context, usecases *interfaces.Container
142142
CoreSupport: &coreSupport,
143143
Visibility: &visibility,
144144
ImportStatus: project.ProjectImportStatusProcessing, // PROCESSING
145-
}, op)
145+
},
146+
op,
147+
true, // isImport
148+
)
146149
if err != nil {
147150
return nil, echo.NewHTTPError(http.StatusBadRequest, "Failed to create project")
148151
}

server/internal/usecase/interactor/project.go

Lines changed: 47 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -309,14 +309,41 @@ func (i *Project) getMetadata(ctx context.Context, pList []*project.Project) ([]
309309
return pList, err
310310
}
311311

312-
func (i *Project) Create(ctx context.Context, input interfaces.CreateProjectParam, operator *usecase.Operator) (_ *project.Project, err error) {
312+
func (i *Project) Create(ctx context.Context, input interfaces.CreateProjectParam, operator *usecase.Operator, isImport bool) (_ *project.Project, err error) {
313+
314+
// Default to VisibilityPublic if not specified
315+
visibility := project.VisibilityPublic
316+
if input.Visibility != nil {
317+
visibility = project.Visibility(*input.Visibility)
318+
}
319+
320+
if i.policyChecker != nil {
321+
322+
if isImport {
323+
// Try checking if user can create private project
324+
errPrivate := i.checkGeneralPolicy(ctx, input.WorkspaceID, project.VisibilityPrivate)
325+
if errPrivate == nil {
326+
visibility = project.VisibilityPrivate
327+
} else {
328+
visibility = project.VisibilityPublic
329+
}
330+
} else {
331+
// Not import: use given visibility
332+
if err = i.checkGeneralPolicy(ctx, input.WorkspaceID, visibility); err != nil {
333+
return nil, err
334+
}
335+
}
336+
337+
}
338+
339+
// project.Visibility(input.Visibility),
313340
return i.createProject(ctx, createProjectInput{
314341
WorkspaceID: input.WorkspaceID,
315342
Visualizer: input.Visualizer,
316343
Name: input.Name,
317344
Description: input.Description,
318345
CoreSupport: input.CoreSupport,
319-
Visibility: input.Visibility,
346+
Visibility: &visibility,
320347
ImportStatus: input.ImportStatus,
321348
ProjectAlias: input.ProjectAlias,
322349
Readme: input.Readme,
@@ -420,9 +447,24 @@ func (i *Project) Update(ctx context.Context, p interfaces.UpdateProjectParam, o
420447
}
421448

422449
if p.Visibility != nil {
450+
451+
visibility := project.Visibility(*p.Visibility)
452+
453+
if i.policyChecker != nil {
454+
455+
// If the visibility is going to change
456+
if !strings.EqualFold(*p.Visibility, prj.Visibility()) {
457+
if err = i.checkGeneralPolicy(ctx, prj.Workspace(), visibility); err != nil {
458+
return nil, err
459+
}
460+
}
461+
462+
}
463+
423464
if err := prj.UpdateVisibility(*p.Visibility); err != nil {
424465
return nil, err
425466
}
467+
426468
}
427469

428470
if p.ProjectAlias != nil {
@@ -1041,6 +1083,7 @@ func (i *Project) ImportProjectData(ctx context.Context, workspace string, proje
10411083
Readme: readme,
10421084
License: license,
10431085
Topics: topics,
1086+
// skip Visibility
10441087
}, op)
10451088
if err != nil {
10461089
return nil, err
@@ -1090,7 +1133,7 @@ type createProjectInput struct {
10901133
Alias *string
10911134
Archived *bool
10921135
CoreSupport *bool
1093-
Visibility *string
1136+
Visibility *project.Visibility
10941137
ProjectAlias *string
10951138

10961139
// metadata
@@ -1202,19 +1245,10 @@ func (i *Project) createProject(ctx context.Context, input createProjectInput, o
12021245
prj = prj.Name(*input.Name)
12031246
}
12041247

1205-
visibility := project.VisibilityPrivate
12061248
if input.Visibility != nil {
1207-
visibility = project.Visibility(*input.Visibility)
1249+
prj = prj.Visibility(*input.Visibility)
12081250
}
12091251

1210-
if i.policyChecker != nil {
1211-
if err = i.checkGeneralPolicy(ctx, input.WorkspaceID, visibility); err != nil {
1212-
return nil, err
1213-
}
1214-
}
1215-
1216-
prj = prj.Visibility(visibility)
1217-
12181252
proj, err := prj.Build()
12191253
if err != nil {
12201254
return nil, err

server/internal/usecase/interfaces/project.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ type Project interface {
105105
FindVisibilityByWorkspace(context.Context, accountdomain.WorkspaceID, bool, *usecase.Operator, *string, *project.SortType, *usecasex.Pagination, *ProjectListParam) ([]*project.Project, *usecasex.PageInfo, error)
106106
UpdateVisibility(context.Context, id.ProjectID, string, *usecase.Operator) (*project.Project, error)
107107

108-
Create(context.Context, CreateProjectParam, *usecase.Operator) (*project.Project, error)
108+
Create(context.Context, CreateProjectParam, *usecase.Operator, bool) (*project.Project, error)
109109
Update(context.Context, UpdateProjectParam, *usecase.Operator) (*project.Project, error)
110110
Delete(context.Context, id.ProjectID, *usecase.Operator) error
111111

0 commit comments

Comments
 (0)