Skip to content

Commit 6b6f9ac

Browse files
committed
wrapper h2c handler
1 parent c558de1 commit 6b6f9ac

File tree

14 files changed

+165
-72
lines changed

14 files changed

+165
-72
lines changed

server/e2e/proto_project_test.go

Lines changed: 58 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import (
1414
"google.golang.org/grpc/metadata"
1515

1616
pb "github.com/reearth/reearth/server/internal/adapter/internalapi/schemas/internalapi/v1"
17+
"github.com/reearth/reearth/server/internal/usecase/repo"
18+
"github.com/reearth/reearth/server/pkg/id"
1719
)
1820

1921
func SafeClose(c io.Closer) {
@@ -22,12 +24,15 @@ func SafeClose(c io.Closer) {
2224
}
2325
}
2426

27+
// export REEARTH_DB=mongodb://localhost
28+
// go test -v -run TestInternalAPI ./e2e/...
29+
2530
func TestInternalAPI_private(t *testing.T) {
26-
GRPCServer(t, baseSeeder)
31+
_, r, _ := GRPCServer(t, baseSeeder)
2732

2833
runTestWithUser(t, uID.String(), func(client pb.ReEarthVisualizerClient, ctx context.Context) {
2934

30-
// -------- default Project
35+
// create default Project
3136
res, err := client.CreateProject(ctx, &pb.CreateProjectRequest{
3237
TeamId: wID.String(),
3338
Visualizer: pb.Visualizer_VISUALIZER_CESIUM,
@@ -37,62 +42,67 @@ func TestInternalAPI_private(t *testing.T) {
3742
// Visibility: lo.ToPtr("private"),
3843
})
3944
assert.Nil(t, err)
45+
checProject(t, ctx, r, res)
4046

41-
// -------- private
47+
// get -> private
4248
res2, err := client.GetProject(ctx, &pb.GetProjectRequest{
4349
ProjectId: res.Project.Id,
4450
})
4551
assert.Nil(t, err)
4652
assert.Equal(t, "private", res2.Project.Visibility)
4753

48-
// -------- private Project
49-
res, err = client.CreateProject(ctx, &pb.CreateProjectRequest{
54+
// create private Project
55+
_, err = client.CreateProject(ctx, &pb.CreateProjectRequest{
5056
TeamId: wID.String(),
5157
Visualizer: pb.Visualizer_VISUALIZER_CESIUM,
52-
Name: lo.ToPtr("Test Project1"),
53-
Description: lo.ToPtr("Test Description1"),
58+
Name: lo.ToPtr("Test Project2"),
59+
Description: lo.ToPtr("Test Description2"),
5460
CoreSupport: lo.ToPtr(true),
5561
Visibility: lo.ToPtr("private"),
5662
})
5763
assert.Nil(t, err)
64+
checProject(t, ctx, r, res)
5865

59-
// -------- private
66+
// get -> private
6067
res2, err = client.GetProject(ctx, &pb.GetProjectRequest{
6168
ProjectId: res.Project.Id,
6269
})
6370
assert.Nil(t, err)
6471
assert.Equal(t, "private", res2.Project.Visibility)
6572

66-
// -------- public list size 3
6773
// 0: creante seeder => null
6874
// 1: creante default => private
6975
// 2: creante private => private
76+
77+
// Authenticated: true => get list size 3
7078
res3, err := client.GetProjectList(ctx, &pb.GetProjectListRequest{
71-
TeamId: wID.String(),
79+
TeamId: wID.String(),
80+
Authenticated: true,
7281
})
7382
assert.Nil(t, err)
7483
assert.Equal(t, 3, len(res3.Projects))
7584
assert.Equal(t, "", res3.Projects[0].Visibility)
7685
assert.Equal(t, "private", res3.Projects[1].Visibility)
7786
assert.Equal(t, "private", res3.Projects[2].Visibility)
78-
})
7987

80-
// User2 test
81-
runTestWithUser(t, uID2.String(), func(client pb.ReEarthVisualizerClient, ctx context.Context) {
82-
// -------- public list size 0 (Not authenticated)
83-
res3, err := client.GetProjectList(ctx, &pb.GetProjectListRequest{
84-
TeamId: wID.String(),
88+
// Authenticated: false => get list size 0
89+
res3, err = client.GetProjectList(ctx, &pb.GetProjectListRequest{
90+
TeamId: wID.String(),
91+
Authenticated: false,
8592
})
8693
assert.Nil(t, err)
8794
assert.Equal(t, 0, len(res3.Projects))
95+
8896
})
97+
8998
}
9099

91100
func TestInternalAPI_public(t *testing.T) {
92-
GRPCServer(t, baseSeeder)
101+
_, r, _ := GRPCServer(t, baseSeeder)
93102

94103
runTestWithUser(t, uID.String(), func(client pb.ReEarthVisualizerClient, ctx context.Context) {
95-
// -------- public Project
104+
105+
// create public Project
96106
res, err := client.CreateProject(ctx, &pb.CreateProjectRequest{
97107
TeamId: wID.String(),
98108
Visualizer: pb.Visualizer_VISUALIZER_CESIUM,
@@ -102,55 +112,59 @@ func TestInternalAPI_public(t *testing.T) {
102112
Visibility: lo.ToPtr("public"),
103113
})
104114
assert.Nil(t, err)
115+
checProject(t, ctx, r, res)
105116

106-
// -------- public
117+
// get -> public
107118
res2, err := client.GetProject(ctx, &pb.GetProjectRequest{
108119
ProjectId: res.Project.Id,
109120
})
110121
assert.Nil(t, err)
111122
assert.Equal(t, "public", res2.Project.Visibility)
112123

113-
// -------- private Project
124+
// create private Project
114125
res, err = client.CreateProject(ctx, &pb.CreateProjectRequest{
115126
TeamId: wID.String(),
116127
Visualizer: pb.Visualizer_VISUALIZER_CESIUM,
117-
Name: lo.ToPtr("Test Project1"),
118-
Description: lo.ToPtr("Test Description1"),
128+
Name: lo.ToPtr("Test Project2"),
129+
Description: lo.ToPtr("Test Description2"),
119130
CoreSupport: lo.ToPtr(true),
120131
Visibility: lo.ToPtr("private"),
121132
})
122133
assert.Nil(t, err)
134+
checProject(t, ctx, r, res)
123135

124-
// -------- private
136+
// get -> private
125137
res2, err = client.GetProject(ctx, &pb.GetProjectRequest{
126138
ProjectId: res.Project.Id,
127139
})
128140
assert.Nil(t, err)
129141
assert.Equal(t, "private", res2.Project.Visibility)
130142

131-
// -------- list size 3
132143
// 0: creante seeder => null
133144
// 1: creante public => public
134145
// 2: creante private => private
146+
147+
// Authenticated: true => get list size 3
135148
res3, err := client.GetProjectList(ctx, &pb.GetProjectListRequest{
136-
TeamId: wID.String(),
149+
TeamId: wID.String(),
150+
Authenticated: true,
137151
})
138152
assert.Nil(t, err)
139153
assert.Equal(t, 3, len(res3.Projects))
140154
assert.Equal(t, "", res3.Projects[0].Visibility)
141155
assert.Equal(t, "public", res3.Projects[1].Visibility)
142156
assert.Equal(t, "private", res3.Projects[2].Visibility)
143-
})
144157

145-
// User2 test
146-
runTestWithUser(t, uID2.String(), func(client pb.ReEarthVisualizerClient, ctx context.Context) {
147-
// -------- public list size 1 (Not authenticated)
148-
res3, err := client.GetProjectList(ctx, &pb.GetProjectListRequest{
149-
TeamId: wID.String(),
158+
// Authenticated: true => get list size 1
159+
res3, err = client.GetProjectList(ctx, &pb.GetProjectListRequest{
160+
TeamId: wID.String(),
161+
Authenticated: false,
150162
})
151163
assert.Nil(t, err)
152164
assert.Equal(t, 1, len(res3.Projects))
165+
153166
})
167+
154168
}
155169

156170
func runTestWithUser(t *testing.T, userID string, testFunc func(client pb.ReEarthVisualizerClient, ctx context.Context)) {
@@ -171,3 +185,16 @@ func runTestWithUser(t *testing.T, userID string, testFunc func(client pb.ReEart
171185
client := pb.NewReEarthVisualizerClient(conn)
172186
testFunc(client, ctx)
173187
}
188+
189+
func checProject(t *testing.T, ctx context.Context, r *repo.Container, res *pb.CreateProjectResponse) {
190+
pid, err := id.ProjectIDFrom(res.GetProject().Id)
191+
assert.Nil(t, err)
192+
prj, err := r.Project.FindByID(ctx, pid)
193+
assert.Nil(t, err)
194+
c, err := r.Scene.FindByProject(ctx, prj.ID())
195+
assert.Nil(t, err)
196+
assert.NotNil(t, c)
197+
s, err := r.Storytelling.FindByScene(ctx, c.ID())
198+
assert.Nil(t, err)
199+
assert.Equal(t, 1, len(*s))
200+
}

server/internal/adapter/gql/loader_project.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,13 @@ func (c *ProjectLoader) FindDeletedByWorkspace(ctx context.Context, wsID gqlmode
125125
}, nil
126126
}
127127

128-
func (c *ProjectLoader) VisibilityByWorkspace(ctx context.Context, wsID gqlmodel.ID) (*gqlmodel.ProjectConnection, error) {
128+
func (c *ProjectLoader) VisibilityByWorkspace(ctx context.Context, wsID gqlmodel.ID, authenticated bool) (*gqlmodel.ProjectConnection, error) {
129129
tid, err := gqlmodel.ToID[accountdomain.Workspace](wsID)
130130
if err != nil {
131131
return nil, err
132132
}
133133

134-
res, err := c.usecase.FindVisibilityByWorkspace(ctx, tid, getOperator(ctx))
134+
res, err := c.usecase.FindVisibilityByWorkspace(ctx, tid, authenticated, getOperator(ctx))
135135
if err != nil {
136136
return nil, err
137137
}

server/internal/adapter/gql/resolver_mutation_storytelling.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package gql
22

33
import (
44
"context"
5+
"encoding/json"
56
"errors"
7+
"fmt"
68

79
"github.com/reearth/reearth/server/internal/adapter/gql/gqlmodel"
810
"github.com/reearth/reearth/server/internal/usecase/interfaces"
@@ -22,6 +24,12 @@ func (r *mutationResolver) CreateStory(ctx context.Context, input gqlmodel.Creat
2224
Index: input.Index,
2325
}
2426

27+
b, err := json.MarshalIndent(inp, "", " ")
28+
if err != nil {
29+
fmt.Println("JSON Marshal error:", err)
30+
31+
}
32+
fmt.Println(string(b))
2533
res, err := usecases(ctx).StoryTelling.Create(ctx, inp, getOperator(ctx))
2634
if err != nil {
2735
return nil, err
@@ -150,6 +158,16 @@ func (r *mutationResolver) CreateStoryPage(ctx context.Context, input gqlmodel.C
150158
return nil, err
151159
}
152160

161+
// type CreatePageParam struct {
162+
// SceneID id.SceneID
163+
// StoryID id.StoryID
164+
// Title *string
165+
// Swipeable *bool
166+
// Layers *[]id.NLSLayerID
167+
// SwipeableLayers *[]id.NLSLayerID
168+
// Index *int
169+
// }
170+
153171
inp := interfaces.CreatePageParam{
154172
SceneID: sceneId,
155173
StoryID: storyId,

server/internal/adapter/gql/resolver_query.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,6 @@ func (r *queryResolver) DeletedProjects(ctx context.Context, teamId gqlmodel.ID)
187187
return loaders(ctx).Project.FindDeletedByWorkspace(ctx, teamId)
188188
}
189189

190-
func (r *queryResolver) VisibilityProjects(ctx context.Context, teamId gqlmodel.ID) (*gqlmodel.ProjectConnection, error) {
191-
return loaders(ctx).Project.VisibilityByWorkspace(ctx, teamId)
190+
func (r *queryResolver) VisibilityProjects(ctx context.Context, teamId gqlmodel.ID, authenticated bool) (*gqlmodel.ProjectConnection, error) {
191+
return loaders(ctx).Project.VisibilityByWorkspace(ctx, teamId, authenticated)
192192
}

server/internal/adapter/internalapi/schemas/internalapi/v1/schema.pb.go

Lines changed: 11 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/internal/adapter/internalapi/server.go

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func (s server) GetProjectList(ctx context.Context, req *pb.GetProjectListReques
2929
return nil, err
3030
}
3131

32-
res, err := uc.Project.FindVisibilityByWorkspace(ctx, wId, op)
32+
res, err := uc.Project.FindVisibilityByWorkspace(ctx, wId, req.Authenticated, op)
3333

3434
if err != nil {
3535
return nil, err
@@ -71,7 +71,6 @@ func (s server) CreateProject(ctx context.Context, req *pb.CreateProjectRequest)
7171
op, uc := adapter.Operator(ctx), adapter.Usecases(ctx)
7272

7373
wId, err := accountdomain.WorkspaceIDFrom(req.TeamId)
74-
7574
if err != nil {
7675
return nil, err
7776
}
@@ -84,7 +83,38 @@ func (s server) CreateProject(ctx context.Context, req *pb.CreateProjectRequest)
8483
CoreSupport: req.CoreSupport,
8584
Visibility: req.Visibility,
8685
}, op)
86+
if err != nil {
87+
return nil, err
88+
}
89+
90+
c, err := uc.Scene.Create(ctx, p.ID(), true, op)
91+
if err != nil {
92+
return nil, err
93+
}
8794

95+
index := 0
96+
storyInput := interfaces.CreateStoryInput{
97+
SceneID: c.ID(),
98+
Title: "Default",
99+
Index: &index,
100+
}
101+
st, err := uc.StoryTelling.Create(ctx, storyInput, op)
102+
if err != nil {
103+
return nil, err
104+
}
105+
106+
title := "Page"
107+
swipeable := false
108+
pageParam := interfaces.CreatePageParam{
109+
SceneID: c.ID(),
110+
StoryID: st.Id(),
111+
Title: &title,
112+
Swipeable: &swipeable,
113+
Layers: &[]id.NLSLayerID{},
114+
SwipeableLayers: &[]id.NLSLayerID{},
115+
Index: &index,
116+
}
117+
_, _, err = uc.StoryTelling.CreatePage(ctx, pageParam, op)
88118
if err != nil {
89119
return nil, err
90120
}

server/internal/app/server.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package app
33
import (
44
"context"
55
"net"
6+
"net/http"
67
"os"
78
"os/signal"
89

@@ -14,6 +15,7 @@ import (
1415
"github.com/reearth/reearthx/account/accountusecase/accountrepo"
1516
"github.com/reearth/reearthx/log"
1617
"golang.org/x/net/http2"
18+
"golang.org/x/net/http2/h2c"
1719
"google.golang.org/grpc"
1820
)
1921

@@ -83,16 +85,17 @@ func (w *WebServer) Run(ctx context.Context) {
8385
}
8486

8587
if w.internalServer != nil {
86-
l, err := net.Listen("tcp", w.internalPort)
87-
if err != nil {
88-
log.Fatalc(ctx, err.Error())
89-
}
9088
go func() {
91-
err = w.ServeGRPC(l)
92-
log.Fatalc(ctx, err.Error())
89+
handler := h2c.NewHandler(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
90+
if r.ProtoMajor == 2 && r.Header.Get("Content-Type") == "application/grpc" {
91+
w.internalServer.ServeHTTP(rw, r)
92+
}
93+
}), &http2.Server{})
94+
if err := http.ListenAndServe(w.internalPort, handler); err != nil {
95+
log.Fatalf("ListenAndServe failed: %v", err)
96+
}
9397
}()
94-
port := l.Addr().(*net.TCPAddr).Port
95-
log.Infof("server: started internal grpc server at %d", port)
98+
log.Infof("server: started internal grpc server at %d", w.internalPort)
9699
} else {
97100
go func() {
98101
err := w.appServer.StartH2CServer(w.address, &http2.Server{})

0 commit comments

Comments
 (0)