Skip to content

Commit fc87846

Browse files
committed
Add initial gateway implementation
Closes #3
1 parent 590a9dd commit fc87846

4 files changed

Lines changed: 172 additions & 0 deletions

File tree

go.mod

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// SPDX-FileCopyrightText: © 2026 Logan Magee
2+
//
3+
// SPDX-License-Identifier: AGPL-3.0-only
4+
5+
module golang.accrescent.app/console-grpc-gateway
6+
7+
go 1.26.0
8+
9+
require (
10+
buf.build/gen/go/accrescent/console-api/grpc-ecosystem/gateway/v2 v2.28.0-20260219033837-64def0185a8e.1
11+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0
12+
google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171
13+
google.golang.org/grpc v1.79.1
14+
)
15+
16+
require (
17+
buf.build/gen/go/accrescent/console-api/grpc/go v1.6.1-20260219033837-64def0185a8e.1 // indirect
18+
buf.build/gen/go/accrescent/console-api/protocolbuffers/go v1.36.11-20260219033837-64def0185a8e.1 // indirect
19+
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260209202127-80ab13bee0bf.1 // indirect
20+
buf.build/gen/go/grpc-ecosystem/grpc-gateway/protocolbuffers/go v1.36.11-20260102203250-6467306b4f62.1 // indirect
21+
cloud.google.com/go/longrunning v0.8.0 // indirect
22+
golang.org/x/net v0.51.0 // indirect
23+
golang.org/x/sys v0.41.0 // indirect
24+
golang.org/x/text v0.34.0 // indirect
25+
google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 // indirect
26+
google.golang.org/protobuf v1.36.11 // indirect
27+
)

go.sum

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
buf.build/gen/go/accrescent/console-api/grpc-ecosystem/gateway/v2 v2.28.0-20260219033837-64def0185a8e.1 h1:HoN8nFsf8sCqlr4Q0tLMx2f8P7ARG2b0fX7JSakc1ls=
2+
buf.build/gen/go/accrescent/console-api/grpc-ecosystem/gateway/v2 v2.28.0-20260219033837-64def0185a8e.1/go.mod h1:7G1M6qdpd8pXrC3TjD4zeneYb49i3yjIUpAdLx3i1rc=
3+
buf.build/gen/go/accrescent/console-api/grpc/go v1.6.1-20260219033837-64def0185a8e.1 h1:GCwcjyeWA27FWRT8hyulvcT6yVaS2Sv99DDg3+81wzw=
4+
buf.build/gen/go/accrescent/console-api/grpc/go v1.6.1-20260219033837-64def0185a8e.1/go.mod h1:skyPZciV/Y4DQogA9XIBYWnSYoEo1Ee01ANCoqa3A6M=
5+
buf.build/gen/go/accrescent/console-api/protocolbuffers/go v1.36.11-20260219033837-64def0185a8e.1 h1:jalDDZeCnwQLfTg6j/vhaZpFzidZNQhMPz/RgevxENI=
6+
buf.build/gen/go/accrescent/console-api/protocolbuffers/go v1.36.11-20260219033837-64def0185a8e.1/go.mod h1:DqgAVVZIIre13kqs6ZD2eTESKMSpIdbFynLXl7t0284=
7+
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260209202127-80ab13bee0bf.1 h1:PMmTMyvHScV9Mn8wc6ASge9uRcHy0jtqPd+fM35LmsQ=
8+
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260209202127-80ab13bee0bf.1/go.mod h1:tvtbpgaVXZX4g6Pn+AnzFycuRK3MOz5HJfEGeEllXYM=
9+
buf.build/gen/go/grpc-ecosystem/grpc-gateway/protocolbuffers/go v1.36.11-20260102203250-6467306b4f62.1 h1:1L6+uMVRfpetc9KKitISZKmsWGn70Bn6k+TkYYxhW0k=
10+
buf.build/gen/go/grpc-ecosystem/grpc-gateway/protocolbuffers/go v1.36.11-20260102203250-6467306b4f62.1/go.mod h1:KAAU6zfI4aGOR/SiWil31PiNwdpo1SlqZidcB3z+sL0=
11+
cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8=
12+
cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk=
13+
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
14+
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
15+
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
16+
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
17+
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
18+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
19+
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
20+
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
21+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
22+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
23+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
24+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
25+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs=
26+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c=
27+
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
28+
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
29+
go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48=
30+
go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8=
31+
go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0=
32+
go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs=
33+
go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18=
34+
go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE=
35+
go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8=
36+
go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew=
37+
go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI=
38+
go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA=
39+
golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo=
40+
golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y=
41+
golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
42+
golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
43+
golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=
44+
golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=
45+
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
46+
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
47+
google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 h1:tu/dtnW1o3wfaxCOjSLn5IRX4YDcJrtlpzYkhHhGaC4=
48+
google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171/go.mod h1:M5krXqk4GhBKvB596udGL3UyjL4I1+cTbK0orROM9ng=
49+
google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ=
50+
google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
51+
google.golang.org/grpc v1.79.1 h1:zGhSi45ODB9/p3VAawt9a+O/MULLl9dpizzNNpq7flY=
52+
google.golang.org/grpc v1.79.1/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ=
53+
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
54+
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=

go.sum.license

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
SPDX-FileCopyrightText: © 2026 Logan Magee
2+
3+
SPDX-License-Identifier: AGPL-3.0-only

main.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// SPDX-FileCopyrightText: © 2026 Logan Magee
2+
//
3+
// SPDX-License-Identifier: AGPL-3.0-only
4+
5+
package main
6+
7+
import (
8+
"context"
9+
"flag"
10+
"fmt"
11+
"log"
12+
"net/http"
13+
14+
gw "buf.build/gen/go/accrescent/console-api/grpc-ecosystem/gateway/v2/accrescent/console/v1alpha1/consolev1alpha1gateway"
15+
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
16+
_ "google.golang.org/genproto/googleapis/rpc/errdetails"
17+
"google.golang.org/grpc"
18+
"google.golang.org/grpc/credentials/insecure"
19+
"google.golang.org/grpc/grpclog"
20+
)
21+
22+
func main() {
23+
cfg := &config{}
24+
flag.StringVar(
25+
&cfg.backendEndpoint,
26+
"grpc-server-endpoint",
27+
"localhost:50051",
28+
"gRPC server endpoint",
29+
)
30+
flag.UintVar(
31+
&cfg.listenPort,
32+
"listen-port",
33+
8080,
34+
"port to listen on",
35+
)
36+
flag.Parse()
37+
38+
if err := run(cfg); err != nil {
39+
grpclog.Fatal(err)
40+
}
41+
}
42+
43+
type config struct {
44+
backendEndpoint string
45+
listenPort uint
46+
}
47+
48+
func run(config *config) error {
49+
ctx := context.Background()
50+
ctx, cancel := context.WithCancel(ctx)
51+
defer cancel()
52+
53+
opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}
54+
conn, err := grpc.NewClient(config.backendEndpoint, opts...)
55+
if err != nil {
56+
return err
57+
}
58+
defer func() {
59+
if cerr := conn.Close(); err != nil {
60+
grpclog.Errorf("Failed to close conn to %s: %v", config.backendEndpoint, cerr)
61+
}
62+
}()
63+
64+
mux := runtime.NewServeMux()
65+
if err := gw.RegisterAppDraftServiceHandler(ctx, mux, conn); err != nil {
66+
return err
67+
}
68+
if err := gw.RegisterAppEditServiceHandler(ctx, mux, conn); err != nil {
69+
return err
70+
}
71+
if err := gw.RegisterAppServiceHandler(ctx, mux, conn); err != nil {
72+
return err
73+
}
74+
if err := gw.RegisterOrganizationServiceHandler(ctx, mux, conn); err != nil {
75+
return err
76+
}
77+
if err := gw.RegisterReviewServiceHandler(ctx, mux, conn); err != nil {
78+
return err
79+
}
80+
if err := gw.RegisterUserServiceHandler(ctx, mux, conn); err != nil {
81+
return err
82+
}
83+
84+
listenAddr := fmt.Sprintf(":%d", config.listenPort)
85+
log.Printf("Starting gateway on %s", listenAddr)
86+
87+
return http.ListenAndServe(listenAddr, mux)
88+
}

0 commit comments

Comments
 (0)