better crud handler

This commit is contained in:
d34dscene
2025-07-28 19:44:32 +02:00
parent b18a907115
commit aef27f051f
127 changed files with 6117 additions and 9591 deletions

View File

@@ -14,6 +14,10 @@ all: clean build
clean:
rm -rf $(PWD)/$(BIN) $(PWD)/$(BIN)-agent $(PWD)/web/build $(PWD)/builds
.PHONY: run
run:
go run -tags=dev .
.PHONY: audit
audit-security:
- gosec --exclude=G104 ./...
@@ -62,6 +66,7 @@ upgrade:
go get -u && go mod tidy
cd web && pnpm update
.PHONY: db-up
db-up:
goose sqlite3 data/mantrae.db -dir internal/store/migrations up-by-one

View File

@@ -2,5 +2,5 @@
version: v2
deps:
- name: buf.build/bufbuild/protovalidate
commit: 9f2d3c737feb481a83375159c0733275
digest: b5:19d3b83f7df2d284ff5935f4622d7f27e7464a93c210edb536e92a52bcc69b2a18da1312e96b5461601eba7b3764d5e90321bd62e6966870e7dbc2e4dedd98d6
commit: 6c6e0d3c608e4549802254a2eee81bc8
digest: b5:a7ca081f38656fc0f5aaa685cc111d3342876723851b47ca6b80cbb810cbb2380f8c444115c495ada58fa1f85eff44e68dc54a445761c195acdb5e8d9af675b6

View File

@@ -9,4 +9,4 @@ breaking:
use:
- FILE
deps:
- buf.build/bufbuild/protovalidate:v0.13.3
- buf.build/bufbuild/protovalidate:v0.14.2

65
go.mod
View File

@@ -1,63 +1,64 @@
module github.com/mizuchilabs/mantrae
go 1.24.4
go 1.24.5
require (
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250625184727-c923a0c2a132.1
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250717185734-6c6e0d3c608e.1
connectrpc.com/connect v1.18.1
connectrpc.com/cors v0.1.0
connectrpc.com/grpchealth v1.4.0
connectrpc.com/grpcreflect v1.3.0
connectrpc.com/validate v0.3.0
github.com/aws/aws-sdk-go-v2 v1.36.5
github.com/aws/aws-sdk-go-v2/config v1.29.17
github.com/aws/aws-sdk-go-v2/credentials v1.17.70
github.com/aws/aws-sdk-go-v2/service/s3 v1.84.0
github.com/aws/aws-sdk-go-v2 v1.36.6
github.com/aws/aws-sdk-go-v2/config v1.29.18
github.com/aws/aws-sdk-go-v2/credentials v1.17.71
github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1
github.com/caarlos0/env/v11 v11.3.1
github.com/cloudflare/cloudflare-go v0.115.0
github.com/coreos/go-oidc/v3 v3.14.1
github.com/docker/docker v27.4.1+incompatible
github.com/docker/docker v28.3.2+incompatible
github.com/domodwyer/mailyak/v3 v3.6.2
github.com/golang-jwt/jwt/v5 v5.2.3
github.com/google/uuid v1.6.0
github.com/hypersequent/zen v0.0.0-20250317110808-f521ea1d4fc3
github.com/hypersequent/zen v0.0.0-20250722075626-67d8f7873a72
github.com/joeig/go-powerdns/v3 v3.16.0
github.com/pressly/goose/v3 v3.24.3
github.com/rs/cors v1.11.1
github.com/stretchr/testify v1.10.0
github.com/traefik/paerser v0.2.2
github.com/traefik/traefik/v3 v3.4.4
github.com/traefik/traefik/v3 v3.4.5
golang.org/x/crypto v0.40.0
golang.org/x/net v0.42.0
golang.org/x/oauth2 v0.30.0
golang.org/x/sync v0.16.0
google.golang.org/protobuf v1.36.6
gopkg.in/yaml.v3 v3.0.1
modernc.org/sqlite v1.38.0
sigs.k8s.io/yaml v1.5.0
modernc.org/sqlite v1.38.1
)
require (
buf.build/go/protovalidate v0.13.1 // indirect
buf.build/go/protovalidate v0.14.0 // indirect
cel.dev/expr v0.24.0 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.36 // indirect
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.4 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.25.5 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 // indirect
github.com/aws/smithy-go v1.22.4 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.25.6 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.34.1 // indirect
github.com/aws/smithy-go v1.22.5 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/cenkalti/backoff/v5 v5.0.2 // indirect
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
github.com/containerd/errdefs v1.0.0 // indirect
github.com/containerd/errdefs/pkg v0.3.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/distribution/reference v0.6.0 // indirect
github.com/docker/go-connections v0.5.0 // indirect
@@ -65,7 +66,7 @@ require (
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fsnotify/fsnotify v1.9.0 // indirect
github.com/go-acme/lego/v4 v4.24.0 // indirect
github.com/go-acme/lego/v4 v4.25.1 // indirect
github.com/go-jose/go-jose/v4 v4.1.1 // indirect
github.com/go-kit/log v0.2.1 // indirect
github.com/go-logfmt/logfmt v0.6.0 // indirect
@@ -85,6 +86,7 @@ require (
github.com/mfridman/interpolate v0.0.2 // indirect
github.com/miekg/dns v1.1.67 // indirect
github.com/moby/docker-image-spec v1.3.1 // indirect
github.com/moby/sys/atomicwriter v0.1.0 // indirect
github.com/ncruces/go-strftime v0.1.9 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.1.0 // indirect
@@ -97,7 +99,7 @@ require (
github.com/stoewer/go-strcase v1.3.1 // indirect
github.com/unrolled/render v1.7.0 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect
go.opentelemetry.io/otel v1.37.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.13.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.13.0 // indirect
@@ -111,18 +113,17 @@ require (
go.opentelemetry.io/otel/trace v1.37.0 // indirect
go.opentelemetry.io/proto/otlp v1.7.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.yaml.in/yaml/v2 v2.4.2 // indirect
golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc // indirect
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 // indirect
golang.org/x/mod v0.26.0 // indirect
golang.org/x/sys v0.34.0 // indirect
golang.org/x/text v0.27.0 // indirect
golang.org/x/time v0.12.0 // indirect
golang.org/x/tools v0.35.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250715232539-7130f93afb79 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250715232539-7130f93afb79 // indirect
google.golang.org/grpc v1.73.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250721164621-a45f3dfb1074 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250721164621-a45f3dfb1074 // indirect
google.golang.org/grpc v1.74.2 // indirect
gotest.tools/v3 v3.5.2 // indirect
modernc.org/libc v1.66.3 // indirect
modernc.org/libc v1.66.4 // indirect
modernc.org/mathutil v1.7.1 // indirect
modernc.org/memory v1.11.0 // indirect
)

134
go.sum
View File

@@ -1,7 +1,7 @@
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250625184727-c923a0c2a132.1 h1:6tCo3lsKNLqUjRPhyc8JuYWYUiQkulufxSDOfG1zgWQ=
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250625184727-c923a0c2a132.1/go.mod h1:avRlCjnFzl98VPaeCtJ24RrV/wwHFzB8sWXhj26+n/U=
buf.build/go/protovalidate v0.13.1 h1:6loHDTWdY/1qmqmt1MijBIKeN4T9Eajrqb9isT1W1s8=
buf.build/go/protovalidate v0.13.1/go.mod h1:C/QcOn/CjXRn5udUwYBiLs8y1TGy7RS+GOSKqjS77aU=
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250717185734-6c6e0d3c608e.1 h1:Lg6klmCi3v7VvpqeeLEER9/m5S8y9e9DjhqQnSCNy4k=
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250717185734-6c6e0d3c608e.1/go.mod h1:avRlCjnFzl98VPaeCtJ24RrV/wwHFzB8sWXhj26+n/U=
buf.build/go/protovalidate v0.14.0 h1:kr/rC/no+DtRyYX+8KXLDxNnI1rINz0imk5K44ZpZ3A=
buf.build/go/protovalidate v0.14.0/go.mod h1:+F/oISho9MO7gJQNYC2VWLzcO1fTPmaTA08SDYJZncA=
cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=
cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
connectrpc.com/connect v1.18.1 h1:PAg7CjSAGvscaf6YZKUefjoih5Z/qYkyaTrBW8xvYPw=
@@ -22,50 +22,54 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ=
github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw=
github.com/aws/aws-sdk-go-v2 v1.36.5 h1:0OF9RiEMEdDdZEMqF9MRjevyxAQcf6gY+E7vwBILFj0=
github.com/aws/aws-sdk-go-v2 v1.36.5/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0=
github.com/aws/aws-sdk-go-v2 v1.36.6 h1:zJqGjVbRdTPojeCGWn5IR5pbJwSQSBh5RWFTQcEQGdU=
github.com/aws/aws-sdk-go-v2 v1.36.6/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 h1:12SpdwU8Djs+YGklkinSSlcrPyj3H4VifVsKf78KbwA=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11/go.mod h1:dd+Lkp6YmMryke+qxW/VnKyhMBDTYP41Q2Bb+6gNZgY=
github.com/aws/aws-sdk-go-v2/config v1.29.17 h1:jSuiQ5jEe4SAMH6lLRMY9OVC+TqJLP5655pBGjmnjr0=
github.com/aws/aws-sdk-go-v2/config v1.29.17/go.mod h1:9P4wwACpbeXs9Pm9w1QTh6BwWwJjwYvJ1iCt5QbCXh8=
github.com/aws/aws-sdk-go-v2/credentials v1.17.70 h1:ONnH5CM16RTXRkS8Z1qg7/s2eDOhHhaXVd72mmyv4/0=
github.com/aws/aws-sdk-go-v2/credentials v1.17.70/go.mod h1:M+lWhhmomVGgtuPOhO85u4pEa3SmssPTdcYpP/5J/xc=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32 h1:KAXP9JSHO1vKGCr5f4O6WmlVKLFFXgWYAGoJosorxzU=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32/go.mod h1:h4Sg6FQdexC1yYG9RDnOvLbW1a/P986++/Y/a+GyEM8=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 h1:SsytQyTMHMDPspp+spo7XwXTP44aJZZAC7fBV2C5+5s=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36/go.mod h1:Q1lnJArKRXkenyog6+Y+zr7WDpk4e6XlR6gs20bbeNo=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 h1:i2vNHQiXUvKhs3quBR6aqlgJaiaexz/aNvdCktW/kAM=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36/go.mod h1:UdyGa7Q91id/sdyHPwth+043HhmP6yP9MBHgbZM0xo8=
github.com/aws/aws-sdk-go-v2/config v1.29.18 h1:x4T1GRPnqKV8HMJOMtNktbpQMl3bIsfx8KbqmveUO2I=
github.com/aws/aws-sdk-go-v2/config v1.29.18/go.mod h1:bvz8oXugIsH8K7HLhBv06vDqnFv3NsGDt2Znpk7zmOU=
github.com/aws/aws-sdk-go-v2/credentials v1.17.71 h1:r2w4mQWnrTMJjOyIsZtGp3R3XGY3nqHn8C26C2lQWgA=
github.com/aws/aws-sdk-go-v2/credentials v1.17.71/go.mod h1:E7VF3acIup4GB5ckzbKFrCK0vTvEQxOxgdq4U3vcMCY=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 h1:D9ixiWSG4lyUBL2DDNK924Px9V/NBVpML90MHqyTADY=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33/go.mod h1:caS/m4DI+cij2paz3rtProRBI4s/+TCiWoaWZuQ9010=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 h1:osMWfm/sC/L4tvEdQ65Gri5ZZDCUpuYJZbTTDrsn4I0=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37/go.mod h1:ZV2/1fbjOPr4G4v38G3Ww5TBT4+hmsK45s/rxu1fGy0=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 h1:v+X21AvTb2wZ+ycg1gx+orkB/9U6L7AOp93R7qYxsxM=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37/go.mod h1:G0uM1kyssELxmJ2VZEfG0q2npObR3BAkF3c1VsfVnfs=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.36 h1:GMYy2EOWfzdP3wfVAGXBNKY5vK4K8vMET4sYOYltmqs=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.36/go.mod h1:gDhdAV6wL3PmPqBhiPbnlS447GoWs8HTTOYef9/9Inw=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37 h1:XTZZ0I3SZUHAtBLBU6395ad+VOblE0DwQP6MuaNeics=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.37/go.mod h1:Pi6ksbniAWVwu2S8pEzcYPyhUkAcLaufxN7PfAUQjBk=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 h1:CXV68E2dNqhuynZJPB80bhPQwAKqBWVer887figW6Jc=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4/go.mod h1:/xFi9KtvBXP97ppCz1TAEvU1Uf66qvid89rbem3wCzQ=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.4 h1:nAP2GYbfh8dd2zGZqFRSMlq+/F6cMPBUuCsGAMkN074=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.4/go.mod h1:LT10DsiGjLWh4GbjInf9LQejkYEhBgBCjLG5+lvk4EE=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 h1:t0E6FzREdtCsiLIoLCWsYliNsRBgyGD/MCK571qk4MI=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17/go.mod h1:ygpklyoaypuyDvOM5ujWGrYWpAK3h7ugnmKCU/76Ys4=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17 h1:qcLWgdhq45sDM9na4cvXax9dyLitn8EYBRl8Ak4XtG4=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17/go.mod h1:M+jkjBFZ2J6DJrjMv2+vkBbuht6kxJYtJiwoVgX4p4U=
github.com/aws/aws-sdk-go-v2/service/s3 v1.84.0 h1:0reDqfEN+tB+sozj2r92Bep8MEwBZgtAXTND1Kk9OXg=
github.com/aws/aws-sdk-go-v2/service/s3 v1.84.0/go.mod h1:kUklwasNoCn5YpyAqC/97r6dzTA1SRKJfKq16SXeoDU=
github.com/aws/aws-sdk-go-v2/service/sso v1.25.5 h1:AIRJ3lfb2w/1/8wOOSqYb9fUKGwQbtysJ2H1MofRUPg=
github.com/aws/aws-sdk-go-v2/service/sso v1.25.5/go.mod h1:b7SiVprpU+iGazDUqvRSLf5XmCdn+JtT1on7uNL6Ipc=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3 h1:BpOxT3yhLwSJ77qIY3DoHAQjZsc4HEGfMCE4NGy3uFg=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3/go.mod h1:vq/GQR1gOFLquZMSrxUK/cpvKCNVYibNyJ1m7JrU88E=
github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 h1:NFOJ/NXEGV4Rq//71Hs1jC/NvPs1ezajK+yQmkwnPV0=
github.com/aws/aws-sdk-go-v2/service/sts v1.34.0/go.mod h1:7ph2tGpfQvwzgistp2+zga9f+bCjlQJPkPUmMgDSD7w=
github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw=
github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5 h1:M5/B8JUaCI8+9QD+u3S/f4YHpvqE9RpSkV3rf0Iks2w=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.5/go.mod h1:Bktzci1bwdbpuLiu3AOksiNPMl/LLKmX1TWmqp2xbvs=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 h1:vvbXsA2TVO80/KT7ZqCbx934dt6PY+vQ8hZpUZ/cpYg=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18/go.mod h1:m2JJHledjBGNMsLOF1g9gbAxprzq3KjC8e4lxtn+eWg=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18 h1:OS2e0SKqsU2LiJPqL8u9x41tKc6MMEHrWjLVLn3oysg=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.18/go.mod h1:+Yrk+MDGzlNGxCXieljNeWpoZTCQUQVL+Jk9hGGJ8qM=
github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1 h1:RkHXU9jP0DptGy7qKI8CBGsUJruWz0v5IgwBa2DwWcU=
github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1/go.mod h1:3xAOf7tdKF+qbb+XpU+EPhNXAdun3Lu1RcDrj8KC24I=
github.com/aws/aws-sdk-go-v2/service/sso v1.25.6 h1:rGtWqkQbPk7Bkwuv3NzpE/scwwL9sC1Ul3tn9x83DUI=
github.com/aws/aws-sdk-go-v2/service/sso v1.25.6/go.mod h1:u4ku9OLv4TO4bCPdxf4fA1upaMaJmP9ZijGk3AAOC6Q=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4 h1:OV/pxyXh+eMA0TExHEC4jyWdumLxNbzz1P0zJoezkJc=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4/go.mod h1:8Mm5VGYwtm+r305FfPSuc+aFkrypeylGYhFim6XEPoc=
github.com/aws/aws-sdk-go-v2/service/sts v1.34.1 h1:aUrLQwJfZtwv3/ZNG2xRtEen+NqI3iesuacjP51Mv1s=
github.com/aws/aws-sdk-go-v2/service/sts v1.34.1/go.mod h1:3wFBZKoWnX3r+Sm7in79i54fBmNfwhdNdQuscCw7QIk=
github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw=
github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
github.com/caarlos0/env/v11 v11.3.1 h1:cArPWC15hWmEt+gWk7YBi7lEXTXCvpaSdCiZE2X5mCA=
github.com/caarlos0/env/v11 v11.3.1/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8=
github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
github.com/cloudflare/cloudflare-go v0.115.0 h1:84/dxeeXweCc0PN5Cto44iTA8AkG1fyT11yPO5ZB7sM=
github.com/cloudflare/cloudflare-go v0.115.0/go.mod h1:Ds6urDwn/TF2uIU24mu7H91xkKP8gSAHxQ44DSZgVmU=
github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=
github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE=
github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk=
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
github.com/coreos/go-oidc/v3 v3.14.1 h1:9ePWwfdwC4QKRlCXsJGou56adA/owXczOzwKdOumLqk=
@@ -77,8 +81,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
github.com/docker/docker v27.4.1+incompatible h1:ZJvcY7gfwHn1JF48PfbyXg7Jyt9ZCWDW+GGXOIxEwp4=
github.com/docker/docker v27.4.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker v28.3.2+incompatible h1:wn66NJ6pWB1vBZIilP8G3qQPqHy5XymfYn5vsqeA5oA=
github.com/docker/docker v28.3.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
@@ -91,8 +95,8 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
github.com/go-acme/lego/v4 v4.24.0 h1:pe0q49JKxfSGEP3lkgkMVQrZM1KbD+e0dpJ2McYsiVw=
github.com/go-acme/lego/v4 v4.24.0/go.mod h1:hkstZY6D0jylIrZbuNmEQrWQxTIfaJH7prwaWvKDOjw=
github.com/go-acme/lego/v4 v4.25.1 h1:AYPUM7quPN/g2PcjjWw8sAMz3eV+Z8UWkr1kitDOyVA=
github.com/go-acme/lego/v4 v4.25.1/go.mod h1:OORYyVNZPaNdIdVYCGSBNRNZDIjhQbPuFxwGDgWj/yM=
github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI=
github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA=
github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
@@ -136,8 +140,8 @@ github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKe
github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/http-wasm/http-wasm-host-go v0.7.0 h1:+1KrRyOO6tWiDB24QrtSYyDmzFLBBs3jioKaUT0mq1c=
github.com/http-wasm/http-wasm-host-go v0.7.0/go.mod h1:adXKcLmL7yuavH/e0kBAp7b3TgAHTo/enCduyN5bXGM=
github.com/hypersequent/zen v0.0.0-20250317110808-f521ea1d4fc3 h1:hql4suSs7RG3+t5UyjdPXIzBmXg6AyFoqRRF+TPR3yY=
github.com/hypersequent/zen v0.0.0-20250317110808-f521ea1d4fc3/go.mod h1:uJ9mqUok1RHIAoVlkWxPHJqXNLwhLzh7jCUbp2V9Rws=
github.com/hypersequent/zen v0.0.0-20250722075626-67d8f7873a72 h1:UZDF6GL/6lKg4U+s0BoliT6SMmFtv3H+iRe074FDtVQ=
github.com/hypersequent/zen v0.0.0-20250722075626-67d8f7873a72/go.mod h1:uJ9mqUok1RHIAoVlkWxPHJqXNLwhLzh7jCUbp2V9Rws=
github.com/jarcoal/httpmock v1.4.0 h1:BvhqnH0JAYbNudL2GMJKgOHe2CtKlzJ/5rWKyp+hc2k=
github.com/jarcoal/httpmock v1.4.0/go.mod h1:ftW1xULwo+j0R0JJkJIIi7UKigZUXCLLanykgjwBXL0=
github.com/joeig/go-powerdns/v3 v3.16.0 h1:d6k0dVlBYr+B9P5U+74rVY1VmQxUG6Qdtlb3F33cBLQ=
@@ -163,6 +167,10 @@ github.com/miekg/dns v1.1.67 h1:kg0EHj0G4bfT5/oOys6HhZw4vmMlnoZ+gDu8tJ/AlI0=
github.com/miekg/dns v1.1.67/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps=
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw=
github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs=
github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU=
github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko=
github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
@@ -211,8 +219,8 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/traefik/paerser v0.2.2 h1:cpzW/ZrQrBh3mdwD/jnp6aXASiUFKOVr6ldP+keJTcQ=
github.com/traefik/paerser v0.2.2/go.mod h1:7BBDd4FANoVgaTZG+yh26jI6CA2nds7D/4VTEdIsh24=
github.com/traefik/traefik/v3 v3.4.4 h1:nyED7zCMwiDMDk3Ir2dIEulZ0MmFcUoe3tGGFriRlHs=
github.com/traefik/traefik/v3 v3.4.4/go.mod h1:Y4hpTBVjDgNp4YlTMp4cope+H0aZ8isgFD50QIyxxa0=
github.com/traefik/traefik/v3 v3.4.5 h1:vamkf2bL9ZUlir8h0vpfYZXGFcrnuiMCcAGMZhiLWJ8=
github.com/traefik/traefik/v3 v3.4.5/go.mod h1:rwq0+07S6ugXdFuB250anSgLQFOVDFvqurNR1BVDocw=
github.com/unrolled/render v1.7.0 h1:1yke01/tZiZpiXfUG+zqB+6fq3G4I+KDmnh0EhPq7So=
github.com/unrolled/render v1.7.0/go.mod h1:LwQSeDhjml8NLjIO9GJO1/1qpFJxtfVIpzxXKjfVkoI=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -221,8 +229,8 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/collector/pdata v1.10.0 h1:oLyPLGvPTQrcRT64ZVruwvmH/u3SHTfNo01pteS4WOE=
go.opentelemetry.io/collector/pdata v1.10.0/go.mod h1:IHxHsp+Jq/xfjORQMDJjSH6jvedOSTOyu3nbxqhWSYE=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q=
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.13.0 h1:z6lNIajgEBVtQZHjfw2hAccPEBDs+nx58VemmXWa2ec=
@@ -245,8 +253,8 @@ go.opentelemetry.io/otel/sdk/log v0.13.0 h1:I3CGUszjM926OphK8ZdzF+kLqFvfRY/IIoFq
go.opentelemetry.io/otel/sdk/log v0.13.0/go.mod h1:lOrQyCCXmpZdN7NchXb6DOZZa1N5G1R2tm5GMMTpDBw=
go.opentelemetry.io/otel/sdk/log/logtest v0.13.0 h1:9yio6AFZ3QD9j9oqshV1Ibm9gPLlHNxurno5BreMtIA=
go.opentelemetry.io/otel/sdk/log/logtest v0.13.0/go.mod h1:QOGiAJHl+fob8Nu85ifXfuQYmJTFAvcrxL6w5/tu168=
go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o=
go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=
go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
@@ -255,17 +263,13 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE=
go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc h1:TS73t7x3KarrNd5qAipmspBDS1rkMcgVG/fS1aRb4Rc=
golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc=
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4=
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
@@ -311,12 +315,12 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/genproto/googleapis/api v0.0.0-20250715232539-7130f93afb79 h1:iOye66xuaAK0WnkPuhQPUFy8eJcmwUXqGGP3om6IxX8=
google.golang.org/genproto/googleapis/api v0.0.0-20250715232539-7130f93afb79/go.mod h1:HKJDgKsFUnv5VAGeQjz8kxcgDP0HoE0iZNp0OdZNlhE=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250715232539-7130f93afb79 h1:1ZwqphdOdWYXsUHgMpU/101nCtf/kSp9hOrcvFsnl10=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250715232539-7130f93afb79/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok=
google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc=
google.golang.org/genproto/googleapis/api v0.0.0-20250721164621-a45f3dfb1074 h1:mVXdvnmR3S3BQOqHECm9NGMjYiRtEvDYcqAqedTXY6s=
google.golang.org/genproto/googleapis/api v0.0.0-20250721164621-a45f3dfb1074/go.mod h1:vYFwMYFbmA8vl6Z/krj/h7+U/AqpHknwJX4Uqgfyc7I=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250721164621-a45f3dfb1074 h1:qJW29YvkiJmXOYMu5Tf8lyrTp3dOS+K4z6IixtLaCf8=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250721164621-a45f3dfb1074/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM=
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -337,8 +341,8 @@ modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks=
modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI=
modernc.org/libc v1.66.3 h1:cfCbjTUcdsKyyZZfEUKfoHcP3S0Wkvz3jgSzByEWVCQ=
modernc.org/libc v1.66.3/go.mod h1:XD9zO8kt59cANKvHPXpx7yS2ELPheAey0vjIuZOhOU8=
modernc.org/libc v1.66.4 h1:EW4EaqAVngI6f5KWiFibu41IYFMv/F7KEtR+NRHrS/Q=
modernc.org/libc v1.66.4/go.mod h1:XD9zO8kt59cANKvHPXpx7yS2ELPheAey0vjIuZOhOU8=
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=
@@ -347,11 +351,9 @@ modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=
modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
modernc.org/sqlite v1.38.0 h1:+4OrfPQ8pxHKuWG4md1JpR/EYAh3Md7TdejuuzE7EUI=
modernc.org/sqlite v1.38.0/go.mod h1:1Bj+yES4SVvBZ4cBOpVZ6QgesMCKpJZDq0nxYzOpmNE=
modernc.org/sqlite v1.38.1 h1:jNnIjleVta+DKSAr3TnkKK87EEhjPhBLzi6hvIX9Bas=
modernc.org/sqlite v1.38.1/go.mod h1:cPTJYSlgg3Sfg046yBShXENNtPrWrDX8bsbAQBzgQ5E=
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
sigs.k8s.io/yaml v1.5.0 h1:M10b2U7aEUY6hRtU870n2VTPgR5RZiL/I6Lcc2F4NUQ=
sigs.k8s.io/yaml v1.5.0/go.mod h1:wZs27Rbxoai4C0f8/9urLZtZtF3avA3gKvGyPdDqTO4=

View File

@@ -13,10 +13,10 @@ import (
"time"
"github.com/mizuchilabs/mantrae/internal/config"
"github.com/mizuchilabs/mantrae/internal/convert"
"github.com/mizuchilabs/mantrae/internal/storage"
"github.com/mizuchilabs/mantrae/internal/traefik"
"github.com/traefik/traefik/v3/pkg/config/dynamic"
"sigs.k8s.io/yaml"
"gopkg.in/yaml.v3"
)
func UploadAvatar(a *config.App) http.HandlerFunc {
@@ -173,7 +173,7 @@ func UploadBackup(a *config.App) http.HandlerFunc {
return
}
if err = convert.DynamicToDB(r.Context(), *a.Conn.GetQuery(), profileIDValue, dynamic); err != nil {
if err = traefik.DynamicToDB(r.Context(), *a.Conn.GetQuery(), profileIDValue, dynamic); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}

View File

@@ -159,7 +159,6 @@ func (s *Server) registerServices() {
mantraev1connect.BackupServiceName,
mantraev1connect.UtilServiceName,
mantraev1connect.AuditLogServiceName,
// mantraev1connect.EventServiceName,
}
checker := grpchealth.NewStaticChecker(serviceNames...)
@@ -256,10 +255,6 @@ func (s *Server) registerServices() {
service.NewAuditLogService(s.app),
opts...,
))
// s.mux.Handle(mantraev1connect.NewEventServiceHandler(
// service.NewEventService(s.app),
// opts...,
// ))
// HTTP middlewares -------------------------------------------------------
mw := middlewares.NewMiddlewareHandler(s.app)

View File

@@ -10,7 +10,6 @@ import (
"github.com/google/uuid"
"github.com/mizuchilabs/mantrae/internal/config"
"github.com/mizuchilabs/mantrae/internal/convert"
"github.com/mizuchilabs/mantrae/internal/settings"
"github.com/mizuchilabs/mantrae/internal/store/db"
"github.com/mizuchilabs/mantrae/pkg/meta"
@@ -33,9 +32,8 @@ func (s *AgentService) GetAgent(
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.GetAgentResponse{
Agent: convert.AgentToProto(&result),
Agent: result.ToProto(),
}), nil
}
@@ -43,38 +41,31 @@ func (s *AgentService) CreateAgent(
ctx context.Context,
req *connect.Request[mantraev1.CreateAgentRequest],
) (*connect.Response[mantraev1.CreateAgentResponse], error) {
id, err := uuid.NewV7()
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
params := db.CreateAgentParams{
ID: uuid.NewString(),
ProfileID: req.Msg.ProfileId,
}
serverURL, err := s.app.Conn.GetQuery().GetSetting(ctx, settings.KeyServerURL)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if serverURL.Value == "" {
serverURL, ok := s.app.SM.Get(ctx, settings.KeyServerURL)
if !ok || serverURL == "" {
return nil, connect.NewError(
connect.CodeInvalidArgument,
connect.CodeInternal,
errors.New("server url is required, check your settings"),
)
}
token, err := s.createToken(id.String(), req.Msg.ProfileId)
token, err := s.createToken(params.ID, req.Msg.ProfileId)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
params.Token = *token
result, err := s.app.Conn.GetQuery().CreateAgent(ctx, db.CreateAgentParams{
ID: id.String(),
ProfileID: req.Msg.ProfileId,
Token: *token,
})
result, err := s.app.Conn.GetQuery().CreateAgent(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.CreateAgentResponse{
Agent: convert.AgentToProto(&result),
Agent: result.ToProto(),
}), nil
}
@@ -82,19 +73,20 @@ func (s *AgentService) UpdateAgentIP(
ctx context.Context,
req *connect.Request[mantraev1.UpdateAgentIPRequest],
) (*connect.Response[mantraev1.UpdateAgentIPResponse], error) {
if err := s.app.Conn.GetQuery().UpdateAgentIP(ctx, db.UpdateAgentIPParams{
params := db.UpdateAgentIPParams{
ID: req.Msg.Id,
ActiveIp: &req.Msg.Ip,
}); err != nil {
}
if err := s.app.Conn.GetQuery().UpdateAgentIP(ctx, params); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().GetAgent(ctx, req.Msg.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.UpdateAgentIPResponse{
Agent: convert.AgentToProto(&result),
Agent: result.ToProto(),
}), nil
}
@@ -105,7 +97,6 @@ func (s *AgentService) DeleteAgent(
if err := s.app.Conn.GetQuery().DeleteAgent(ctx, req.Msg.Id); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.DeleteAgentResponse{}), nil
}
@@ -113,30 +104,26 @@ func (s *AgentService) ListAgents(
ctx context.Context,
req *connect.Request[mantraev1.ListAgentsRequest],
) (*connect.Response[mantraev1.ListAgentsResponse], error) {
var params db.ListAgentsParams
params.ProfileID = req.Msg.ProfileId
if req.Msg.Limit == nil {
params.Limit = 100
} else {
params.Limit = *req.Msg.Limit
}
if req.Msg.Offset == nil {
params.Offset = 0
} else {
params.Offset = *req.Msg.Offset
params := db.ListAgentsParams{
ProfileID: req.Msg.ProfileId,
Limit: req.Msg.Limit,
Offset: req.Msg.Offset,
}
result, err := s.app.Conn.GetQuery().ListAgents(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
totalCount, err := s.app.Conn.GetQuery().CountAgents(ctx)
totalCount, err := s.app.Conn.GetQuery().CountAgents(ctx, req.Msg.ProfileId)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
agents := make([]*mantraev1.Agent, 0, len(result))
for _, a := range result {
agents = append(agents, a.ToProto())
}
return connect.NewResponse(&mantraev1.ListAgentsResponse{
Agents: convert.AgentsToProto(result),
Agents: agents,
TotalCount: totalCount,
}), nil
}
@@ -189,7 +176,7 @@ func (s *AgentService) HealthCheck(
}
return connect.NewResponse(&mantraev1.HealthCheckResponse{
Agent: convert.AgentToProto(&result),
Agent: result.ToProto(),
}), nil
}
@@ -197,24 +184,24 @@ func (s *AgentService) RotateAgentToken(
ctx context.Context,
req *connect.Request[mantraev1.RotateAgentTokenRequest],
) (*connect.Response[mantraev1.RotateAgentTokenResponse], error) {
agent, err := s.app.Conn.GetQuery().GetAgent(ctx, req.Msg.Id)
result, err := s.app.Conn.GetQuery().GetAgent(ctx, req.Msg.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
token, err := s.createToken(agent.ID, agent.ProfileID)
token, err := s.createToken(result.ID, result.ProfileID)
if err != nil {
return nil, err
}
if err = s.app.Conn.GetQuery().UpdateAgentToken(ctx, db.UpdateAgentTokenParams{
ID: agent.ID,
ID: result.ID,
Token: *token,
}); err != nil {
return nil, err
}
return connect.NewResponse(&mantraev1.RotateAgentTokenResponse{
Agent: convert.AgentToProto(&agent),
Agent: result.ToProto(),
}), nil
}

View File

@@ -6,7 +6,6 @@ import (
"connectrpc.com/connect"
"github.com/mizuchilabs/mantrae/internal/config"
"github.com/mizuchilabs/mantrae/internal/convert"
"github.com/mizuchilabs/mantrae/internal/store/db"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
@@ -23,16 +22,9 @@ func (s *AuditLogService) ListAuditLogs(
ctx context.Context,
req *connect.Request[mantraev1.ListAuditLogsRequest],
) (*connect.Response[mantraev1.ListAuditLogsResponse], error) {
var params db.ListAuditLogsParams
if req.Msg.Limit == nil {
params.Limit = 100
} else {
params.Limit = *req.Msg.Limit
}
if req.Msg.Offset == nil {
params.Offset = 0
} else {
params.Offset = *req.Msg.Offset
params := db.ListAuditLogsParams{
Limit: req.Msg.Limit,
Offset: req.Msg.Offset,
}
result, err := s.app.Conn.GetQuery().ListAuditLogs(ctx, params)
@@ -44,8 +36,12 @@ func (s *AuditLogService) ListAuditLogs(
return nil, connect.NewError(connect.CodeInternal, err)
}
auditLogs := make([]*mantraev1.AuditLog, 0, len(result))
for _, l := range result {
auditLogs = append(auditLogs, l.ToProto())
}
return connect.NewResponse(&mantraev1.ListAuditLogsResponse{
AuditLogs: convert.AuditLogsToProto(result),
AuditLogs: auditLogs,
TotalCount: totalCount,
}), nil
}

View File

@@ -8,7 +8,7 @@ import (
"connectrpc.com/connect"
"github.com/mizuchilabs/mantrae/internal/config"
"github.com/mizuchilabs/mantrae/internal/convert"
"github.com/mizuchilabs/mantrae/internal/store/db"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
@@ -27,7 +27,6 @@ func (s *BackupService) CreateBackup(
if err := s.app.BM.Create(ctx); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.CreateBackupResponse{}), nil
}
@@ -45,7 +44,7 @@ func (s *BackupService) ListBackups(
backups = append(backups, &mantraev1.Backup{
Name: file.Name,
Size: file.Size,
CreatedAt: convert.SafeTimestamp(file.Timestamp),
CreatedAt: db.SafeTimestamp(file.Timestamp),
})
}
return connect.NewResponse(&mantraev1.ListBackupsResponse{Backups: backups}), nil

View File

@@ -7,7 +7,6 @@ import (
"connectrpc.com/connect"
"github.com/mizuchilabs/mantrae/internal/config"
"github.com/mizuchilabs/mantrae/internal/convert"
"github.com/mizuchilabs/mantrae/internal/store/db"
"github.com/mizuchilabs/mantrae/internal/store/schema"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
@@ -29,9 +28,8 @@ func (s *DnsProviderService) GetDnsProvider(
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.GetDnsProviderResponse{
DnsProvider: convert.DNSProviderToProto(&result),
DnsProvider: result.ToProto(),
}), nil
}
@@ -78,7 +76,7 @@ func (s *DnsProviderService) CreateDnsProvider(
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.CreateDnsProviderResponse{
DnsProvider: convert.DNSProviderToProto(&result),
DnsProvider: result.ToProto(),
}), nil
}
@@ -126,7 +124,7 @@ func (s *DnsProviderService) UpdateDnsProvider(
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.UpdateDnsProviderResponse{
DnsProvider: convert.DNSProviderToProto(&result),
DnsProvider: result.ToProto(),
}), nil
}
@@ -144,16 +142,9 @@ func (s *DnsProviderService) ListDnsProviders(
ctx context.Context,
req *connect.Request[mantraev1.ListDnsProvidersRequest],
) (*connect.Response[mantraev1.ListDnsProvidersResponse], error) {
var params db.ListDnsProvidersParams
if req.Msg.Limit == nil {
params.Limit = 100
} else {
params.Limit = *req.Msg.Limit
}
if req.Msg.Offset == nil {
params.Offset = 0
} else {
params.Offset = *req.Msg.Offset
params := db.ListDnsProvidersParams{
Limit: req.Msg.Limit,
Offset: req.Msg.Offset,
}
result, err := s.app.Conn.GetQuery().ListDnsProviders(ctx, params)
@@ -165,8 +156,12 @@ func (s *DnsProviderService) ListDnsProviders(
return nil, connect.NewError(connect.CodeInternal, err)
}
dnsProviders := make([]*mantraev1.DnsProvider, 0, len(result))
for _, p := range result {
dnsProviders = append(dnsProviders, p.ToProto())
}
return connect.NewResponse(&mantraev1.ListDnsProvidersResponse{
DnsProviders: convert.DNSProvidersToProto(result),
DnsProviders: dnsProviders,
TotalCount: totalCount,
}), nil
}

View File

@@ -7,7 +7,6 @@ import (
"connectrpc.com/connect"
"github.com/mizuchilabs/mantrae/internal/config"
"github.com/mizuchilabs/mantrae/internal/convert"
"github.com/mizuchilabs/mantrae/internal/store/db"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
@@ -29,7 +28,7 @@ func (s *EntryPointService) GetEntryPoint(
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.GetEntryPointResponse{
EntryPoint: convert.EntryPointToProto(&result),
EntryPoint: result.ToProto(),
}), nil
}
@@ -54,7 +53,7 @@ func (s *EntryPointService) CreateEntryPoint(
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.CreateEntryPointResponse{
EntryPoint: convert.EntryPointToProto(&result),
EntryPoint: result.ToProto(),
}), nil
}
@@ -84,7 +83,7 @@ func (s *EntryPointService) UpdateEntryPoint(
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.UpdateEntryPointResponse{
EntryPoint: convert.EntryPointToProto(&result),
EntryPoint: result.ToProto(),
}), nil
}
@@ -95,7 +94,6 @@ func (s *EntryPointService) DeleteEntryPoint(
if err := s.updateRouterEntrypoints(ctx, req.Msg.Id, ""); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if err := s.app.Conn.GetQuery().DeleteEntryPointByID(ctx, req.Msg.Id); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
@@ -106,30 +104,27 @@ func (s *EntryPointService) ListEntryPoints(
ctx context.Context,
req *connect.Request[mantraev1.ListEntryPointsRequest],
) (*connect.Response[mantraev1.ListEntryPointsResponse], error) {
var params db.ListEntryPointsParams
params.ProfileID = req.Msg.ProfileId
if req.Msg.Limit == nil {
params.Limit = 100
} else {
params.Limit = *req.Msg.Limit
}
if req.Msg.Offset == nil {
params.Offset = 0
} else {
params.Offset = *req.Msg.Offset
params := db.ListEntryPointsParams{
ProfileID: req.Msg.ProfileId,
Limit: req.Msg.Limit,
Offset: req.Msg.Offset,
}
result, err := s.app.Conn.GetQuery().ListEntryPoints(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
totalCount, err := s.app.Conn.GetQuery().CountEntryPoints(ctx)
totalCount, err := s.app.Conn.GetQuery().CountEntryPoints(ctx, req.Msg.ProfileId)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
entryPoints := make([]*mantraev1.EntryPoint, 0, len(result))
for _, e := range result {
entryPoints = append(entryPoints, e.ToProto())
}
return connect.NewResponse(&mantraev1.ListEntryPointsResponse{
EntryPoints: convert.EntryPointsToProto(result),
EntryPoints: entryPoints,
TotalCount: totalCount,
}), nil
}

View File

@@ -1,72 +0,0 @@
package service
import (
"context"
"connectrpc.com/connect"
"github.com/mizuchilabs/mantrae/internal/config"
"github.com/mizuchilabs/mantrae/internal/events"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
type EventService struct {
app *config.App
}
func NewEventService(app *config.App) *EventService {
return &EventService{app: app}
}
func (s *EventService) ProfileEvents(
ctx context.Context,
req *connect.Request[mantraev1.ProfileEventsRequest],
stream *connect.ServerStream[mantraev1.ProfileEventsResponse],
) error {
// Create filtered event channel
eventChan := make(chan *mantraev1.ProfileEvent, 100)
// Register with broadcaster
filter := &events.EventFilter{
ProfileID: req.Msg.ProfileId,
ResourceTypes: req.Msg.ResourceTypes,
}
s.app.Event.RegisterProfileClient(filter, eventChan)
defer s.app.Event.UnregisterProfileClient(eventChan)
for {
select {
case <-ctx.Done():
return ctx.Err()
case event := <-eventChan:
res := &mantraev1.ProfileEventsResponse{Event: event}
if err := stream.Send(res); err != nil {
return err
}
}
}
}
func (s *EventService) GlobalEvents(
ctx context.Context,
req *connect.Request[mantraev1.GlobalEventsRequest],
stream *connect.ServerStream[mantraev1.GlobalEventsResponse],
) error {
eventChan := make(chan *mantraev1.GlobalEvent, 100)
filter := &events.GlobalEventFilter{ResourceTypes: req.Msg.ResourceTypes}
s.app.Event.RegisterGlobalClient(filter, eventChan)
defer s.app.Event.UnregisterGlobalClient(eventChan)
for {
select {
case <-ctx.Done():
return ctx.Err()
case event := <-eventChan:
res := &mantraev1.GlobalEventsResponse{Event: event}
if err := stream.Send(res); err != nil {
return err
}
}
}
}

View File

@@ -11,383 +11,144 @@ import (
"connectrpc.com/connect"
"github.com/mizuchilabs/mantrae/internal/config"
"github.com/mizuchilabs/mantrae/internal/convert"
"github.com/mizuchilabs/mantrae/internal/store/db"
"github.com/mizuchilabs/mantrae/internal/store/schema"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
type MiddlewareService struct {
app *config.App
dispatch map[mantraev1.MiddlewareType]MiddlewareOps
}
func NewMiddlewareService(app *config.App) *MiddlewareService {
return &MiddlewareService{app: app}
return &MiddlewareService{
app: app,
dispatch: map[mantraev1.MiddlewareType]MiddlewareOps{
mantraev1.MiddlewareType_MIDDLEWARE_TYPE_HTTP: NewHTTPMiddlewareOps(app),
mantraev1.MiddlewareType_MIDDLEWARE_TYPE_TCP: NewTCPMiddlewareOps(app),
},
}
}
func (s *MiddlewareService) GetMiddleware(
ctx context.Context,
req *connect.Request[mantraev1.GetMiddlewareRequest],
) (*connect.Response[mantraev1.GetMiddlewareResponse], error) {
var middleware *mantraev1.Middleware
switch req.Msg.Type {
case mantraev1.MiddlewareType_MIDDLEWARE_TYPE_HTTP:
result, err := s.app.Conn.GetQuery().GetHttpMiddleware(ctx, req.Msg.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
middleware = convert.HTTPMiddlewareToProto(&result)
case mantraev1.MiddlewareType_MIDDLEWARE_TYPE_TCP:
result, err := s.app.Conn.GetQuery().GetTcpMiddleware(ctx, req.Msg.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
middleware = convert.TCPMiddlewareToProto(&result)
default:
ops, ok := s.dispatch[req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid middleware type"),
)
}
return connect.NewResponse(&mantraev1.GetMiddlewareResponse{Middleware: middleware}), nil
result, err := ops.Get(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(result), nil
}
func (s *MiddlewareService) CreateMiddleware(
ctx context.Context,
req *connect.Request[mantraev1.CreateMiddlewareRequest],
) (*connect.Response[mantraev1.CreateMiddlewareResponse], error) {
var middleware *mantraev1.Middleware
var err error
switch req.Msg.Type {
case mantraev1.MiddlewareType_MIDDLEWARE_TYPE_HTTP:
params := db.CreateHttpMiddlewareParams{
ProfileID: req.Msg.ProfileId,
Name: req.Msg.Name,
IsDefault: req.Msg.IsDefault,
}
if req.Msg.AgentId != "" {
params.AgentID = &req.Msg.AgentId
}
if req.Msg.IsDefault {
if err = s.app.Conn.GetQuery().UnsetDefaultHttpMiddleware(ctx); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
params.Config, err = convert.UnmarshalStruct[schema.HTTPMiddleware](req.Msg.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
if err = params.Config.Verify(); err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
result, err := s.app.Conn.GetQuery().CreateHttpMiddleware(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
middleware = convert.HTTPMiddlewareToProto(&result)
case mantraev1.MiddlewareType_MIDDLEWARE_TYPE_TCP:
params := db.CreateTcpMiddlewareParams{
ProfileID: req.Msg.ProfileId,
Name: req.Msg.Name,
IsDefault: req.Msg.IsDefault,
}
if req.Msg.AgentId != "" {
params.AgentID = &req.Msg.AgentId
}
if req.Msg.IsDefault {
if err = s.app.Conn.GetQuery().UnsetDefaultTcpMiddleware(ctx); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
params.Config, err = convert.UnmarshalStruct[schema.TCPMiddleware](req.Msg.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
result, err := s.app.Conn.GetQuery().CreateTcpMiddleware(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
middleware = convert.TCPMiddlewareToProto(&result)
default:
ops, ok := s.dispatch[req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid middleware type"),
)
}
return connect.NewResponse(&mantraev1.CreateMiddlewareResponse{Middleware: middleware}), nil
result, err := ops.Create(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(result), nil
}
func (s *MiddlewareService) UpdateMiddleware(
ctx context.Context,
req *connect.Request[mantraev1.UpdateMiddlewareRequest],
) (*connect.Response[mantraev1.UpdateMiddlewareResponse], error) {
var middleware *mantraev1.Middleware
var err error
switch req.Msg.Type {
case mantraev1.MiddlewareType_MIDDLEWARE_TYPE_HTTP:
params := db.UpdateHttpMiddlewareParams{
ID: req.Msg.Id,
Name: req.Msg.Name,
Enabled: req.Msg.Enabled,
IsDefault: req.Msg.IsDefault,
}
params.Config, err = convert.UnmarshalStruct[schema.HTTPMiddleware](req.Msg.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
if req.Msg.IsDefault {
if err = s.app.Conn.GetQuery().UnsetDefaultHttpMiddleware(ctx); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
// Update router middlewares
oldMiddleware, err := s.app.Conn.GetQuery().GetHttpMiddleware(ctx, params.ID)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
oldMiddlewareProto := convert.HTTPMiddlewareToProto(&oldMiddleware)
if err = s.updateRouterMiddlewares(ctx, oldMiddlewareProto, req.Msg.Name); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().UpdateHttpMiddleware(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
middleware = convert.HTTPMiddlewareToProto(&result)
case mantraev1.MiddlewareType_MIDDLEWARE_TYPE_TCP:
params := db.UpdateTcpMiddlewareParams{
ID: req.Msg.Id,
Name: req.Msg.Name,
Enabled: req.Msg.Enabled,
IsDefault: req.Msg.IsDefault,
}
params.Config, err = convert.UnmarshalStruct[schema.TCPMiddleware](req.Msg.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
if req.Msg.IsDefault {
if err = s.app.Conn.GetQuery().UnsetDefaultTcpMiddleware(ctx); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
// Update router middlewares
oldMiddleware, err := s.app.Conn.GetQuery().GetTcpMiddleware(ctx, params.ID)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
oldMiddlewareProto := convert.TCPMiddlewareToProto(&oldMiddleware)
if err = s.updateRouterMiddlewares(ctx, oldMiddlewareProto, req.Msg.Name); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().UpdateTcpMiddleware(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
middleware = convert.TCPMiddlewareToProto(&result)
default:
ops, ok := s.dispatch[req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid middleware type"),
)
}
return connect.NewResponse(&mantraev1.UpdateMiddlewareResponse{Middleware: middleware}), nil
result, err := ops.Update(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(result), nil
}
func (s *MiddlewareService) DeleteMiddleware(
ctx context.Context,
req *connect.Request[mantraev1.DeleteMiddlewareRequest],
) (*connect.Response[mantraev1.DeleteMiddlewareResponse], error) {
switch req.Msg.Type {
case mantraev1.MiddlewareType_MIDDLEWARE_TYPE_HTTP:
middleware, err := s.app.Conn.GetQuery().GetHttpMiddleware(ctx, req.Msg.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
mwProto := convert.HTTPMiddlewareToProto(&middleware)
if err := s.updateRouterMiddlewares(ctx, mwProto, ""); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if err := s.app.Conn.GetQuery().DeleteHttpMiddleware(ctx, req.Msg.Id); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
case mantraev1.MiddlewareType_MIDDLEWARE_TYPE_TCP:
middleware, err := s.app.Conn.GetQuery().GetTcpMiddleware(ctx, req.Msg.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
mwProto := convert.TCPMiddlewareToProto(&middleware)
if err := s.updateRouterMiddlewares(ctx, mwProto, ""); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if err := s.app.Conn.GetQuery().DeleteTcpMiddleware(ctx, req.Msg.Id); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
return connect.NewResponse(&mantraev1.DeleteMiddlewareResponse{}), nil
}
func (s *MiddlewareService) ListMiddlewares(
ctx context.Context,
req *connect.Request[mantraev1.ListMiddlewaresRequest],
) (*connect.Response[mantraev1.ListMiddlewaresResponse], error) {
var limit int64
var offset int64
if req.Msg.Limit == nil {
limit = 100
} else {
limit = *req.Msg.Limit
}
if req.Msg.Offset == nil {
offset = 0
} else {
offset = *req.Msg.Offset
}
var middlewares []*mantraev1.Middleware
var totalCount int64
if req.Msg.Type == nil {
if req.Msg.AgentId == nil {
result, err := s.app.Conn.GetQuery().
ListMiddlewaresByProfile(ctx, db.ListMiddlewaresByProfileParams{
Limit: limit,
Offset: offset,
ProfileID: req.Msg.ProfileId,
ProfileID_2: req.Msg.ProfileId,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
totalCount, err = s.app.Conn.GetQuery().
CountMiddlewaresByProfile(ctx, db.CountMiddlewaresByProfileParams{
ProfileID: req.Msg.ProfileId,
ProfileID_2: req.Msg.ProfileId,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
middlewares = convert.MiddlewaresByProfileToProto(result)
} else {
result, err := s.app.Conn.GetQuery().
ListMiddlewaresByAgent(ctx, db.ListMiddlewaresByAgentParams{
Limit: limit,
Offset: offset,
AgentID: req.Msg.AgentId,
AgentID_2: req.Msg.AgentId,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
totalCount, err = s.app.Conn.GetQuery().
CountMiddlewaresByAgent(ctx, db.CountMiddlewaresByAgentParams{
AgentID: req.Msg.AgentId,
AgentID_2: req.Msg.AgentId,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
middlewares = convert.MiddlewaresByAgentToProto(result)
}
} else {
var err error
switch *req.Msg.Type {
case mantraev1.MiddlewareType_MIDDLEWARE_TYPE_HTTP:
if req.Msg.AgentId == nil {
totalCount, err = s.app.Conn.GetQuery().CountHttpMiddlewaresByProfile(ctx, req.Msg.ProfileId)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().ListHttpMiddlewares(ctx, db.ListHttpMiddlewaresParams{
ProfileID: req.Msg.ProfileId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
middlewares = convert.HTTPMiddlewaresToProto(result)
} else {
totalCount, err = s.app.Conn.GetQuery().CountHttpMiddlewaresByAgent(ctx, req.Msg.AgentId)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().ListHttpMiddlewaresByAgent(ctx, db.ListHttpMiddlewaresByAgentParams{
AgentID: req.Msg.AgentId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
middlewares = convert.HTTPMiddlewaresToProto(result)
}
case mantraev1.MiddlewareType_MIDDLEWARE_TYPE_TCP:
if req.Msg.AgentId == nil {
totalCount, err = s.app.Conn.GetQuery().CountTcpMiddlewaresByProfile(ctx, req.Msg.ProfileId)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().ListTcpMiddlewares(ctx, db.ListTcpMiddlewaresParams{
ProfileID: req.Msg.ProfileId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
middlewares = convert.TCPMiddlewaresToProto(result)
} else {
totalCount, err = s.app.Conn.GetQuery().CountTcpMiddlewaresByAgent(ctx, req.Msg.AgentId)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().ListTcpMiddlewaresByAgent(ctx, db.ListTcpMiddlewaresByAgentParams{
AgentID: req.Msg.AgentId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
middlewares = convert.TCPMiddlewaresToProto(result)
}
default:
ops, ok := s.dispatch[req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid middleware type"),
)
}
result, err := ops.Delete(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(result), nil
}
func (s *MiddlewareService) ListMiddlewares(
ctx context.Context,
req *connect.Request[mantraev1.ListMiddlewaresRequest],
) (*connect.Response[mantraev1.ListMiddlewaresResponse], error) {
if req.Msg.Type != nil {
ops, ok := s.dispatch[*req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid middleware type"),
)
}
result, err := ops.List(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(result), nil
} else {
// Get HTTP middlewares
httpOps := s.dispatch[mantraev1.MiddlewareType_MIDDLEWARE_TYPE_HTTP]
httpResult, err := httpOps.List(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
// Get TCP middlewares
tcpOps := s.dispatch[mantraev1.MiddlewareType_MIDDLEWARE_TYPE_TCP]
tcpResult, err := tcpOps.List(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
// Combine results
allMiddlewares := append(httpResult.Middlewares, tcpResult.Middlewares...)
totalCount := httpResult.TotalCount + tcpResult.TotalCount
return connect.NewResponse(&mantraev1.ListMiddlewaresResponse{
Middlewares: middlewares,
Middlewares: allMiddlewares,
TotalCount: totalCount,
}), nil
}
}
func (s *MiddlewareService) GetMiddlewarePlugins(
ctx context.Context,
@@ -407,11 +168,11 @@ func (s *MiddlewareService) GetMiddlewarePlugins(
if err := json.NewDecoder(resp.Body).Decode(&allPlugins); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
cleanPlugins := slices.DeleteFunc(allPlugins, func(p schema.Plugin) bool {
filtered := slices.DeleteFunc(allPlugins, func(p schema.Plugin) bool {
return p.Type != "middleware"
})
var plugins []*mantraev1.Plugin
for _, p := range cleanPlugins {
for _, p := range filtered {
plugins = append(plugins, &mantraev1.Plugin{
Id: p.ID,
Name: p.Name,
@@ -437,65 +198,3 @@ func (s *MiddlewareService) GetMiddlewarePlugins(
return connect.NewResponse(&mantraev1.GetMiddlewarePluginsResponse{Plugins: plugins}), nil
}
// Helper functions
func (s *MiddlewareService) updateRouterMiddlewares(
ctx context.Context,
middleware *mantraev1.Middleware,
newMiddleware string,
) error {
switch middleware.Type {
case mantraev1.MiddlewareType_MIDDLEWARE_TYPE_HTTP:
router, err := s.app.Conn.GetQuery().
GetHttpRoutersUsingMiddleware(ctx, db.GetHttpRoutersUsingMiddlewareParams{
ProfileID: middleware.ProfileId,
ID: middleware.Id,
})
if err != nil {
return err
}
for _, r := range router {
if idx := slices.Index(r.Config.Middlewares, middleware.Name); idx != -1 {
r.Config.Middlewares = slices.Delete(r.Config.Middlewares, idx, idx+1)
}
if newMiddleware != "" {
r.Config.Middlewares = append(r.Config.Middlewares, newMiddleware)
}
if _, err := s.app.Conn.GetQuery().UpdateHttpRouter(ctx, db.UpdateHttpRouterParams{
ID: r.ID,
Enabled: r.Enabled,
Config: r.Config,
Name: r.Name,
}); err != nil {
return err
}
}
case mantraev1.MiddlewareType_MIDDLEWARE_TYPE_TCP:
router, err := s.app.Conn.GetQuery().
GetTcpRoutersUsingMiddleware(ctx, db.GetTcpRoutersUsingMiddlewareParams{
ProfileID: middleware.ProfileId,
ID: middleware.Id,
})
if err != nil {
return err
}
for _, r := range router {
if idx := slices.Index(r.Config.Middlewares, middleware.Name); idx != -1 {
r.Config.Middlewares = slices.Delete(r.Config.Middlewares, idx, idx+1)
}
if newMiddleware != "" {
r.Config.Middlewares = append(r.Config.Middlewares, newMiddleware)
}
if _, err := s.app.Conn.GetQuery().UpdateTcpRouter(ctx, db.UpdateTcpRouterParams{
ID: r.ID,
Enabled: r.Enabled,
Config: r.Config,
Name: r.Name,
}); err != nil {
return err
}
}
}
return nil
}

View File

@@ -0,0 +1,415 @@
package service
import (
"context"
"slices"
"github.com/mizuchilabs/mantrae/internal/config"
"github.com/mizuchilabs/mantrae/internal/store/db"
"github.com/mizuchilabs/mantrae/internal/store/schema"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
type MiddlewareOps interface {
Get(
ctx context.Context,
req *mantraev1.GetMiddlewareRequest,
) (*mantraev1.GetMiddlewareResponse, error)
Create(
ctx context.Context,
req *mantraev1.CreateMiddlewareRequest,
) (*mantraev1.CreateMiddlewareResponse, error)
Update(
ctx context.Context,
req *mantraev1.UpdateMiddlewareRequest,
) (*mantraev1.UpdateMiddlewareResponse, error)
Delete(
ctx context.Context,
req *mantraev1.DeleteMiddlewareRequest,
) (*mantraev1.DeleteMiddlewareResponse, error)
List(
ctx context.Context,
req *mantraev1.ListMiddlewaresRequest,
) (*mantraev1.ListMiddlewaresResponse, error)
}
type HTTPMiddlewareOps struct {
app *config.App
}
type TCPMiddlewareOps struct {
app *config.App
}
func NewHTTPMiddlewareOps(app *config.App) *HTTPMiddlewareOps {
return &HTTPMiddlewareOps{app: app}
}
func NewTCPMiddlewareOps(app *config.App) *TCPMiddlewareOps {
return &TCPMiddlewareOps{app: app}
}
// HTTP Middleware Operations -------------------------------------------------
func (s *HTTPMiddlewareOps) Get(
ctx context.Context,
req *mantraev1.GetMiddlewareRequest,
) (*mantraev1.GetMiddlewareResponse, error) {
result, err := s.app.Conn.GetQuery().GetHttpMiddleware(ctx, req.Id)
if err != nil {
return nil, err
}
return &mantraev1.GetMiddlewareResponse{
Middleware: result.ToProto(),
}, nil
}
func (s *HTTPMiddlewareOps) Create(
ctx context.Context,
req *mantraev1.CreateMiddlewareRequest,
) (*mantraev1.CreateMiddlewareResponse, error) {
params := db.CreateHttpMiddlewareParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
Name: req.Name,
IsDefault: req.IsDefault,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.HTTPMiddleware](req.Config)
if err != nil {
return nil, err
}
if err = params.Config.Verify(); err != nil {
return nil, err
}
if req.IsDefault {
if err = s.app.Conn.GetQuery().UnsetDefaultHttpMiddleware(ctx); err != nil {
return nil, err
}
}
result, err := s.app.Conn.GetQuery().CreateHttpMiddleware(ctx, params)
if err != nil {
return nil, err
}
return &mantraev1.CreateMiddlewareResponse{
Middleware: result.ToProto(),
}, nil
}
func (s *HTTPMiddlewareOps) Update(
ctx context.Context,
req *mantraev1.UpdateMiddlewareRequest,
) (*mantraev1.UpdateMiddlewareResponse, error) {
params := db.UpdateHttpMiddlewareParams{
ID: req.Id,
Name: req.Name,
Enabled: req.Enabled,
IsDefault: req.IsDefault,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.HTTPMiddleware](req.Config)
if err != nil {
return nil, err
}
if err = params.Config.Verify(); err != nil {
return nil, err
}
if req.IsDefault {
if err = s.app.Conn.GetQuery().UnsetDefaultHttpMiddleware(ctx); err != nil {
return nil, err
}
}
// Get old middleware for router update
middleware, err := s.app.Conn.GetQuery().GetHttpMiddleware(ctx, req.Id)
if err != nil {
return nil, err
}
// Make sure routers using this middleware use the new name
routers, err := s.app.Conn.GetQuery().
GetHttpRoutersUsingMiddleware(ctx, db.GetHttpRoutersUsingMiddlewareParams{
ProfileID: middleware.ProfileID,
ID: middleware.ID,
})
if err != nil {
return nil, err
}
for _, r := range routers {
if idx := slices.Index(r.Config.Middlewares, req.Name); idx != -1 {
r.Config.Middlewares = slices.Delete(r.Config.Middlewares, idx, idx+1)
}
r.Config.Middlewares = append(r.Config.Middlewares, req.Name)
if _, err = s.app.Conn.GetQuery().UpdateHttpRouter(ctx, db.UpdateHttpRouterParams{
ID: r.ID,
Enabled: r.Enabled,
Config: r.Config,
Name: r.Name,
}); err != nil {
return nil, err
}
}
result, err := s.app.Conn.GetQuery().UpdateHttpMiddleware(ctx, params)
if err != nil {
return nil, err
}
return &mantraev1.UpdateMiddlewareResponse{
Middleware: result.ToProto(),
}, nil
}
func (s *HTTPMiddlewareOps) Delete(
ctx context.Context,
req *mantraev1.DeleteMiddlewareRequest,
) (*mantraev1.DeleteMiddlewareResponse, error) {
middleware, err := s.app.Conn.GetQuery().GetHttpMiddleware(ctx, req.Id)
if err != nil {
return nil, err
}
// Make sure to delete the middleware from related routers
routers, err := s.app.Conn.GetQuery().
GetHttpRoutersUsingMiddleware(ctx, db.GetHttpRoutersUsingMiddlewareParams{
ProfileID: middleware.ProfileID,
ID: middleware.ID,
})
if err != nil {
return nil, err
}
for _, r := range routers {
if idx := slices.Index(r.Config.Middlewares, middleware.Name); idx != -1 {
r.Config.Middlewares = slices.Delete(r.Config.Middlewares, idx, idx+1)
}
if _, err := s.app.Conn.GetQuery().UpdateHttpRouter(ctx, db.UpdateHttpRouterParams{
ID: r.ID,
Enabled: r.Enabled,
Config: r.Config,
Name: r.Name,
}); err != nil {
return nil, err
}
}
if err := s.app.Conn.GetQuery().DeleteHttpMiddleware(ctx, req.Id); err != nil {
return nil, err
}
return &mantraev1.DeleteMiddlewareResponse{}, nil
}
func (s *HTTPMiddlewareOps) List(
ctx context.Context,
req *mantraev1.ListMiddlewaresRequest,
) (*mantraev1.ListMiddlewaresResponse, error) {
result, err := s.app.Conn.GetQuery().
ListHttpMiddlewares(ctx, db.ListHttpMiddlewaresParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
Limit: req.Limit,
Offset: req.Offset,
})
if err != nil {
return nil, err
}
totalCount, err := s.app.Conn.GetQuery().
CountHttpMiddlewares(ctx, db.CountHttpMiddlewaresParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
})
if err != nil {
return nil, err
}
middlewares := make([]*mantraev1.Middleware, 0, len(result))
for _, m := range result {
middlewares = append(middlewares, m.ToProto())
}
return &mantraev1.ListMiddlewaresResponse{
Middlewares: middlewares,
TotalCount: totalCount,
}, nil
}
// TCP Middleware Operations --------------------------------------------------
func (s *TCPMiddlewareOps) Get(
ctx context.Context,
req *mantraev1.GetMiddlewareRequest,
) (*mantraev1.GetMiddlewareResponse, error) {
result, err := s.app.Conn.GetQuery().GetTcpMiddleware(ctx, req.Id)
if err != nil {
return nil, err
}
return &mantraev1.GetMiddlewareResponse{
Middleware: result.ToProto(),
}, nil
}
func (s *TCPMiddlewareOps) Create(
ctx context.Context,
req *mantraev1.CreateMiddlewareRequest,
) (*mantraev1.CreateMiddlewareResponse, error) {
params := db.CreateTcpMiddlewareParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
Name: req.Name,
IsDefault: req.IsDefault,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.TCPMiddleware](req.Config)
if err != nil {
return nil, err
}
if req.IsDefault {
if err = s.app.Conn.GetQuery().UnsetDefaultTcpMiddleware(ctx); err != nil {
return nil, err
}
}
result, err := s.app.Conn.GetQuery().CreateTcpMiddleware(ctx, params)
if err != nil {
return nil, err
}
return &mantraev1.CreateMiddlewareResponse{
Middleware: result.ToProto(),
}, nil
}
func (s *TCPMiddlewareOps) Update(
ctx context.Context,
req *mantraev1.UpdateMiddlewareRequest,
) (*mantraev1.UpdateMiddlewareResponse, error) {
params := db.UpdateTcpMiddlewareParams{
Name: req.Name,
Enabled: req.Enabled,
IsDefault: req.IsDefault,
ID: req.Id,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.TCPMiddleware](req.Config)
if err != nil {
return nil, err
}
if req.IsDefault {
if err = s.app.Conn.GetQuery().UnsetDefaultTcpMiddleware(ctx); err != nil {
return nil, err
}
}
// Get old middleware for router update
middleware, err := s.app.Conn.GetQuery().GetTcpMiddleware(ctx, req.Id)
if err != nil {
return nil, err
}
// Make sure routers using this middleware use the new name
routers, err := s.app.Conn.GetQuery().
GetTcpRoutersUsingMiddleware(ctx, db.GetTcpRoutersUsingMiddlewareParams{
ProfileID: middleware.ProfileID,
ID: middleware.ID,
})
if err != nil {
return nil, err
}
for _, r := range routers {
if idx := slices.Index(r.Config.Middlewares, req.Name); idx != -1 {
r.Config.Middlewares = slices.Delete(r.Config.Middlewares, idx, idx+1)
}
r.Config.Middlewares = append(r.Config.Middlewares, req.Name)
if _, err = s.app.Conn.GetQuery().UpdateTcpRouter(ctx, db.UpdateTcpRouterParams{
ID: r.ID,
Enabled: r.Enabled,
Config: r.Config,
Name: r.Name,
}); err != nil {
return nil, err
}
}
result, err := s.app.Conn.GetQuery().UpdateTcpMiddleware(ctx, params)
if err != nil {
return nil, err
}
return &mantraev1.UpdateMiddlewareResponse{
Middleware: result.ToProto(),
}, nil
}
func (s *TCPMiddlewareOps) Delete(
ctx context.Context,
req *mantraev1.DeleteMiddlewareRequest,
) (*mantraev1.DeleteMiddlewareResponse, error) {
middleware, err := s.app.Conn.GetQuery().GetTcpMiddleware(ctx, req.Id)
if err != nil {
return nil, err
}
// Make sure to delete the middleware from related routers
routers, err := s.app.Conn.GetQuery().
GetTcpRoutersUsingMiddleware(ctx, db.GetTcpRoutersUsingMiddlewareParams{
ProfileID: middleware.ProfileID,
ID: middleware.ID,
})
if err != nil {
return nil, err
}
for _, r := range routers {
if idx := slices.Index(r.Config.Middlewares, middleware.Name); idx != -1 {
r.Config.Middlewares = slices.Delete(r.Config.Middlewares, idx, idx+1)
}
if _, err := s.app.Conn.GetQuery().UpdateTcpRouter(ctx, db.UpdateTcpRouterParams{
ID: r.ID,
Enabled: r.Enabled,
Config: r.Config,
Name: r.Name,
}); err != nil {
return nil, err
}
}
if err := s.app.Conn.GetQuery().DeleteTcpMiddleware(ctx, req.Id); err != nil {
return nil, err
}
return &mantraev1.DeleteMiddlewareResponse{}, nil
}
func (s *TCPMiddlewareOps) List(
ctx context.Context,
req *mantraev1.ListMiddlewaresRequest,
) (*mantraev1.ListMiddlewaresResponse, error) {
result, err := s.app.Conn.GetQuery().
ListTcpMiddlewares(ctx, db.ListTcpMiddlewaresParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
Limit: req.Limit,
Offset: req.Offset,
})
if err != nil {
return nil, err
}
totalCount, err := s.app.Conn.GetQuery().CountTcpMiddlewares(ctx, db.CountTcpMiddlewaresParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
})
if err != nil {
return nil, err
}
middlewares := make([]*mantraev1.Middleware, 0, len(result))
for _, m := range result {
middlewares = append(middlewares, m.ToProto())
}
return &mantraev1.ListMiddlewaresResponse{
Middlewares: middlewares,
TotalCount: totalCount,
}, nil
}

View File

@@ -6,7 +6,6 @@ import (
"connectrpc.com/connect"
"github.com/mizuchilabs/mantrae/internal/config"
"github.com/mizuchilabs/mantrae/internal/convert"
"github.com/mizuchilabs/mantrae/internal/store/db"
"github.com/mizuchilabs/mantrae/pkg/util"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
@@ -29,7 +28,7 @@ func (s *ProfileService) GetProfile(
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.GetProfileResponse{
Profile: convert.ProfileToProto(&result),
Profile: result.ToProto(),
}), nil
}
@@ -48,7 +47,7 @@ func (s *ProfileService) CreateProfile(
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.CreateProfileResponse{
Profile: convert.ProfileToProto(&result),
Profile: result.ToProto(),
}), nil
}
@@ -70,7 +69,7 @@ func (s *ProfileService) UpdateProfile(
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.UpdateProfileResponse{
Profile: convert.ProfileToProto(&result),
Profile: result.ToProto(),
}), nil
}
@@ -78,8 +77,7 @@ func (s *ProfileService) DeleteProfile(
ctx context.Context,
req *connect.Request[mantraev1.DeleteProfileRequest],
) (*connect.Response[mantraev1.DeleteProfileResponse], error) {
err := s.app.Conn.GetQuery().DeleteProfile(ctx, req.Msg.Id)
if err != nil {
if err := s.app.Conn.GetQuery().DeleteProfile(ctx, req.Msg.Id); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.DeleteProfileResponse{}), nil
@@ -89,29 +87,27 @@ func (s *ProfileService) ListProfiles(
ctx context.Context,
req *connect.Request[mantraev1.ListProfilesRequest],
) (*connect.Response[mantraev1.ListProfilesResponse], error) {
var params db.ListProfilesParams
if req.Msg.Limit == nil {
params.Limit = 100
} else {
params.Limit = *req.Msg.Limit
}
if req.Msg.Offset == nil {
params.Offset = 0
} else {
params.Offset = *req.Msg.Offset
params := db.ListProfilesParams{
Limit: req.Msg.Limit,
Offset: req.Msg.Offset,
}
result, err := s.app.Conn.GetQuery().ListProfiles(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
totalCount, err := s.app.Conn.GetQuery().CountProfiles(ctx)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
profiles := make([]*mantraev1.Profile, 0, len(result))
for _, p := range result {
profiles = append(profiles, p.ToProto())
}
return connect.NewResponse(&mantraev1.ListProfilesResponse{
Profiles: convert.ProfilesToProto(result),
Profiles: profiles,
TotalCount: totalCount,
}), nil
}

View File

@@ -7,582 +7,149 @@ import (
"connectrpc.com/connect"
"github.com/mizuchilabs/mantrae/internal/config"
"github.com/mizuchilabs/mantrae/internal/convert"
"github.com/mizuchilabs/mantrae/internal/store/db"
"github.com/mizuchilabs/mantrae/internal/store/schema"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
type RouterService struct {
app *config.App
dispatch map[mantraev1.RouterType]RouterOps
}
func NewRouterService(app *config.App) *RouterService {
return &RouterService{app: app}
return &RouterService{
app: app,
dispatch: map[mantraev1.RouterType]RouterOps{
mantraev1.RouterType_ROUTER_TYPE_HTTP: NewHTTPRouterOps(app),
mantraev1.RouterType_ROUTER_TYPE_TCP: NewTCPRouterOps(app),
mantraev1.RouterType_ROUTER_TYPE_UDP: NewUDPRouterOps(app),
},
}
}
func (s *RouterService) GetRouter(
ctx context.Context,
req *connect.Request[mantraev1.GetRouterRequest],
) (*connect.Response[mantraev1.GetRouterResponse], error) {
var router *mantraev1.Router
ops, ok := s.dispatch[req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid router type"),
)
}
switch req.Msg.Type {
case mantraev1.RouterType_ROUTER_TYPE_HTTP:
resRouter, err := s.app.Conn.GetQuery().GetHttpRouter(ctx, req.Msg.Id)
result, err := ops.Get(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
resDNS, err := s.app.Conn.GetQuery().GetDnsProvidersByHttpRouter(ctx, req.Msg.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
protoDNS := convert.DNSProvidersToProto(resDNS)
router = convert.HTTPRouterToProto(&resRouter, protoDNS)
case mantraev1.RouterType_ROUTER_TYPE_TCP:
resRouter, err := s.app.Conn.GetQuery().GetTcpRouter(ctx, req.Msg.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
resDNS, err := s.app.Conn.GetQuery().GetDnsProvidersByTcpRouter(ctx, req.Msg.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
protoDNS := convert.DNSProvidersToProto(resDNS)
router = convert.TCPRouterToProto(&resRouter, protoDNS)
case mantraev1.RouterType_ROUTER_TYPE_UDP:
result, err := s.app.Conn.GetQuery().GetUdpRouter(ctx, req.Msg.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
router = convert.UDPRouterToProto(&result)
default:
return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("invalid router type"))
}
return connect.NewResponse(&mantraev1.GetRouterResponse{Router: router}), nil
return connect.NewResponse(result), nil
}
func (s *RouterService) CreateRouter(
ctx context.Context,
req *connect.Request[mantraev1.CreateRouterRequest],
) (*connect.Response[mantraev1.CreateRouterResponse], error) {
var router *mantraev1.Router
var err error
switch req.Msg.Type {
case mantraev1.RouterType_ROUTER_TYPE_HTTP:
var params db.CreateHttpRouterParams
params.ProfileID = req.Msg.ProfileId
params.Name = req.Msg.Name
if req.Msg.AgentId != "" {
params.AgentID = &req.Msg.AgentId
ops, ok := s.dispatch[req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid router type"),
)
}
params.Config, err = convert.UnmarshalStruct[schema.HTTPRouter](req.Msg.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
params.Config.Service = params.Name
result, err := s.app.Conn.GetQuery().CreateHttpRouter(ctx, params)
result, err := ops.Create(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
resultDNS, err := s.app.Conn.GetQuery().GetDnsProvidersByHttpRouter(ctx, result.ID)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
protoDNS := convert.DNSProvidersToProto(resultDNS)
router = convert.HTTPRouterToProto(&result, protoDNS)
case mantraev1.RouterType_ROUTER_TYPE_TCP:
var params db.CreateTcpRouterParams
params.ProfileID = req.Msg.ProfileId
params.Name = req.Msg.Name
if req.Msg.AgentId != "" {
params.AgentID = &req.Msg.AgentId
}
params.Config, err = convert.UnmarshalStruct[schema.TCPRouter](req.Msg.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
params.Config.Service = params.Name
result, err := s.app.Conn.GetQuery().CreateTcpRouter(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
resultDNS, err := s.app.Conn.GetQuery().GetDnsProvidersByTcpRouter(ctx, result.ID)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
protoDNS := convert.DNSProvidersToProto(resultDNS)
router = convert.TCPRouterToProto(&result, protoDNS)
case mantraev1.RouterType_ROUTER_TYPE_UDP:
var params db.CreateUdpRouterParams
params.ProfileID = req.Msg.ProfileId
params.Name = req.Msg.Name
if req.Msg.AgentId != "" {
params.AgentID = &req.Msg.AgentId
}
params.Config, err = convert.UnmarshalStruct[schema.UDPRouter](req.Msg.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
params.Config.Service = params.Name
result, err := s.app.Conn.GetQuery().CreateUdpRouter(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
router = convert.UDPRouterToProto(&result)
default:
return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("invalid router type"))
}
// Broadcast event
// s.app.Event.BroadcastProfileEvent(&mantraev1.ProfileEvent{
// EventType: mantraev1.EventType_EVENT_TYPE_CREATED,
// ResourceType: mantraev1.ResourceType_RESOURCE_TYPE_ROUTER,
// ProfileId: req.Msg.ProfileId,
// Timestamp: timestamppb.Now(),
// Resource: &mantraev1.ProfileEvent_Router{
// Router: router,
// },
// })
return connect.NewResponse(&mantraev1.CreateRouterResponse{Router: router}), nil
return connect.NewResponse(result), nil
}
func (s *RouterService) UpdateRouter(
ctx context.Context,
req *connect.Request[mantraev1.UpdateRouterRequest],
) (*connect.Response[mantraev1.UpdateRouterResponse], error) {
var router *mantraev1.Router
var err error
switch req.Msg.Type {
case mantraev1.RouterType_ROUTER_TYPE_HTTP:
var params db.UpdateHttpRouterParams
params.ID = req.Msg.Id
params.Name = req.Msg.Name
params.Enabled = req.Msg.Enabled
params.Config, err = convert.UnmarshalStruct[schema.HTTPRouter](req.Msg.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
ops, ok := s.dispatch[req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid router type"),
)
}
params.Config.Service = params.Name
// Update DNS Providers
existing, err := s.app.Conn.GetQuery().GetDnsProvidersByHttpRouter(ctx, params.ID)
result, err := ops.Update(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
existingMap := make(map[int64]bool)
for _, provider := range existing {
existingMap[provider.ID] = true
}
desiredMap := make(map[int64]bool)
var desiredIDs []int64
for _, protoProvider := range req.Msg.DnsProviders {
desiredMap[protoProvider.Id] = true
desiredIDs = append(desiredIDs, protoProvider.Id)
}
// Identify inserts
for _, id := range desiredIDs {
if !existingMap[id] {
if err = s.app.Conn.GetQuery().
CreateHttpRouterDNSProvider(ctx, db.CreateHttpRouterDNSProviderParams{
HttpRouterID: params.ID,
DnsProviderID: id,
}); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
}
// Identify deletes
for id := range existingMap {
if !desiredMap[id] {
if err = s.app.Conn.GetQuery().
DeleteHttpRouterDNSProvider(ctx, db.DeleteHttpRouterDNSProviderParams{
HttpRouterID: params.ID,
DnsProviderID: id,
}); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
}
result, err := s.app.Conn.GetQuery().UpdateHttpRouter(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
resultDNS, err := s.app.Conn.GetQuery().GetDnsProvidersByHttpRouter(ctx, result.ID)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
protoDNS := convert.DNSProvidersToProto(resultDNS)
router = convert.HTTPRouterToProto(&result, protoDNS)
case mantraev1.RouterType_ROUTER_TYPE_TCP:
var params db.UpdateTcpRouterParams
params.ID = req.Msg.Id
params.Name = req.Msg.Name
params.Enabled = req.Msg.Enabled
params.Config, err = convert.UnmarshalStruct[schema.TCPRouter](req.Msg.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
params.Config.Service = params.Name
// Update DNS Providers
existing, err := s.app.Conn.GetQuery().GetDnsProvidersByTcpRouter(ctx, params.ID)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
existingMap := make(map[int64]bool)
for _, provider := range existing {
existingMap[provider.ID] = true
}
desiredMap := make(map[int64]bool)
var desiredIDs []int64
for _, protoProvider := range req.Msg.DnsProviders {
desiredMap[protoProvider.Id] = true
desiredIDs = append(desiredIDs, protoProvider.Id)
}
// Identify inserts
for _, id := range desiredIDs {
if !existingMap[id] {
if err = s.app.Conn.GetQuery().
CreateTcpRouterDNSProvider(ctx, db.CreateTcpRouterDNSProviderParams{
TcpRouterID: params.ID,
DnsProviderID: id,
}); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
}
// Identify deletes
for id := range existingMap {
if !desiredMap[id] {
if err = s.app.Conn.GetQuery().
DeleteTcpRouterDNSProvider(ctx, db.DeleteTcpRouterDNSProviderParams{
TcpRouterID: params.ID,
DnsProviderID: id,
}); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
}
result, err := s.app.Conn.GetQuery().UpdateTcpRouter(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
resultDNS, err := s.app.Conn.GetQuery().GetDnsProvidersByTcpRouter(ctx, result.ID)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
protoDNS := convert.DNSProvidersToProto(resultDNS)
router = convert.TCPRouterToProto(&result, protoDNS)
case mantraev1.RouterType_ROUTER_TYPE_UDP:
var params db.UpdateUdpRouterParams
params.ID = req.Msg.Id
params.Name = req.Msg.Name
params.Enabled = req.Msg.Enabled
params.Config, err = convert.UnmarshalStruct[schema.UDPRouter](req.Msg.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
params.Config.Service = params.Name
result, err := s.app.Conn.GetQuery().UpdateUdpRouter(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
router = convert.UDPRouterToProto(&result)
default:
return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("invalid router type"))
}
// Broadcast event
// s.app.Event.BroadcastProfileEvent(&mantraev1.ProfileEvent{
// EventType: mantraev1.EventType_EVENT_TYPE_UPDATED,
// ResourceType: mantraev1.ResourceType_RESOURCE_TYPE_ROUTER,
// ProfileId: router.ProfileId,
// Timestamp: timestamppb.Now(),
// Resource: &mantraev1.ProfileEvent_Router{
// Router: router,
// },
// })
return connect.NewResponse(&mantraev1.UpdateRouterResponse{Router: router}), nil
return connect.NewResponse(result), nil
}
func (s *RouterService) DeleteRouter(
ctx context.Context,
req *connect.Request[mantraev1.DeleteRouterRequest],
) (*connect.Response[mantraev1.DeleteRouterResponse], error) {
switch req.Msg.Type {
case mantraev1.RouterType_ROUTER_TYPE_HTTP:
result, err := s.app.Conn.GetQuery().GetHttpRouter(ctx, req.Msg.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if err := s.app.Conn.GetQuery().DeleteHttpRouter(ctx, req.Msg.Id); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if result.Config.Service != "" {
service, err := s.app.Conn.GetQuery().GetHttpServiceByName(ctx, result.Config.Service)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if err := s.app.Conn.GetQuery().DeleteHttpService(ctx, service.ID); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
ops, ok := s.dispatch[req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid router type"),
)
}
case mantraev1.RouterType_ROUTER_TYPE_TCP:
result, err := s.app.Conn.GetQuery().GetTcpRouter(ctx, req.Msg.Id)
result, err := ops.Delete(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if err := s.app.Conn.GetQuery().DeleteTcpRouter(ctx, req.Msg.Id); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if result.Config.Service != "" {
service, err := s.app.Conn.GetQuery().GetTcpServiceByName(ctx, result.Config.Service)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if err := s.app.Conn.GetQuery().DeleteTcpService(ctx, service.ID); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
case mantraev1.RouterType_ROUTER_TYPE_UDP:
result, err := s.app.Conn.GetQuery().GetUdpRouter(ctx, req.Msg.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if err := s.app.Conn.GetQuery().DeleteUdpRouter(ctx, req.Msg.Id); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if result.Config.Service != "" {
service, err := s.app.Conn.GetQuery().GetUdpServiceByName(ctx, result.Config.Service)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if err := s.app.Conn.GetQuery().DeleteUdpService(ctx, service.ID); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
default:
return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("invalid router type"))
}
// s.app.Event.BroadcastProfileEvent(&mantraev1.ProfileEvent{
// EventType: mantraev1.EventType_EVENT_TYPE_DELETED,
// ResourceType: mantraev1.ResourceType_RESOURCE_TYPE_ROUTER,
// ProfileId: router.ProfileId,
// Timestamp: timestamppb.Now(),
// Resource: &mantraev1.ProfileEvent_Router{
// Router: router,
// },
// })
return connect.NewResponse(&mantraev1.DeleteRouterResponse{}), nil
return connect.NewResponse(result), nil
}
func (s *RouterService) ListRouters(
ctx context.Context,
req *connect.Request[mantraev1.ListRoutersRequest],
) (*connect.Response[mantraev1.ListRoutersResponse], error) {
var limit int64
var offset int64
if req.Msg.Limit == nil {
limit = 100
} else {
limit = *req.Msg.Limit
}
if req.Msg.Offset == nil {
offset = 0
} else {
offset = *req.Msg.Offset
if req.Msg.Type != nil {
ops, ok := s.dispatch[*req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid router type"),
)
}
var routers []*mantraev1.Router
var totalCount int64
if req.Msg.Type == nil {
if req.Msg.AgentId == nil {
result, err := s.app.Conn.GetQuery().
ListRoutersByProfile(ctx, db.ListRoutersByProfileParams{
Limit: limit,
Offset: offset,
ProfileID: req.Msg.ProfileId,
ProfileID_2: req.Msg.ProfileId,
ProfileID_3: req.Msg.ProfileId,
})
result, err := ops.List(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
totalCount, err = s.app.Conn.GetQuery().
CountRoutersByProfile(ctx, db.CountRoutersByProfileParams{
ProfileID: req.Msg.ProfileId,
ProfileID_2: req.Msg.ProfileId,
ProfileID_3: req.Msg.ProfileId,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
routers = convert.RoutersByProfileToProto(result, s.app.Conn.GetQuery())
return connect.NewResponse(result), nil
} else {
result, err := s.app.Conn.GetQuery().
ListRoutersByAgent(ctx, db.ListRoutersByAgentParams{
Limit: limit,
Offset: offset,
AgentID: req.Msg.AgentId,
AgentID_2: req.Msg.AgentId,
AgentID_3: req.Msg.AgentId,
})
// Get HTTP routers
httpOps := s.dispatch[mantraev1.RouterType_ROUTER_TYPE_HTTP]
httpResult, err := httpOps.List(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
totalCount, err = s.app.Conn.GetQuery().
CountRoutersByAgent(ctx, db.CountRoutersByAgentParams{
AgentID: req.Msg.AgentId,
AgentID_2: req.Msg.AgentId,
AgentID_3: req.Msg.AgentId,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
routers = convert.RoutersByAgentToProto(result, s.app.Conn.GetQuery())
}
} else {
var err error
switch *req.Msg.Type {
case mantraev1.RouterType_ROUTER_TYPE_HTTP:
if req.Msg.AgentId == nil {
totalCount, err = s.app.Conn.GetQuery().CountHttpRoutersByProfile(ctx, req.Msg.ProfileId)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().ListHttpRouters(ctx, db.ListHttpRoutersParams{
ProfileID: req.Msg.ProfileId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
routers = convert.HTTPRoutersToProto(result, s.app.Conn.GetQuery())
} else {
totalCount, err = s.app.Conn.GetQuery().CountHttpRoutersByAgent(ctx, req.Msg.AgentId)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().ListHttpRoutersByAgent(ctx, db.ListHttpRoutersByAgentParams{
AgentID: req.Msg.AgentId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
routers = convert.HTTPRoutersToProto(result, s.app.Conn.GetQuery())
}
case mantraev1.RouterType_ROUTER_TYPE_TCP:
if req.Msg.AgentId == nil {
totalCount, err = s.app.Conn.GetQuery().CountTcpRoutersByProfile(ctx, req.Msg.ProfileId)
// Get TCP routers
tcpOps := s.dispatch[mantraev1.RouterType_ROUTER_TYPE_TCP]
tcpResult, err := tcpOps.List(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().ListTcpRouters(ctx, db.ListTcpRoutersParams{
ProfileID: req.Msg.ProfileId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
routers = convert.TCPRoutersToProto(result, s.app.Conn.GetQuery())
} else {
totalCount, err = s.app.Conn.GetQuery().CountTcpRoutersByAgent(ctx, req.Msg.AgentId)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().ListTcpRoutersByAgent(ctx, db.ListTcpRoutersByAgentParams{
AgentID: req.Msg.AgentId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
routers = convert.TCPRoutersToProto(result, s.app.Conn.GetQuery())
}
case mantraev1.RouterType_ROUTER_TYPE_UDP:
if req.Msg.AgentId == nil {
totalCount, err = s.app.Conn.GetQuery().CountUdpRoutersByProfile(ctx, req.Msg.ProfileId)
// Get UDP routers
udpOps := s.dispatch[mantraev1.RouterType_ROUTER_TYPE_UDP]
udpResult, err := udpOps.List(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().ListUdpRouters(ctx, db.ListUdpRoutersParams{
ProfileID: req.Msg.ProfileId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
routers = convert.UDPRoutersToProto(result)
} else {
totalCount, err = s.app.Conn.GetQuery().CountUdpRoutersByAgent(ctx, req.Msg.AgentId)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().ListUdpRoutersByAgent(ctx, db.ListUdpRoutersByAgentParams{
AgentID: req.Msg.AgentId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
routers = convert.UDPRoutersToProto(result)
}
default:
return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("invalid router type"))
}
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
// Combine results
allRouters := append(httpResult.Routers, tcpResult.Routers...)
allRouters = append(allRouters, udpResult.Routers...)
totalCount := httpResult.TotalCount + tcpResult.TotalCount + udpResult.TotalCount
return connect.NewResponse(&mantraev1.ListRoutersResponse{
Routers: routers,
Routers: allRouters,
TotalCount: totalCount,
}), nil
}
}

View File

@@ -0,0 +1,534 @@
package service
import (
"context"
"connectrpc.com/connect"
"github.com/mizuchilabs/mantrae/internal/config"
"github.com/mizuchilabs/mantrae/internal/store/db"
"github.com/mizuchilabs/mantrae/internal/store/schema"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
type RouterOps interface {
Get(
ctx context.Context,
req *mantraev1.GetRouterRequest,
) (*mantraev1.GetRouterResponse, error)
Create(
ctx context.Context,
req *mantraev1.CreateRouterRequest,
) (*mantraev1.CreateRouterResponse, error)
Update(
ctx context.Context,
req *mantraev1.UpdateRouterRequest,
) (*mantraev1.UpdateRouterResponse, error)
Delete(
ctx context.Context,
req *mantraev1.DeleteRouterRequest,
) (*mantraev1.DeleteRouterResponse, error)
List(
ctx context.Context,
req *mantraev1.ListRoutersRequest,
) (*mantraev1.ListRoutersResponse, error)
}
type HTTPRouterOps struct {
app *config.App
}
type TCPRouterOps struct {
app *config.App
}
type UDPRouterOps struct {
app *config.App
}
func NewHTTPRouterOps(app *config.App) *HTTPRouterOps {
return &HTTPRouterOps{app: app}
}
func NewTCPRouterOps(app *config.App) *TCPRouterOps {
return &TCPRouterOps{app: app}
}
func NewUDPRouterOps(app *config.App) *UDPRouterOps {
return &UDPRouterOps{app: app}
}
// HTTP Router Operations -----------------------------------------------------
func (s *HTTPRouterOps) Get(
ctx context.Context,
req *mantraev1.GetRouterRequest,
) (*mantraev1.GetRouterResponse, error) {
result, err := s.app.Conn.GetQuery().GetHttpRouter(ctx, req.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return &mantraev1.GetRouterResponse{
Router: result.ToProto(),
}, nil
}
func (s *HTTPRouterOps) Create(
ctx context.Context,
req *mantraev1.CreateRouterRequest,
) (*mantraev1.CreateRouterResponse, error) {
params := db.CreateHttpRouterParams{
ProfileID: req.ProfileId,
Name: req.Name,
AgentID: req.AgentId,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.HTTPRouter](req.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
params.Config.Service = params.Name
result, err := s.app.Conn.GetQuery().CreateHttpRouter(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
router := result.ToProto()
dnsProviders, err := s.app.Conn.GetQuery().GetDnsProvidersByHttpRouter(ctx, result.ID)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
router.DnsProviders = make([]*mantraev1.DnsProvider, 0, len(dnsProviders))
for _, p := range dnsProviders {
router.DnsProviders = append(router.DnsProviders, p.ToProto())
}
return &mantraev1.CreateRouterResponse{
Router: router,
}, nil
}
func (s *HTTPRouterOps) Update(
ctx context.Context,
req *mantraev1.UpdateRouterRequest,
) (*mantraev1.UpdateRouterResponse, error) {
params := db.UpdateHttpRouterParams{
ID: req.Id,
Name: req.Name,
Enabled: req.Enabled,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.HTTPRouter](req.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
params.Config.Service = params.Name
// Update DNS Providers
existing, err := s.app.Conn.GetQuery().GetDnsProvidersByHttpRouter(ctx, params.ID)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
existingMap := make(map[int64]bool)
for _, provider := range existing {
existingMap[provider.ID] = true
}
desiredMap := make(map[int64]bool)
var desiredIDs []int64
for _, protoProvider := range req.DnsProviders {
desiredMap[protoProvider.Id] = true
desiredIDs = append(desiredIDs, protoProvider.Id)
}
// Identify inserts
for _, id := range desiredIDs {
if !existingMap[id] {
if err = s.app.Conn.GetQuery().
CreateHttpRouterDNSProvider(ctx, db.CreateHttpRouterDNSProviderParams{
HttpRouterID: params.ID,
DnsProviderID: id,
}); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
}
// Identify deletes
for id := range existingMap {
if !desiredMap[id] {
if err = s.app.Conn.GetQuery().
DeleteHttpRouterDNSProvider(ctx, db.DeleteHttpRouterDNSProviderParams{
HttpRouterID: params.ID,
DnsProviderID: id,
}); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
}
result, err := s.app.Conn.GetQuery().UpdateHttpRouter(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
router := result.ToProto()
dnsProviders, err := s.app.Conn.GetQuery().GetDnsProvidersByHttpRouter(ctx, result.ID)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
router.DnsProviders = make([]*mantraev1.DnsProvider, 0, len(dnsProviders))
for _, p := range dnsProviders {
router.DnsProviders = append(router.DnsProviders, p.ToProto())
}
return &mantraev1.UpdateRouterResponse{
Router: router,
}, nil
}
func (s *HTTPRouterOps) Delete(
ctx context.Context,
req *mantraev1.DeleteRouterRequest,
) (*mantraev1.DeleteRouterResponse, error) {
router, err := s.app.Conn.GetQuery().GetHttpRouter(ctx, req.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if router.Config.Service != "" {
service, err := s.app.Conn.GetQuery().GetHttpServiceByName(ctx, router.Config.Service)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if err := s.app.Conn.GetQuery().DeleteHttpService(ctx, service.ID); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
if err := s.app.Conn.GetQuery().DeleteHttpRouter(ctx, req.Id); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return &mantraev1.DeleteRouterResponse{}, nil
}
func (s *HTTPRouterOps) List(
ctx context.Context,
req *mantraev1.ListRoutersRequest,
) (*mantraev1.ListRoutersResponse, error) {
result, err := s.app.Conn.GetQuery().
ListHttpRouters(ctx, db.ListHttpRoutersParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
Limit: req.Limit,
Offset: req.Offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
totalCount, err := s.app.Conn.GetQuery().CountHttpRouters(ctx, db.CountHttpRoutersParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
routers := make([]*mantraev1.Router, 0, len(result))
for _, r := range result {
routers = append(routers, r.ToProto())
}
return &mantraev1.ListRoutersResponse{
Routers: routers,
TotalCount: totalCount,
}, nil
}
// TCP Router Operations ------------------------------------------------------
func (s *TCPRouterOps) Get(
ctx context.Context,
req *mantraev1.GetRouterRequest,
) (*mantraev1.GetRouterResponse, error) {
result, err := s.app.Conn.GetQuery().GetTcpRouter(ctx, req.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return &mantraev1.GetRouterResponse{
Router: result.ToProto(),
}, nil
}
func (s *TCPRouterOps) Create(
ctx context.Context,
req *mantraev1.CreateRouterRequest,
) (*mantraev1.CreateRouterResponse, error) {
params := db.CreateTcpRouterParams{
ProfileID: req.ProfileId,
Name: req.Name,
AgentID: req.AgentId,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.TCPRouter](req.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
params.Config.Service = params.Name
result, err := s.app.Conn.GetQuery().CreateTcpRouter(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return &mantraev1.CreateRouterResponse{
Router: result.ToProto(),
}, nil
}
func (s *TCPRouterOps) Update(
ctx context.Context,
req *mantraev1.UpdateRouterRequest,
) (*mantraev1.UpdateRouterResponse, error) {
params := db.UpdateTcpRouterParams{
ID: req.Id,
Name: req.Name,
Enabled: req.Enabled,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.TCPRouter](req.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
params.Config.Service = params.Name
// Update DNS Providers
existing, err := s.app.Conn.GetQuery().GetDnsProvidersByTcpRouter(ctx, params.ID)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
existingMap := make(map[int64]bool)
for _, provider := range existing {
existingMap[provider.ID] = true
}
desiredMap := make(map[int64]bool)
var desiredIDs []int64
for _, protoProvider := range req.DnsProviders {
desiredMap[protoProvider.Id] = true
desiredIDs = append(desiredIDs, protoProvider.Id)
}
// Identify inserts
for _, id := range desiredIDs {
if !existingMap[id] {
if err = s.app.Conn.GetQuery().
CreateTcpRouterDNSProvider(ctx, db.CreateTcpRouterDNSProviderParams{
TcpRouterID: params.ID,
DnsProviderID: id,
}); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
}
// Identify deletes
for id := range existingMap {
if !desiredMap[id] {
if err = s.app.Conn.GetQuery().
DeleteTcpRouterDNSProvider(ctx, db.DeleteTcpRouterDNSProviderParams{
TcpRouterID: params.ID,
DnsProviderID: id,
}); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
}
result, err := s.app.Conn.GetQuery().UpdateTcpRouter(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return &mantraev1.UpdateRouterResponse{
Router: result.ToProto(),
}, nil
}
func (s *TCPRouterOps) Delete(
ctx context.Context,
req *mantraev1.DeleteRouterRequest,
) (*mantraev1.DeleteRouterResponse, error) {
router, err := s.app.Conn.GetQuery().GetTcpRouter(ctx, req.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if router.Config.Service != "" {
service, err := s.app.Conn.GetQuery().GetTcpServiceByName(ctx, router.Config.Service)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if err := s.app.Conn.GetQuery().DeleteTcpService(ctx, service.ID); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
if err := s.app.Conn.GetQuery().DeleteTcpRouter(ctx, req.Id); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return &mantraev1.DeleteRouterResponse{}, nil
}
func (s *TCPRouterOps) List(
ctx context.Context,
req *mantraev1.ListRoutersRequest,
) (*mantraev1.ListRoutersResponse, error) {
result, err := s.app.Conn.GetQuery().
ListTcpRouters(ctx, db.ListTcpRoutersParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
Limit: req.Limit,
Offset: req.Offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
totalCount, err := s.app.Conn.GetQuery().CountTcpRouters(ctx, db.CountTcpRoutersParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
routers := make([]*mantraev1.Router, 0, len(result))
for _, r := range result {
routers = append(routers, r.ToProto())
}
return &mantraev1.ListRoutersResponse{
Routers: routers,
TotalCount: totalCount,
}, nil
}
// UDP Router Operations ------------------------------------------------------
func (s *UDPRouterOps) Get(
ctx context.Context,
req *mantraev1.GetRouterRequest,
) (*mantraev1.GetRouterResponse, error) {
result, err := s.app.Conn.GetQuery().GetUdpRouter(ctx, req.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return &mantraev1.GetRouterResponse{
Router: result.ToProto(),
}, nil
}
func (s *UDPRouterOps) Create(
ctx context.Context,
req *mantraev1.CreateRouterRequest,
) (*mantraev1.CreateRouterResponse, error) {
params := db.CreateUdpRouterParams{
ProfileID: req.ProfileId,
Name: req.Name,
AgentID: req.AgentId,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.UDPRouter](req.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
params.Config.Service = params.Name
result, err := s.app.Conn.GetQuery().CreateUdpRouter(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return &mantraev1.CreateRouterResponse{
Router: result.ToProto(),
}, nil
}
func (s *UDPRouterOps) Update(
ctx context.Context,
req *mantraev1.UpdateRouterRequest,
) (*mantraev1.UpdateRouterResponse, error) {
params := db.UpdateUdpRouterParams{
ID: req.Id,
Name: req.Name,
Enabled: req.Enabled,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.UDPRouter](req.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
params.Config.Service = params.Name
result, err := s.app.Conn.GetQuery().UpdateUdpRouter(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return &mantraev1.UpdateRouterResponse{
Router: result.ToProto(),
}, nil
}
func (s *UDPRouterOps) Delete(
ctx context.Context,
req *mantraev1.DeleteRouterRequest,
) (*mantraev1.DeleteRouterResponse, error) {
router, err := s.app.Conn.GetQuery().GetUdpRouter(ctx, req.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if router.Config.Service != "" {
service, err := s.app.Conn.GetQuery().GetUdpServiceByName(ctx, router.Config.Service)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
if err := s.app.Conn.GetQuery().DeleteUdpService(ctx, service.ID); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
if err := s.app.Conn.GetQuery().DeleteUdpRouter(ctx, req.Id); err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return &mantraev1.DeleteRouterResponse{}, nil
}
func (s *UDPRouterOps) List(
ctx context.Context,
req *mantraev1.ListRoutersRequest,
) (*mantraev1.ListRoutersResponse, error) {
result, err := s.app.Conn.GetQuery().
ListUdpRouters(ctx, db.ListUdpRoutersParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
Limit: req.Limit,
Offset: req.Offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
totalCount, err := s.app.Conn.GetQuery().CountUdpRouters(ctx, db.CountUdpRoutersParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
routers := make([]*mantraev1.Router, 0, len(result))
for _, r := range result {
routers = append(routers, r.ToProto())
}
return &mantraev1.ListRoutersResponse{
Routers: routers,
TotalCount: totalCount,
}, nil
}

View File

@@ -3,319 +3,147 @@ package service
import (
"context"
"errors"
"fmt"
"connectrpc.com/connect"
"github.com/mizuchilabs/mantrae/internal/config"
"github.com/mizuchilabs/mantrae/internal/convert"
"github.com/mizuchilabs/mantrae/internal/store/db"
"github.com/mizuchilabs/mantrae/internal/store/schema"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
type ServersTransportService struct {
app *config.App
dispatch map[mantraev1.ServersTransportType]ServersTransportOps
}
func NewServersTransportService(app *config.App) *ServersTransportService {
return &ServersTransportService{app: app}
return &ServersTransportService{
app: app,
dispatch: map[mantraev1.ServersTransportType]ServersTransportOps{
mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_HTTP: NewHTTPServersTransportOps(
app,
),
mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_TCP: NewTCPServersTransportOps(
app,
),
},
}
}
func (s *ServersTransportService) GetServersTransport(
ctx context.Context,
req *connect.Request[mantraev1.GetServersTransportRequest],
) (*connect.Response[mantraev1.GetServersTransportResponse], error) {
var serversTransport *mantraev1.ServersTransport
ops, ok := s.dispatch[req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid servers transport type"),
)
}
switch req.Msg.Type {
case mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_HTTP:
result, err := s.app.Conn.GetQuery().GetHttpServersTransport(ctx, req.Msg.Id)
result, err := ops.Get(ctx, req.Msg)
if err != nil {
return nil, err
}
serversTransport = convert.HTTPServersTransportToProto(&result)
case mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_TCP:
result, err := s.app.Conn.GetQuery().GetTcpServersTransport(ctx, req.Msg.Id)
if err != nil {
return nil, err
}
serversTransport = convert.TCPServersTransportToProto(&result)
default:
return nil, fmt.Errorf("invalid servers transport type")
}
return connect.NewResponse(
&mantraev1.GetServersTransportResponse{ServersTransport: serversTransport},
), nil
return connect.NewResponse(result), nil
}
func (s *ServersTransportService) CreateServersTransport(
ctx context.Context,
req *connect.Request[mantraev1.CreateServersTransportRequest],
) (*connect.Response[mantraev1.CreateServersTransportResponse], error) {
var serversTransport *mantraev1.ServersTransport
var err error
switch req.Msg.Type {
case mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_HTTP:
var params db.CreateHttpServersTransportParams
params.ProfileID = req.Msg.ProfileId
params.Name = req.Msg.Name
if req.Msg.AgentId != "" {
params.AgentID = &req.Msg.AgentId
ops, ok := s.dispatch[req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid servers transport type"),
)
}
params.Config, err = convert.UnmarshalStruct[schema.HTTPServersTransport](req.Msg.Config)
result, err := ops.Create(ctx, req.Msg)
if err != nil {
return nil, err
}
result, err := s.app.Conn.GetQuery().CreateHttpServersTransport(ctx, params)
if err != nil {
return nil, err
}
serversTransport = convert.HTTPServersTransportToProto(&result)
case mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_TCP:
var params db.CreateTcpServersTransportParams
params.ProfileID = req.Msg.ProfileId
params.Name = req.Msg.Name
if req.Msg.AgentId != "" {
params.AgentID = &req.Msg.AgentId
}
params.Config, err = convert.UnmarshalStruct[schema.TCPServersTransport](req.Msg.Config)
if err != nil {
return nil, err
}
result, err := s.app.Conn.GetQuery().CreateTcpServersTransport(ctx, params)
if err != nil {
return nil, err
}
serversTransport = convert.TCPServersTransportToProto(&result)
default:
return nil, fmt.Errorf("invalid servers transport type")
}
return connect.NewResponse(
&mantraev1.CreateServersTransportResponse{ServersTransport: serversTransport},
), nil
return connect.NewResponse(result), nil
}
func (s *ServersTransportService) UpdateServersTransport(
ctx context.Context,
req *connect.Request[mantraev1.UpdateServersTransportRequest],
) (*connect.Response[mantraev1.UpdateServersTransportResponse], error) {
var serversTransport *mantraev1.ServersTransport
var err error
ops, ok := s.dispatch[req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid servers transport type"),
)
}
switch req.Msg.Type {
case mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_HTTP:
var params db.UpdateHttpServersTransportParams
params.ID = req.Msg.Id
params.Name = req.Msg.Name
params.Enabled = req.Msg.Enabled
params.Config, err = convert.UnmarshalStruct[schema.HTTPServersTransport](req.Msg.Config)
result, err := ops.Update(ctx, req.Msg)
if err != nil {
return nil, err
}
result, err := s.app.Conn.GetQuery().UpdateHttpServersTransport(ctx, params)
if err != nil {
return nil, err
}
serversTransport = convert.HTTPServersTransportToProto(&result)
case mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_TCP:
var params db.UpdateTcpServersTransportParams
params.ID = req.Msg.Id
params.Name = req.Msg.Name
params.Enabled = req.Msg.Enabled
params.Config, err = convert.UnmarshalStruct[schema.TCPServersTransport](req.Msg.Config)
if err != nil {
return nil, err
}
result, err := s.app.Conn.GetQuery().UpdateTcpServersTransport(ctx, params)
if err != nil {
return nil, err
}
serversTransport = convert.TCPServersTransportToProto(&result)
default:
return nil, fmt.Errorf("invalid servers transport type")
}
return connect.NewResponse(
&mantraev1.UpdateServersTransportResponse{ServersTransport: serversTransport},
), nil
return connect.NewResponse(result), nil
}
func (s *ServersTransportService) DeleteServersTransport(
ctx context.Context,
req *connect.Request[mantraev1.DeleteServersTransportRequest],
) (*connect.Response[mantraev1.DeleteServersTransportResponse], error) {
switch req.Msg.Type {
case mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_HTTP:
if err := s.app.Conn.GetQuery().DeleteHttpServersTransport(ctx, req.Msg.Id); err != nil {
ops, ok := s.dispatch[req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid servers transport type"),
)
}
result, err := ops.Delete(ctx, req.Msg)
if err != nil {
return nil, err
}
case mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_TCP:
if err := s.app.Conn.GetQuery().DeleteTcpServersTransport(ctx, req.Msg.Id); err != nil {
return nil, err
}
default:
return nil, fmt.Errorf("invalid servers transport type")
}
return connect.NewResponse(&mantraev1.DeleteServersTransportResponse{}), nil
return connect.NewResponse(result), nil
}
func (s *ServersTransportService) ListServersTransports(
ctx context.Context,
req *connect.Request[mantraev1.ListServersTransportsRequest],
) (*connect.Response[mantraev1.ListServersTransportsResponse], error) {
var limit int64
var offset int64
if req.Msg.Limit == nil {
limit = 100
} else {
limit = *req.Msg.Limit
}
if req.Msg.Offset == nil {
offset = 0
} else {
offset = *req.Msg.Offset
}
var serversTransports []*mantraev1.ServersTransport
var totalCount int64
if req.Msg.Type == nil {
if req.Msg.AgentId == nil {
result, err := s.app.Conn.GetQuery().
ListServersTransportsByProfile(ctx, db.ListServersTransportsByProfileParams{
Limit: limit,
Offset: offset,
ProfileID: req.Msg.ProfileId,
ProfileID_2: req.Msg.ProfileId,
})
if err != nil {
return nil, err
}
totalCount, err = s.app.Conn.GetQuery().
CountServersTransportsByProfile(ctx, db.CountServersTransportsByProfileParams{
ProfileID: req.Msg.ProfileId,
ProfileID_2: req.Msg.ProfileId,
})
if err != nil {
return nil, err
}
serversTransports = convert.ServersTransportsByProfileToProto(
result,
s.app.Conn.GetQuery(),
if req.Msg.Type != nil {
ops, ok := s.dispatch[*req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid servers transport type"),
)
} else {
result, err := s.app.Conn.GetQuery().ListServersTransportsByAgent(ctx, db.ListServersTransportsByAgentParams{
Limit: limit,
Offset: offset,
AgentID: req.Msg.AgentId,
AgentID_2: req.Msg.AgentId,
})
if err != nil {
return nil, err
}
totalCount, err = s.app.Conn.GetQuery().CountServersTransportsByAgent(ctx, db.CountServersTransportsByAgentParams{
AgentID: req.Msg.AgentId,
AgentID_2: req.Msg.AgentId,
})
if err != nil {
return nil, err
}
serversTransports = convert.ServersTransportsByAgentToProto(result, s.app.Conn.GetQuery())
}
} else {
var err error
switch *req.Msg.Type {
case mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_HTTP:
if req.Msg.AgentId == nil {
totalCount, err = s.app.Conn.GetQuery().CountHttpServersTransportsByProfile(ctx, req.Msg.ProfileId)
if err != nil {
return nil, err
}
result, err := s.app.Conn.GetQuery().ListHttpServersTransports(ctx, db.ListHttpServersTransportsParams{
ProfileID: req.Msg.ProfileId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, err
}
serversTransports = convert.HTTPServersTransportsToProto(result)
} else {
totalCount, err = s.app.Conn.GetQuery().CountHttpServersTransportsByAgent(ctx, req.Msg.AgentId)
if err != nil {
return nil, err
}
result, err := s.app.Conn.GetQuery().ListHttpServersTransportsByAgent(ctx, db.ListHttpServersTransportsByAgentParams{
AgentID: req.Msg.AgentId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
serversTransports = convert.HTTPServersTransportsToProto(result)
}
case mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_TCP:
if req.Msg.AgentId == nil {
totalCount, err = s.app.Conn.GetQuery().CountTcpServersTransportsByProfile(ctx, req.Msg.ProfileId)
result, err := ops.List(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
return nil, err
}
result, err := s.app.Conn.GetQuery().ListTcpServersTransports(ctx, db.ListTcpServersTransportsParams{
ProfileID: req.Msg.ProfileId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
serversTransports = convert.TCPServersTransportsToProto(result)
return connect.NewResponse(result), nil
} else {
totalCount, err = s.app.Conn.GetQuery().CountTcpServersTransportsByAgent(ctx, req.Msg.AgentId)
// Get HTTP servers transports
httpOps := s.dispatch[mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_HTTP]
httpResult, err := httpOps.List(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().ListTcpServersTransportsByAgent(ctx, db.ListTcpServersTransportsByAgentParams{
AgentID: req.Msg.AgentId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
serversTransports = convert.TCPServersTransportsToProto(result)
return nil, err
}
default:
return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("invalid servers transport type"))
// Get TCP servers transports
tcpOps := s.dispatch[mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_TCP]
tcpResult, err := tcpOps.List(ctx, req.Msg)
if err != nil {
return nil, err
}
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
// Combine results
allServersTransports := append(httpResult.ServersTransports, tcpResult.ServersTransports...)
totalCount := httpResult.TotalCount + tcpResult.TotalCount
return connect.NewResponse(&mantraev1.ListServersTransportsResponse{
ServersTransports: serversTransports,
ServersTransports: allServersTransports,
TotalCount: totalCount,
}), nil
}
}

View File

@@ -0,0 +1,265 @@
package service
import (
"context"
"github.com/mizuchilabs/mantrae/internal/config"
"github.com/mizuchilabs/mantrae/internal/store/db"
"github.com/mizuchilabs/mantrae/internal/store/schema"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
type ServersTransportOps interface {
Get(
ctx context.Context,
req *mantraev1.GetServersTransportRequest,
) (*mantraev1.GetServersTransportResponse, error)
Create(
ctx context.Context,
req *mantraev1.CreateServersTransportRequest,
) (*mantraev1.CreateServersTransportResponse, error)
Update(
ctx context.Context,
req *mantraev1.UpdateServersTransportRequest,
) (*mantraev1.UpdateServersTransportResponse, error)
Delete(
ctx context.Context,
req *mantraev1.DeleteServersTransportRequest,
) (*mantraev1.DeleteServersTransportResponse, error)
List(
ctx context.Context,
req *mantraev1.ListServersTransportsRequest,
) (*mantraev1.ListServersTransportsResponse, error)
}
type HTTPServersTransportOps struct {
app *config.App
}
type TCPServersTransportOps struct {
app *config.App
}
func NewHTTPServersTransportOps(app *config.App) *HTTPServersTransportOps {
return &HTTPServersTransportOps{app: app}
}
func NewTCPServersTransportOps(app *config.App) *TCPServersTransportOps {
return &TCPServersTransportOps{app: app}
}
// HTTP Servers Transport Operations ------------------------------------------
func (s *HTTPServersTransportOps) Get(
ctx context.Context,
req *mantraev1.GetServersTransportRequest,
) (*mantraev1.GetServersTransportResponse, error) {
result, err := s.app.Conn.GetQuery().GetHttpServersTransport(ctx, req.Id)
if err != nil {
return nil, err
}
return &mantraev1.GetServersTransportResponse{
ServersTransport: result.ToProto(),
}, nil
}
func (s *HTTPServersTransportOps) Create(
ctx context.Context,
req *mantraev1.CreateServersTransportRequest,
) (*mantraev1.CreateServersTransportResponse, error) {
params := db.CreateHttpServersTransportParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
Name: req.Name,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.HTTPServersTransport](req.Config)
if err != nil {
return nil, err
}
result, err := s.app.Conn.GetQuery().CreateHttpServersTransport(ctx, params)
if err != nil {
return nil, err
}
return &mantraev1.CreateServersTransportResponse{
ServersTransport: result.ToProto(),
}, nil
}
func (s *HTTPServersTransportOps) Update(
ctx context.Context,
req *mantraev1.UpdateServersTransportRequest,
) (*mantraev1.UpdateServersTransportResponse, error) {
params := db.UpdateHttpServersTransportParams{
ID: req.Id,
Name: req.Name,
Enabled: req.Enabled,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.HTTPServersTransport](req.Config)
if err != nil {
return nil, err
}
result, err := s.app.Conn.GetQuery().UpdateHttpServersTransport(ctx, params)
if err != nil {
return nil, err
}
return &mantraev1.UpdateServersTransportResponse{
ServersTransport: result.ToProto(),
}, nil
}
func (s *HTTPServersTransportOps) Delete(
ctx context.Context,
req *mantraev1.DeleteServersTransportRequest,
) (*mantraev1.DeleteServersTransportResponse, error) {
if err := s.app.Conn.GetQuery().DeleteHttpServersTransport(ctx, req.Id); err != nil {
return nil, err
}
return &mantraev1.DeleteServersTransportResponse{}, nil
}
func (s *HTTPServersTransportOps) List(
ctx context.Context,
req *mantraev1.ListServersTransportsRequest,
) (*mantraev1.ListServersTransportsResponse, error) {
result, err := s.app.Conn.GetQuery().
ListHttpServersTransports(ctx, db.ListHttpServersTransportsParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
Limit: req.Limit,
Offset: req.Offset,
})
if err != nil {
return nil, err
}
totalCount, err := s.app.Conn.GetQuery().
CountHttpServersTransports(ctx, db.CountHttpServersTransportsParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
})
if err != nil {
return nil, err
}
serversTransports := make([]*mantraev1.ServersTransport, 0, len(result))
for _, s := range result {
serversTransports = append(serversTransports, s.ToProto())
}
return &mantraev1.ListServersTransportsResponse{
ServersTransports: serversTransports,
TotalCount: totalCount,
}, nil
}
// TCP Servers Transport Operations -------------------------------------------
func (s *TCPServersTransportOps) Get(
ctx context.Context,
req *mantraev1.GetServersTransportRequest,
) (*mantraev1.GetServersTransportResponse, error) {
result, err := s.app.Conn.GetQuery().GetTcpServersTransport(ctx, req.Id)
if err != nil {
return nil, err
}
return &mantraev1.GetServersTransportResponse{
ServersTransport: result.ToProto(),
}, nil
}
func (s *TCPServersTransportOps) Create(
ctx context.Context,
req *mantraev1.CreateServersTransportRequest,
) (*mantraev1.CreateServersTransportResponse, error) {
params := db.CreateTcpServersTransportParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
Name: req.Name,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.TCPServersTransport](req.Config)
if err != nil {
return nil, err
}
result, err := s.app.Conn.GetQuery().CreateTcpServersTransport(ctx, params)
if err != nil {
return nil, err
}
return &mantraev1.CreateServersTransportResponse{
ServersTransport: result.ToProto(),
}, nil
}
func (s *TCPServersTransportOps) Update(
ctx context.Context,
req *mantraev1.UpdateServersTransportRequest,
) (*mantraev1.UpdateServersTransportResponse, error) {
params := db.UpdateTcpServersTransportParams{
ID: req.Id,
Name: req.Name,
Enabled: req.Enabled,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.TCPServersTransport](req.Config)
if err != nil {
return nil, err
}
result, err := s.app.Conn.GetQuery().UpdateTcpServersTransport(ctx, params)
if err != nil {
return nil, err
}
return &mantraev1.UpdateServersTransportResponse{
ServersTransport: result.ToProto(),
}, nil
}
func (s *TCPServersTransportOps) Delete(
ctx context.Context,
req *mantraev1.DeleteServersTransportRequest,
) (*mantraev1.DeleteServersTransportResponse, error) {
if err := s.app.Conn.GetQuery().DeleteTcpServersTransport(ctx, req.Id); err != nil {
return nil, err
}
return &mantraev1.DeleteServersTransportResponse{}, nil
}
func (s *TCPServersTransportOps) List(
ctx context.Context,
req *mantraev1.ListServersTransportsRequest,
) (*mantraev1.ListServersTransportsResponse, error) {
result, err := s.app.Conn.GetQuery().
ListTcpServersTransports(ctx, db.ListTcpServersTransportsParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
Limit: req.Limit,
Offset: req.Offset,
})
if err != nil {
return nil, err
}
totalCount, err := s.app.Conn.GetQuery().
CountTcpServersTransports(ctx, db.CountTcpServersTransportsParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
})
if err != nil {
return nil, err
}
serversTransports := make([]*mantraev1.ServersTransport, 0, len(result))
for _, s := range result {
serversTransports = append(serversTransports, s.ToProto())
}
return &mantraev1.ListServersTransportsResponse{
ServersTransports: serversTransports,
TotalCount: totalCount,
}, nil
}

View File

@@ -3,404 +3,173 @@ package service
import (
"context"
"errors"
"connectrpc.com/connect"
"github.com/mizuchilabs/mantrae/internal/config"
"github.com/mizuchilabs/mantrae/internal/convert"
"github.com/mizuchilabs/mantrae/internal/store/db"
"github.com/mizuchilabs/mantrae/internal/store/schema"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
type Service struct {
app *config.App
dispatch map[mantraev1.ServiceType]ServiceOps
}
func NewServiceService(app *config.App) *Service {
return &Service{app: app}
return &Service{
app: app,
dispatch: map[mantraev1.ServiceType]ServiceOps{
mantraev1.ServiceType_SERVICE_TYPE_HTTP: NewHTTPServiceOps(app),
mantraev1.ServiceType_SERVICE_TYPE_TCP: NewTCPServiceOps(app),
mantraev1.ServiceType_SERVICE_TYPE_UDP: NewUDPServiceOps(app),
},
}
}
func (s *Service) GetService(
ctx context.Context,
req *connect.Request[mantraev1.GetServiceRequest],
) (*connect.Response[mantraev1.GetServiceResponse], error) {
var service *mantraev1.Service
ops, ok := s.dispatch[req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid service type"),
)
}
switch req.Msg.Type {
case mantraev1.ServiceType_SERVICE_TYPE_HTTP:
result, err := s.app.Conn.GetQuery().GetHttpService(ctx, req.Msg.Id)
result, err := ops.Get(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
service = convert.HTTPServiceToProto(&result)
case mantraev1.ServiceType_SERVICE_TYPE_TCP:
result, err := s.app.Conn.GetQuery().GetTcpService(ctx, req.Msg.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
service = convert.TCPServiceToProto(&result)
case mantraev1.ServiceType_SERVICE_TYPE_UDP:
result, err := s.app.Conn.GetQuery().GetUdpService(ctx, req.Msg.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
service = convert.UDPServiceToProto(&result)
default:
return nil, connect.NewError(connect.CodeInvalidArgument, nil)
}
return connect.NewResponse(&mantraev1.GetServiceResponse{Service: service}), nil
return connect.NewResponse(result), nil
}
func (s *Service) CreateService(
ctx context.Context,
req *connect.Request[mantraev1.CreateServiceRequest],
) (*connect.Response[mantraev1.CreateServiceResponse], error) {
var service *mantraev1.Service
var err error
switch req.Msg.Type {
case mantraev1.ServiceType_SERVICE_TYPE_HTTP:
var params db.CreateHttpServiceParams
params.ProfileID = req.Msg.ProfileId
params.Name = req.Msg.Name
if req.Msg.AgentId != "" {
params.AgentID = &req.Msg.AgentId
}
params.Config, err = convert.UnmarshalStruct[schema.HTTPService](req.Msg.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
ops, ok := s.dispatch[req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid service type"),
)
}
result, err := s.app.Conn.GetQuery().CreateHttpService(ctx, params)
result, err := ops.Create(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
service = convert.HTTPServiceToProto(&result)
case mantraev1.ServiceType_SERVICE_TYPE_TCP:
var params db.CreateTcpServiceParams
params.ProfileID = req.Msg.ProfileId
params.Name = req.Msg.Name
if req.Msg.AgentId != "" {
params.AgentID = &req.Msg.AgentId
}
params.Config, err = convert.UnmarshalStruct[schema.TCPService](req.Msg.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
result, err := s.app.Conn.GetQuery().CreateTcpService(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
service = convert.TCPServiceToProto(&result)
case mantraev1.ServiceType_SERVICE_TYPE_UDP:
var params db.CreateUdpServiceParams
params.ProfileID = req.Msg.ProfileId
params.Name = req.Msg.Name
if req.Msg.AgentId != "" {
params.AgentID = &req.Msg.AgentId
}
params.Config, err = convert.UnmarshalStruct[schema.UDPService](req.Msg.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
result, err := s.app.Conn.GetQuery().CreateUdpService(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
service = convert.UDPServiceToProto(&result)
default:
return nil, connect.NewError(connect.CodeInvalidArgument, nil)
}
return connect.NewResponse(&mantraev1.CreateServiceResponse{Service: service}), nil
return connect.NewResponse(result), nil
}
func (s *Service) UpdateService(
ctx context.Context,
req *connect.Request[mantraev1.UpdateServiceRequest],
) (*connect.Response[mantraev1.UpdateServiceResponse], error) {
var service *mantraev1.Service
var err error
switch req.Msg.Type {
case mantraev1.ServiceType_SERVICE_TYPE_HTTP:
var params db.UpdateHttpServiceParams
params.ID = req.Msg.Id
params.Name = req.Msg.Name
params.Enabled = req.Msg.Enabled
params.Config, err = convert.UnmarshalStruct[schema.HTTPService](req.Msg.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
ops, ok := s.dispatch[req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid service type"),
)
}
result, err := s.app.Conn.GetQuery().UpdateHttpService(ctx, params)
result, err := ops.Update(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
service = convert.HTTPServiceToProto(&result)
case mantraev1.ServiceType_SERVICE_TYPE_TCP:
var params db.UpdateTcpServiceParams
params.ID = req.Msg.Id
params.Name = req.Msg.Name
params.Enabled = req.Msg.Enabled
params.Config, err = convert.UnmarshalStruct[schema.TCPService](req.Msg.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
result, err := s.app.Conn.GetQuery().UpdateTcpService(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
service = convert.TCPServiceToProto(&result)
case mantraev1.ServiceType_SERVICE_TYPE_UDP:
var params db.UpdateUdpServiceParams
params.ID = req.Msg.Id
params.Name = req.Msg.Name
params.Enabled = req.Msg.Enabled
params.Config, err = convert.UnmarshalStruct[schema.UDPService](req.Msg.Config)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, err)
}
result, err := s.app.Conn.GetQuery().UpdateUdpService(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
service = convert.UDPServiceToProto(&result)
default:
return nil, connect.NewError(connect.CodeInvalidArgument, nil)
}
return connect.NewResponse(&mantraev1.UpdateServiceResponse{Service: service}), nil
return connect.NewResponse(result), nil
}
func (s *Service) DeleteService(
ctx context.Context,
req *connect.Request[mantraev1.DeleteServiceRequest],
) (*connect.Response[mantraev1.DeleteServiceResponse], error) {
if err := s.app.Conn.GetQuery().DeleteHttpService(ctx, req.Msg.Id); err != nil {
ops, ok := s.dispatch[req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid service type"),
)
}
result, err := ops.Delete(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.DeleteServiceResponse{}), nil
return connect.NewResponse(result), nil
}
func (s *Service) ListServices(
ctx context.Context,
req *connect.Request[mantraev1.ListServicesRequest],
) (*connect.Response[mantraev1.ListServicesResponse], error) {
var limit int64
var offset int64
if req.Msg.Limit == nil {
limit = 100
} else {
limit = *req.Msg.Limit
}
if req.Msg.Offset == nil {
offset = 0
} else {
offset = *req.Msg.Offset
if req.Msg.Type != nil {
ops, ok := s.dispatch[*req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid service type"),
)
}
var services []*mantraev1.Service
var totalCount int64
if req.Msg.Type == nil {
if req.Msg.AgentId == nil {
result, err := s.app.Conn.GetQuery().
ListServicesByProfile(ctx, db.ListServicesByProfileParams{
Limit: limit,
Offset: offset,
ProfileID: req.Msg.ProfileId,
ProfileID_2: req.Msg.ProfileId,
ProfileID_3: req.Msg.ProfileId,
})
result, err := ops.List(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
totalCount, err = s.app.Conn.GetQuery().
CountServicesByProfile(ctx, db.CountServicesByProfileParams{
ProfileID: req.Msg.ProfileId,
ProfileID_2: req.Msg.ProfileId,
ProfileID_3: req.Msg.ProfileId,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
services = convert.ServicesByProfileToProto(result)
return connect.NewResponse(result), nil
} else {
result, err := s.app.Conn.GetQuery().
ListServicesByAgent(ctx, db.ListServicesByAgentParams{
Limit: limit,
Offset: offset,
AgentID: req.Msg.AgentId,
AgentID_2: req.Msg.AgentId,
AgentID_3: req.Msg.AgentId,
})
// Get HTTP services
httpOps := s.dispatch[mantraev1.ServiceType_SERVICE_TYPE_HTTP]
httpResult, err := httpOps.List(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
totalCount, err = s.app.Conn.GetQuery().
CountServicesByAgent(ctx, db.CountServicesByAgentParams{
AgentID: req.Msg.AgentId,
AgentID_2: req.Msg.AgentId,
AgentID_3: req.Msg.AgentId,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
services = convert.ServicesByAgentToProto(result)
}
} else {
var err error
switch *req.Msg.Type {
case mantraev1.ServiceType_SERVICE_TYPE_HTTP:
if req.Msg.AgentId == nil {
totalCount, err = s.app.Conn.GetQuery().CountHttpServicesByProfile(ctx, req.Msg.ProfileId)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().ListHttpServices(ctx, db.ListHttpServicesParams{
ProfileID: req.Msg.ProfileId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
services = convert.HTTPServicesToProto(result)
} else {
totalCount, err = s.app.Conn.GetQuery().CountHttpServicesByAgent(ctx, req.Msg.AgentId)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().ListHttpServicesByAgent(ctx, db.ListHttpServicesByAgentParams{
AgentID: req.Msg.AgentId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
services = convert.HTTPServicesToProto(result)
}
case mantraev1.ServiceType_SERVICE_TYPE_TCP:
if req.Msg.AgentId == nil {
totalCount, err = s.app.Conn.GetQuery().CountTcpServicesByProfile(ctx, req.Msg.ProfileId)
// Get TCP services
tcpOps := s.dispatch[mantraev1.ServiceType_SERVICE_TYPE_TCP]
tcpResult, err := tcpOps.List(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().ListTcpServices(ctx, db.ListTcpServicesParams{
ProfileID: req.Msg.ProfileId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
services = convert.TCPServicesToProto(result)
} else {
totalCount, err = s.app.Conn.GetQuery().CountTcpServicesByAgent(ctx, req.Msg.AgentId)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().ListTcpServicesByAgent(ctx, db.ListTcpServicesByAgentParams{
AgentID: req.Msg.AgentId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
services = convert.TCPServicesToProto(result)
}
case mantraev1.ServiceType_SERVICE_TYPE_UDP:
if req.Msg.AgentId == nil {
totalCount, err = s.app.Conn.GetQuery().CountUdpServicesByProfile(ctx, req.Msg.ProfileId)
// Get UDP services
udpOps := s.dispatch[mantraev1.ServiceType_SERVICE_TYPE_UDP]
udpResult, err := udpOps.List(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().ListUdpServices(ctx, db.ListUdpServicesParams{
ProfileID: req.Msg.ProfileId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
services = convert.UDPServicesToProto(result)
} else {
totalCount, err = s.app.Conn.GetQuery().CountUdpServicesByAgent(ctx, req.Msg.AgentId)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
result, err := s.app.Conn.GetQuery().ListUdpServicesByAgent(ctx, db.ListUdpServicesByAgentParams{
AgentID: req.Msg.AgentId,
Limit: limit,
Offset: offset,
})
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
services = convert.UDPServicesToProto(result)
}
default:
return nil, connect.NewError(connect.CodeInvalidArgument, nil)
}
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
}
// Combine results
allServices := append(httpResult.Services, tcpResult.Services...)
allServices = append(allServices, udpResult.Services...)
totalCount := httpResult.TotalCount + tcpResult.TotalCount + udpResult.TotalCount
return connect.NewResponse(&mantraev1.ListServicesResponse{
Services: services,
Services: allServices,
TotalCount: totalCount,
}), nil
}
}
func (s *Service) GetServiceByRouter(
ctx context.Context,
req *connect.Request[mantraev1.GetServiceByRouterRequest],
) (*connect.Response[mantraev1.GetServiceByRouterResponse], error) {
var service *mantraev1.Service
switch req.Msg.Type {
case mantraev1.RouterType_ROUTER_TYPE_HTTP:
result, err := s.app.Conn.GetQuery().GetHttpServiceByName(ctx, req.Msg.Name)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
service = convert.HTTPServiceToProto(&result)
case mantraev1.RouterType_ROUTER_TYPE_TCP:
result, err := s.app.Conn.GetQuery().GetTcpServiceByName(ctx, req.Msg.Name)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
service = convert.TCPServiceToProto(&result)
case mantraev1.RouterType_ROUTER_TYPE_UDP:
result, err := s.app.Conn.GetQuery().GetUdpServiceByName(ctx, req.Msg.Name)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
service = convert.UDPServiceToProto(&result)
default:
return nil, connect.NewError(connect.CodeInvalidArgument, nil)
ops, ok := s.dispatch[req.Msg.Type]
if !ok {
return nil, connect.NewError(
connect.CodeInvalidArgument,
errors.New("invalid service type"),
)
}
return connect.NewResponse(&mantraev1.GetServiceByRouterResponse{Service: service}), nil
result, err := ops.GetByRouter(ctx, req.Msg)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(result), nil
}

View File

@@ -0,0 +1,421 @@
package service
import (
"context"
"github.com/mizuchilabs/mantrae/internal/config"
"github.com/mizuchilabs/mantrae/internal/store/db"
"github.com/mizuchilabs/mantrae/internal/store/schema"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
type ServiceOps interface {
Get(
ctx context.Context,
req *mantraev1.GetServiceRequest,
) (*mantraev1.GetServiceResponse, error)
GetByRouter(
ctx context.Context,
req *mantraev1.GetServiceByRouterRequest,
) (*mantraev1.GetServiceByRouterResponse, error)
Create(
ctx context.Context,
req *mantraev1.CreateServiceRequest,
) (*mantraev1.CreateServiceResponse, error)
Update(
ctx context.Context,
req *mantraev1.UpdateServiceRequest,
) (*mantraev1.UpdateServiceResponse, error)
Delete(
ctx context.Context,
req *mantraev1.DeleteServiceRequest,
) (*mantraev1.DeleteServiceResponse, error)
List(
ctx context.Context,
req *mantraev1.ListServicesRequest,
) (*mantraev1.ListServicesResponse, error)
}
type HTTPServiceOps struct {
app *config.App
}
type TCPServiceOps struct {
app *config.App
}
type UDPServiceOps struct {
app *config.App
}
func NewHTTPServiceOps(app *config.App) *HTTPServiceOps {
return &HTTPServiceOps{app: app}
}
func NewTCPServiceOps(app *config.App) *TCPServiceOps {
return &TCPServiceOps{app: app}
}
func NewUDPServiceOps(app *config.App) *UDPServiceOps {
return &UDPServiceOps{app: app}
}
// HTTP Service Operations ----------------------------------------------------
func (s *HTTPServiceOps) Get(
ctx context.Context,
req *mantraev1.GetServiceRequest,
) (*mantraev1.GetServiceResponse, error) {
result, err := s.app.Conn.GetQuery().GetHttpService(ctx, req.Id)
if err != nil {
return nil, err
}
return &mantraev1.GetServiceResponse{
Service: result.ToProto(),
}, nil
}
func (s *HTTPServiceOps) GetByRouter(
ctx context.Context,
req *mantraev1.GetServiceByRouterRequest,
) (*mantraev1.GetServiceByRouterResponse, error) {
result, err := s.app.Conn.GetQuery().GetHttpServiceByName(ctx, req.Name)
if err != nil {
return nil, err
}
return &mantraev1.GetServiceByRouterResponse{
Service: result.ToProto(),
}, nil
}
func (s *HTTPServiceOps) Create(
ctx context.Context,
req *mantraev1.CreateServiceRequest,
) (*mantraev1.CreateServiceResponse, error) {
params := db.CreateHttpServiceParams{
ProfileID: req.ProfileId,
Name: req.Name,
AgentID: req.AgentId,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.HTTPService](req.Config)
if err != nil {
return nil, err
}
result, err := s.app.Conn.GetQuery().CreateHttpService(ctx, params)
if err != nil {
return nil, err
}
return &mantraev1.CreateServiceResponse{
Service: result.ToProto(),
}, nil
}
func (s *HTTPServiceOps) Update(
ctx context.Context,
req *mantraev1.UpdateServiceRequest,
) (*mantraev1.UpdateServiceResponse, error) {
params := db.UpdateHttpServiceParams{
ID: req.Id,
Name: req.Name,
Enabled: req.Enabled,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.HTTPService](req.Config)
if err != nil {
return nil, err
}
result, err := s.app.Conn.GetQuery().UpdateHttpService(ctx, params)
if err != nil {
return nil, err
}
return &mantraev1.UpdateServiceResponse{
Service: result.ToProto(),
}, nil
}
func (s *HTTPServiceOps) Delete(
ctx context.Context,
req *mantraev1.DeleteServiceRequest,
) (*mantraev1.DeleteServiceResponse, error) {
if err := s.app.Conn.GetQuery().DeleteHttpService(ctx, req.Id); err != nil {
return nil, err
}
return &mantraev1.DeleteServiceResponse{}, nil
}
func (s *HTTPServiceOps) List(
ctx context.Context,
req *mantraev1.ListServicesRequest,
) (*mantraev1.ListServicesResponse, error) {
result, err := s.app.Conn.GetQuery().
ListHttpServices(ctx, db.ListHttpServicesParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
Limit: req.Limit,
Offset: req.Offset,
})
if err != nil {
return nil, err
}
totalCount, err := s.app.Conn.GetQuery().CountHttpServices(ctx, db.CountHttpServicesParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
})
if err != nil {
return nil, err
}
services := make([]*mantraev1.Service, 0, len(result))
for _, s := range result {
services = append(services, s.ToProto())
}
return &mantraev1.ListServicesResponse{
Services: services,
TotalCount: totalCount,
}, nil
}
// TCP Service Operations -----------------------------------------------------
func (s *TCPServiceOps) Get(
ctx context.Context,
req *mantraev1.GetServiceRequest,
) (*mantraev1.GetServiceResponse, error) {
result, err := s.app.Conn.GetQuery().GetTcpService(ctx, req.Id)
if err != nil {
return nil, err
}
return &mantraev1.GetServiceResponse{
Service: result.ToProto(),
}, nil
}
func (s *TCPServiceOps) GetByRouter(
ctx context.Context,
req *mantraev1.GetServiceByRouterRequest,
) (*mantraev1.GetServiceByRouterResponse, error) {
result, err := s.app.Conn.GetQuery().GetTcpServiceByName(ctx, req.Name)
if err != nil {
return nil, err
}
return &mantraev1.GetServiceByRouterResponse{
Service: result.ToProto(),
}, nil
}
func (s *TCPServiceOps) Create(
ctx context.Context,
req *mantraev1.CreateServiceRequest,
) (*mantraev1.CreateServiceResponse, error) {
params := db.CreateTcpServiceParams{
ProfileID: req.ProfileId,
Name: req.Name,
AgentID: req.AgentId,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.TCPService](req.Config)
if err != nil {
return nil, err
}
result, err := s.app.Conn.GetQuery().CreateTcpService(ctx, params)
if err != nil {
return nil, err
}
return &mantraev1.CreateServiceResponse{
Service: result.ToProto(),
}, nil
}
func (s *TCPServiceOps) Update(
ctx context.Context,
req *mantraev1.UpdateServiceRequest,
) (*mantraev1.UpdateServiceResponse, error) {
params := db.UpdateTcpServiceParams{
ID: req.Id,
Name: req.Name,
Enabled: req.Enabled,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.TCPService](req.Config)
if err != nil {
return nil, err
}
result, err := s.app.Conn.GetQuery().UpdateTcpService(ctx, params)
if err != nil {
return nil, err
}
return &mantraev1.UpdateServiceResponse{
Service: result.ToProto(),
}, nil
}
func (s *TCPServiceOps) Delete(
ctx context.Context,
req *mantraev1.DeleteServiceRequest,
) (*mantraev1.DeleteServiceResponse, error) {
if err := s.app.Conn.GetQuery().DeleteTcpService(ctx, req.Id); err != nil {
return nil, err
}
return &mantraev1.DeleteServiceResponse{}, nil
}
func (s *TCPServiceOps) List(
ctx context.Context,
req *mantraev1.ListServicesRequest,
) (*mantraev1.ListServicesResponse, error) {
result, err := s.app.Conn.GetQuery().
ListTcpServices(ctx, db.ListTcpServicesParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
Limit: req.Limit,
Offset: req.Offset,
})
if err != nil {
return nil, err
}
totalCount, err := s.app.Conn.GetQuery().CountTcpServices(ctx, db.CountTcpServicesParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
})
if err != nil {
return nil, err
}
services := make([]*mantraev1.Service, 0, len(result))
for _, s := range result {
services = append(services, s.ToProto())
}
return &mantraev1.ListServicesResponse{
Services: services,
TotalCount: totalCount,
}, nil
}
// UDP Service Operations -----------------------------------------------------
func (s *UDPServiceOps) Get(
ctx context.Context,
req *mantraev1.GetServiceRequest,
) (*mantraev1.GetServiceResponse, error) {
result, err := s.app.Conn.GetQuery().GetUdpService(ctx, req.Id)
if err != nil {
return nil, err
}
return &mantraev1.GetServiceResponse{
Service: result.ToProto(),
}, nil
}
func (s *UDPServiceOps) GetByRouter(
ctx context.Context,
req *mantraev1.GetServiceByRouterRequest,
) (*mantraev1.GetServiceByRouterResponse, error) {
result, err := s.app.Conn.GetQuery().GetUdpServiceByName(ctx, req.Name)
if err != nil {
return nil, err
}
return &mantraev1.GetServiceByRouterResponse{
Service: result.ToProto(),
}, nil
}
func (s *UDPServiceOps) Create(
ctx context.Context,
req *mantraev1.CreateServiceRequest,
) (*mantraev1.CreateServiceResponse, error) {
params := db.CreateUdpServiceParams{
ProfileID: req.ProfileId,
Name: req.Name,
AgentID: req.AgentId,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.UDPService](req.Config)
if err != nil {
return nil, err
}
result, err := s.app.Conn.GetQuery().CreateUdpService(ctx, params)
if err != nil {
return nil, err
}
return &mantraev1.CreateServiceResponse{
Service: result.ToProto(),
}, nil
}
func (s *UDPServiceOps) Update(
ctx context.Context,
req *mantraev1.UpdateServiceRequest,
) (*mantraev1.UpdateServiceResponse, error) {
params := db.UpdateUdpServiceParams{
ID: req.Id,
Name: req.Name,
Enabled: req.Enabled,
}
var err error
params.Config, err = db.UnmarshalStruct[schema.UDPService](req.Config)
if err != nil {
return nil, err
}
result, err := s.app.Conn.GetQuery().UpdateUdpService(ctx, params)
if err != nil {
return nil, err
}
return &mantraev1.UpdateServiceResponse{
Service: result.ToProto(),
}, nil
}
func (s *UDPServiceOps) Delete(
ctx context.Context,
req *mantraev1.DeleteServiceRequest,
) (*mantraev1.DeleteServiceResponse, error) {
if err := s.app.Conn.GetQuery().DeleteUdpService(ctx, req.Id); err != nil {
return nil, err
}
return &mantraev1.DeleteServiceResponse{}, nil
}
func (s *UDPServiceOps) List(
ctx context.Context,
req *mantraev1.ListServicesRequest,
) (*mantraev1.ListServicesResponse, error) {
result, err := s.app.Conn.GetQuery().
ListUdpServices(ctx, db.ListUdpServicesParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
Limit: req.Limit,
Offset: req.Offset,
})
if err != nil {
return nil, err
}
totalCount, err := s.app.Conn.GetQuery().CountUdpServices(ctx, db.CountUdpServicesParams{
ProfileID: req.ProfileId,
AgentID: req.AgentId,
})
if err != nil {
return nil, err
}
services := make([]*mantraev1.Service, 0, len(result))
for _, s := range result {
services = append(services, s.ToProto())
}
return &mantraev1.ListServicesResponse{
Services: services,
TotalCount: totalCount,
}, nil
}

View File

@@ -27,7 +27,6 @@ func (s *SettingService) GetSetting(
if !ok {
return nil, connect.NewError(connect.CodeInternal, errors.New("setting not found"))
}
return connect.NewResponse(&mantraev1.GetSettingResponse{Value: value}), nil
}

View File

@@ -7,12 +7,10 @@ import (
"time"
"connectrpc.com/connect"
"golang.org/x/crypto/bcrypt"
"github.com/google/uuid"
"github.com/mizuchilabs/mantrae/internal/api/middlewares"
"github.com/mizuchilabs/mantrae/internal/config"
"github.com/mizuchilabs/mantrae/internal/convert"
"github.com/mizuchilabs/mantrae/internal/mail"
"github.com/mizuchilabs/mantrae/internal/settings"
"github.com/mizuchilabs/mantrae/internal/store/db"
@@ -47,8 +45,8 @@ func (s *UserService) LoginUser(
return nil, connect.NewError(connect.CodeInternal, err)
}
if err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Msg.Password)); err != nil {
return nil, connect.NewError(connect.CodeUnauthenticated, err)
if ok := util.VerifyPassword(req.Msg.Password, user.Password); !ok {
return nil, connect.NewError(connect.CodeUnauthenticated, errors.New("invalid password"))
}
expirationTime := time.Now().Add(24 * time.Hour)
@@ -70,7 +68,7 @@ func (s *UserService) LoginUser(
Secure: req.Header().Get("X-Forwarded-Proto") == "https",
SameSite: http.SameSiteLaxMode,
}
res := connect.NewResponse(&mantraev1.LoginUserResponse{User: convert.UserToProto(&user)})
res := connect.NewResponse(&mantraev1.LoginUserResponse{User: user.ToProto()})
res.Header().Set("Set-Cookie", cookie.String())
return res, nil
}
@@ -151,7 +149,7 @@ func (s *UserService) VerifyOTP(
Secure: req.Header().Get("X-Forwarded-Proto") == "https",
SameSite: http.SameSiteLaxMode,
}
res := connect.NewResponse(&mantraev1.VerifyOTPResponse{User: convert.UserToProto(&user)})
res := connect.NewResponse(&mantraev1.VerifyOTPResponse{User: user.ToProto()})
res.Header().Set("Set-Cookie", cookie.String())
return res, nil
}
@@ -226,7 +224,7 @@ func (s *UserService) GetUser(
}
return connect.NewResponse(&mantraev1.GetUserResponse{
User: convert.UserToProto(&user),
User: user.ToProto(),
}), nil
}
@@ -234,30 +232,24 @@ func (s *UserService) CreateUser(
ctx context.Context,
req *connect.Request[mantraev1.CreateUserRequest],
) (*connect.Response[mantraev1.CreateUserResponse], error) {
id, err := uuid.NewV7()
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
params := db.CreateUserParams{
ID: uuid.NewString(),
Username: req.Msg.Username,
Email: req.Msg.Email,
}
params := db.CreateUserParams{
ID: id.String(),
Username: req.Msg.Username,
}
if req.Msg.Email != "" {
params.Email = &req.Msg.Email
}
hash, err := util.HashPassword(req.Msg.Password)
var err error
params.Password, err = util.HashPassword(req.Msg.Password)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
params.Password = hash
result, err := s.app.Conn.GetQuery().CreateUser(ctx, params)
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.CreateUserResponse{
User: convert.UserToProto(&result),
User: result.ToProto(),
}), nil
}
@@ -268,9 +260,7 @@ func (s *UserService) UpdateUser(
params := db.UpdateUserParams{
ID: req.Msg.Id,
Username: req.Msg.Username,
}
if req.Msg.Email != "" {
params.Email = &req.Msg.Email
Email: req.Msg.Email,
}
user, err := s.app.Conn.GetQuery().UpdateUser(ctx, params)
if err != nil {
@@ -293,7 +283,7 @@ func (s *UserService) UpdateUser(
}
return connect.NewResponse(&mantraev1.UpdateUserResponse{
User: convert.UserToProto(&user),
User: user.ToProto(),
}), nil
}
@@ -311,16 +301,9 @@ func (s *UserService) ListUsers(
ctx context.Context,
req *connect.Request[mantraev1.ListUsersRequest],
) (*connect.Response[mantraev1.ListUsersResponse], error) {
var params db.ListUsersParams
if req.Msg.Limit == nil {
params.Limit = 100
} else {
params.Limit = *req.Msg.Limit
}
if req.Msg.Offset == nil {
params.Offset = 0
} else {
params.Offset = *req.Msg.Offset
params := db.ListUsersParams{
Limit: req.Msg.Limit,
Offset: req.Msg.Offset,
}
result, err := s.app.Conn.GetQuery().ListUsers(ctx, params)
@@ -332,8 +315,12 @@ func (s *UserService) ListUsers(
return nil, connect.NewError(connect.CodeInternal, err)
}
users := make([]*mantraev1.User, 0, len(result))
for _, u := range result {
users = append(users, u.ToProto())
}
return connect.NewResponse(&mantraev1.ListUsersResponse{
Users: convert.UsersToProto(result),
Users: users,
TotalCount: totalCount,
}), nil
}

View File

@@ -36,7 +36,6 @@ func (s *UtilService) GetPublicIP(
if err != nil {
return nil, connect.NewError(connect.CodeInternal, err)
}
return connect.NewResponse(&mantraev1.GetPublicIPResponse{
Ipv4: ips.IPv4,
Ipv6: ips.IPv6,

View File

@@ -1,5 +1,7 @@
// Package config provides functions for parsing command-line f and
// setting up the application's default settings.
//go:build !dev
// +build !dev
// Package config various app setup and configuration functions.
package config
import (
@@ -7,7 +9,6 @@ import (
"fmt"
"os"
"github.com/mizuchilabs/mantrae/internal/store"
"github.com/mizuchilabs/mantrae/pkg/build"
)
@@ -22,8 +23,6 @@ func ParseFlags() {
f := &Flags{}
flag.BoolVar(&f.Version, "version", false, "Print version and exit")
flag.BoolVar(&f.Update, "update", false, "Update the application")
// flag.BoolVar(&f.Squash, "squash", false, "Squash the database (only for dev)")
// flag.BoolVar(&f.Zod, "zod", false, "Generate zod schemas (only for dev)")
flag.Parse()
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
@@ -33,14 +32,5 @@ func ParseFlags() {
os.Exit(0)
}
if f.Squash {
store.Squash()
os.Exit(1)
}
if f.Zod {
StructToZodSchema()
os.Exit(1)
}
build.Update(f.Update)
}

View File

@@ -0,0 +1,47 @@
//go:build dev
// +build dev
package config
import (
"flag"
"fmt"
"os"
"github.com/mizuchilabs/mantrae/internal/store"
"github.com/mizuchilabs/mantrae/pkg/build"
)
type Flags struct {
Version bool
Update bool
Squash bool
Zod bool
}
func ParseFlags() {
f := &Flags{}
flag.BoolVar(&f.Version, "version", false, "Print version and exit")
flag.BoolVar(&f.Update, "update", false, "Update the application")
flag.BoolVar(&f.Squash, "squash", false, "Squash the database (only for dev)")
flag.BoolVar(&f.Zod, "zod", false, "Generate zod schemas (only for dev)")
flag.Parse()
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
if f.Version {
fmt.Println(build.Version)
os.Exit(0)
}
if f.Squash {
store.Squash()
os.Exit(1)
}
if f.Zod {
StructToZodSchema()
os.Exit(1)
}
build.Update(f.Update)
}

View File

@@ -11,7 +11,6 @@ import (
"github.com/caarlos0/env/v11"
"github.com/google/uuid"
"github.com/mizuchilabs/mantrae/internal/backup"
"github.com/mizuchilabs/mantrae/internal/events"
"github.com/mizuchilabs/mantrae/internal/settings"
"github.com/mizuchilabs/mantrae/internal/store"
"github.com/mizuchilabs/mantrae/internal/store/db"
@@ -22,7 +21,6 @@ import (
type App struct {
Secret string `env:"SECRET"`
Conn *store.Connection
Event *events.EventBroadcaster
BM *backup.BackupManager
SM *settings.SettingsManager
}
@@ -61,7 +59,7 @@ func (a *App) setupDefaultData(ctx context.Context) error {
q := a.Conn.GetQuery()
// Ensure at least one user exists
users, err := q.ListUsers(ctx, db.ListUsersParams{Limit: 1, Offset: 0})
users, err := q.ListUsers(ctx, db.ListUsersParams{})
if err != nil {
return fmt.Errorf("failed to list admin users: %w", err)
}
@@ -100,7 +98,7 @@ func (a *App) setupDefaultData(ctx context.Context) error {
}
// Ensure default profile exists
profiles, err := q.ListProfiles(ctx, db.ListProfilesParams{Limit: 1, Offset: 0})
profiles, err := q.ListProfiles(ctx, db.ListProfilesParams{})
if err != nil {
return fmt.Errorf("failed to list profiles: %w", err)
}

View File

@@ -75,10 +75,7 @@ func (a *App) cleanupAgents(ctx context.Context) {
}
// List profiles
profiles, err := a.Conn.GetQuery().ListProfiles(ctx, db.ListProfilesParams{
Limit: -1,
Offset: 0,
})
profiles, err := a.Conn.GetQuery().ListProfiles(ctx, db.ListProfilesParams{})
if err != nil {
slog.Error("failed to list profiles", "error", err)
continue
@@ -86,11 +83,8 @@ func (a *App) cleanupAgents(ctx context.Context) {
var agents []db.Agent
for _, profile := range profiles {
a, err := a.Conn.GetQuery().ListAgents(ctx, db.ListAgentsParams{
ProfileID: profile.ID,
Limit: -1,
Offset: 0,
})
a, err := a.Conn.GetQuery().
ListAgents(ctx, db.ListAgentsParams{ProfileID: profile.ID})
if err != nil {
slog.Error("failed to list agents", "error", err)
continue

View File

@@ -1,3 +1,6 @@
//go:build dev
// +build dev
package config
import (

View File

@@ -1,44 +0,0 @@
package convert
import (
"github.com/mizuchilabs/mantrae/internal/store/db"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
func AgentToProto(a *db.Agent) *mantraev1.Agent {
var containers []*mantraev1.Container
if a.Containers != nil {
for _, c := range *a.Containers {
containers = append(containers, &mantraev1.Container{
Id: c.ID,
Name: c.Name,
Labels: c.Labels,
Image: c.Image,
Portmap: c.Portmap,
Status: c.Status,
Created: SafeTimestamp(c.Created),
})
}
}
return &mantraev1.Agent{
Id: a.ID,
ProfileId: a.ProfileID,
Hostname: SafeString(a.Hostname),
PublicIp: SafeString(a.PublicIp),
PrivateIp: SafeString(a.PrivateIp),
ActiveIp: SafeString(a.ActiveIp),
Token: a.Token,
Containers: containers,
CreatedAt: SafeTimestamp(a.CreatedAt),
UpdatedAt: SafeTimestamp(a.UpdatedAt),
}
}
func AgentsToProto(agents []db.Agent) []*mantraev1.Agent {
var agentsProto []*mantraev1.Agent
for _, a := range agents {
agentsProto = append(agentsProto, AgentToProto(&a))
}
return agentsProto
}

View File

@@ -1,25 +0,0 @@
package convert
import (
"github.com/mizuchilabs/mantrae/internal/store/db"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
func AuditLogsToProto(logs []db.ListAuditLogsRow) []*mantraev1.AuditLog {
var auditLogs []*mantraev1.AuditLog
for _, l := range logs {
auditLogs = append(auditLogs, &mantraev1.AuditLog{
Id: l.ID,
ProfileId: SafeInt64(l.ProfileID),
ProfileName: SafeString(l.ProfileName),
UserId: SafeString(l.UserID),
UserName: SafeString(l.UserName),
AgentId: SafeString(l.AgentID),
AgentName: SafeString(l.AgentName),
Event: l.Event,
Details: SafeString(l.Details),
CreatedAt: SafeTimestamp(l.CreatedAt),
})
}
return auditLogs
}

View File

@@ -1,75 +0,0 @@
// Convert package contains functions to convert between db and proto types
package convert
import (
"encoding/json"
"time"
"google.golang.org/protobuf/types/known/structpb"
"google.golang.org/protobuf/types/known/timestamppb"
)
func SafeString(s *string) string {
if s == nil {
return ""
}
return *s
}
func SafeInt32(i *int32) int32 {
if i == nil {
return 0
}
return *i
}
func SafeInt64(i *int64) int64 {
if i == nil {
return 0
}
return *i
}
func SafeFloat(f *float64) float64 {
if f == nil {
return 0.0
}
return *f
}
func SafeTimestamp(t *time.Time) *timestamppb.Timestamp {
if t == nil {
return nil
}
return timestamppb.New(*t)
}
func UnmarshalStruct[T any](s *structpb.Struct) (*T, error) {
// Marshal the proto Struct to JSON bytes
data, err := s.MarshalJSON()
if err != nil {
return nil, err
}
// Unmarshal into your target struct
var out T
if err := json.Unmarshal(data, &out); err != nil {
return nil, err
}
return &out, nil
}
func MarshalStruct[T any](s *T) (*structpb.Struct, error) {
// Marshal the target struct to JSON bytes
data, err := json.Marshal(s)
if err != nil {
return nil, err
}
// Unmarshal into your proto Struct
var out structpb.Struct
if err := out.UnmarshalJSON(data); err != nil {
return nil, err
}
return &out, nil
}

View File

@@ -1,45 +0,0 @@
package convert
import (
"github.com/mizuchilabs/mantrae/internal/store/db"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
func DNSProviderToProto(p *db.DnsProvider) *mantraev1.DnsProvider {
var dnsType mantraev1.DnsProviderType
switch p.Type {
case "cloudflare":
dnsType = mantraev1.DnsProviderType_DNS_PROVIDER_TYPE_CLOUDFLARE
case "powerdns":
dnsType = mantraev1.DnsProviderType_DNS_PROVIDER_TYPE_POWERDNS
case "technitium":
dnsType = mantraev1.DnsProviderType_DNS_PROVIDER_TYPE_TECHNITIUM
default:
return nil
}
return &mantraev1.DnsProvider{
Id: p.ID,
Name: p.Name,
Type: dnsType,
Config: &mantraev1.DnsProviderConfig{
ApiKey: p.Config.APIKey,
ApiUrl: p.Config.APIUrl,
Ip: p.Config.IP,
Proxied: p.Config.Proxied,
AutoUpdate: p.Config.AutoUpdate,
ZoneType: p.Config.ZoneType,
},
IsDefault: p.IsDefault,
CreatedAt: SafeTimestamp(p.CreatedAt),
UpdatedAt: SafeTimestamp(p.UpdatedAt),
}
}
func DNSProvidersToProto(providers []db.DnsProvider) []*mantraev1.DnsProvider {
var dnsProviders []*mantraev1.DnsProvider
for _, p := range providers {
dnsProviders = append(dnsProviders, DNSProviderToProto(&p))
}
return dnsProviders
}

View File

@@ -1,104 +0,0 @@
package convert
import (
"context"
"log/slog"
"github.com/mizuchilabs/mantrae/internal/store/db"
"github.com/mizuchilabs/mantrae/internal/store/schema"
"github.com/traefik/traefik/v3/pkg/config/dynamic"
)
// DynamicToDB saves a Traefik dynamic configuration to the database
func DynamicToDB(
ctx context.Context,
q db.Queries,
profileID int64,
dynamic *dynamic.Configuration,
) error {
for k, v := range dynamic.HTTP.Routers {
if _, err := q.CreateHttpRouter(ctx, db.CreateHttpRouterParams{
ProfileID: profileID,
Name: k,
Config: schema.WrapRouter(v),
}); err != nil {
slog.Error("failed to create http router", "err", err)
continue
}
}
for k, v := range dynamic.TCP.Routers {
if _, err := q.CreateTcpRouter(ctx, db.CreateTcpRouterParams{
ProfileID: profileID,
Name: k,
Config: schema.WrapTCPRouter(v),
}); err != nil {
slog.Error("failed to create tcp router", "err", err)
continue
}
}
for k, v := range dynamic.UDP.Routers {
if _, err := q.CreateUdpRouter(ctx, db.CreateUdpRouterParams{
ProfileID: profileID,
Name: k,
Config: schema.WrapUDPRouter(v),
}); err != nil {
slog.Error("failed to create udp router", "err", err)
continue
}
}
// Services
for k, v := range dynamic.HTTP.Services {
if _, err := q.CreateHttpService(ctx, db.CreateHttpServiceParams{
ProfileID: profileID,
Name: k,
Config: schema.WrapService(v),
}); err != nil {
slog.Error("failed to create http service", "err", err)
continue
}
}
for k, v := range dynamic.TCP.Services {
if _, err := q.CreateTcpService(ctx, db.CreateTcpServiceParams{
ProfileID: profileID,
Name: k,
Config: schema.WrapTCPService(v),
}); err != nil {
slog.Error("failed to create tcp service", "err", err)
continue
}
}
for k, v := range dynamic.UDP.Services {
if _, err := q.CreateUdpService(ctx, db.CreateUdpServiceParams{
ProfileID: profileID,
Name: k,
Config: schema.WrapUDPService(v),
}); err != nil {
slog.Error("failed to create udp service", "err", err)
continue
}
}
// Middlewares
for k, v := range dynamic.HTTP.Middlewares {
if _, err := q.CreateHttpMiddleware(ctx, db.CreateHttpMiddlewareParams{
ProfileID: profileID,
Name: k,
Config: schema.WrapMiddleware(v),
}); err != nil {
slog.Error("failed to create http middleware", "err", err)
continue
}
}
for k, v := range dynamic.TCP.Middlewares {
if _, err := q.CreateTcpMiddleware(ctx, db.CreateTcpMiddlewareParams{
ProfileID: profileID,
Name: k,
Config: schema.WrapTCPMiddleware(v),
}); err != nil {
slog.Error("failed to create tcp middleware", "err", err)
continue
}
}
return nil
}

View File

@@ -1,26 +0,0 @@
package convert
import (
"github.com/mizuchilabs/mantrae/internal/store/db"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
func EntryPointToProto(e *db.EntryPoint) *mantraev1.EntryPoint {
return &mantraev1.EntryPoint{
Id: e.ID,
ProfileId: e.ProfileID,
Name: e.Name,
Address: e.Address,
IsDefault: e.IsDefault,
CreatedAt: SafeTimestamp(e.CreatedAt),
UpdatedAt: SafeTimestamp(e.UpdatedAt),
}
}
func EntryPointsToProto(entryPoints []db.EntryPoint) []*mantraev1.EntryPoint {
var entryPointsProto []*mantraev1.EntryPoint
for _, e := range entryPoints {
entryPointsProto = append(entryPointsProto, EntryPointToProto(&e))
}
return entryPointsProto
}

View File

@@ -1,156 +0,0 @@
package convert
import (
"github.com/mizuchilabs/mantrae/internal/store/db"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
func HTTPMiddlewareToProto(m *db.HttpMiddleware) *mantraev1.Middleware {
config, err := MarshalStruct(m.Config)
if err != nil {
return nil
}
return &mantraev1.Middleware{
Id: m.ID,
ProfileId: m.ProfileID,
AgentId: SafeString(m.AgentID),
Name: m.Name,
Config: config,
Type: mantraev1.MiddlewareType_MIDDLEWARE_TYPE_HTTP,
Enabled: m.Enabled,
IsDefault: m.IsDefault,
CreatedAt: SafeTimestamp(m.CreatedAt),
UpdatedAt: SafeTimestamp(m.UpdatedAt),
}
}
func TCPMiddlewareToProto(m *db.TcpMiddleware) *mantraev1.Middleware {
config, err := MarshalStruct(m.Config)
if err != nil {
return nil
}
return &mantraev1.Middleware{
Id: m.ID,
ProfileId: m.ProfileID,
AgentId: SafeString(m.AgentID),
Name: m.Name,
Config: config,
Type: mantraev1.MiddlewareType_MIDDLEWARE_TYPE_TCP,
Enabled: m.Enabled,
IsDefault: m.IsDefault,
CreatedAt: SafeTimestamp(m.CreatedAt),
UpdatedAt: SafeTimestamp(m.UpdatedAt),
}
}
func HTTPMiddlewaresToProto(middlewares []db.HttpMiddleware) []*mantraev1.Middleware {
var middlewaresProto []*mantraev1.Middleware
for _, m := range middlewares {
middlewaresProto = append(middlewaresProto, HTTPMiddlewareToProto(&m))
}
return middlewaresProto
}
func TCPMiddlewaresToProto(middlewares []db.TcpMiddleware) []*mantraev1.Middleware {
var middlewaresProto []*mantraev1.Middleware
for _, m := range middlewares {
middlewaresProto = append(middlewaresProto, TCPMiddlewareToProto(&m))
}
return middlewaresProto
}
// Specialized batch conversion functions
func MiddlewaresByProfileToProto(
middlewares []db.ListMiddlewaresByProfileRow,
) []*mantraev1.Middleware {
var middlewaresProto []*mantraev1.Middleware
for _, m := range middlewares {
switch m.Type {
case "http":
config, err := MarshalStruct(m.Config)
if err != nil {
return nil
}
middlewaresProto = append(middlewaresProto, &mantraev1.Middleware{
Id: m.ID,
ProfileId: m.ProfileID,
AgentId: SafeString(m.AgentID),
Name: m.Name,
Config: config,
Type: mantraev1.MiddlewareType_MIDDLEWARE_TYPE_HTTP,
Enabled: m.Enabled,
IsDefault: m.IsDefault,
CreatedAt: SafeTimestamp(m.CreatedAt),
UpdatedAt: SafeTimestamp(m.UpdatedAt),
})
case "tcp":
config, err := MarshalStruct(m.Config)
if err != nil {
return nil
}
middlewaresProto = append(middlewaresProto, &mantraev1.Middleware{
Id: m.ID,
ProfileId: m.ProfileID,
AgentId: SafeString(m.AgentID),
Name: m.Name,
Config: config,
Type: mantraev1.MiddlewareType_MIDDLEWARE_TYPE_TCP,
Enabled: m.Enabled,
IsDefault: m.IsDefault,
CreatedAt: SafeTimestamp(m.CreatedAt),
UpdatedAt: SafeTimestamp(m.UpdatedAt),
})
default:
return nil
}
}
return middlewaresProto
}
func MiddlewaresByAgentToProto(middlewares []db.ListMiddlewaresByAgentRow) []*mantraev1.Middleware {
var middlewaresProto []*mantraev1.Middleware
for _, m := range middlewares {
switch m.Type {
case "http":
config, err := MarshalStruct(m.Config)
if err != nil {
return nil
}
middlewaresProto = append(middlewaresProto, &mantraev1.Middleware{
Id: m.ID,
ProfileId: m.ProfileID,
AgentId: SafeString(m.AgentID),
Name: m.Name,
Config: config,
Type: mantraev1.MiddlewareType_MIDDLEWARE_TYPE_HTTP,
Enabled: m.Enabled,
IsDefault: m.IsDefault,
CreatedAt: SafeTimestamp(m.CreatedAt),
UpdatedAt: SafeTimestamp(m.UpdatedAt),
})
case "tcp":
config, err := MarshalStruct(m.Config)
if err != nil {
return nil
}
middlewaresProto = append(middlewaresProto, &mantraev1.Middleware{
Id: m.ID,
ProfileId: m.ProfileID,
AgentId: SafeString(m.AgentID),
Name: m.Name,
Config: config,
Type: mantraev1.MiddlewareType_MIDDLEWARE_TYPE_TCP,
Enabled: m.Enabled,
IsDefault: m.IsDefault,
CreatedAt: SafeTimestamp(m.CreatedAt),
UpdatedAt: SafeTimestamp(m.UpdatedAt),
})
default:
return nil
}
}
return middlewaresProto
}

View File

@@ -1,25 +0,0 @@
package convert
import (
"github.com/mizuchilabs/mantrae/internal/store/db"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
func ProfileToProto(p *db.Profile) *mantraev1.Profile {
return &mantraev1.Profile{
Id: p.ID,
Name: p.Name,
Description: SafeString(p.Description),
Token: p.Token,
CreatedAt: SafeTimestamp(p.CreatedAt),
UpdatedAt: SafeTimestamp(p.UpdatedAt),
}
}
func ProfilesToProto(profiles []db.Profile) []*mantraev1.Profile {
var profilesProto []*mantraev1.Profile
for _, p := range profiles {
profilesProto = append(profilesProto, ProfileToProto(&p))
}
return profilesProto
}

View File

@@ -1,227 +0,0 @@
package convert
import (
"context"
"github.com/mizuchilabs/mantrae/internal/store/db"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
func HTTPRouterToProto(r *db.HttpRouter, d []*mantraev1.DnsProvider) *mantraev1.Router {
config, err := MarshalStruct(r.Config)
if err != nil {
return nil
}
return &mantraev1.Router{
Id: r.ID,
ProfileId: r.ProfileID,
AgentId: SafeString(r.AgentID),
Name: r.Name,
Config: config,
Enabled: r.Enabled,
Type: mantraev1.RouterType_ROUTER_TYPE_HTTP,
DnsProviders: d,
CreatedAt: SafeTimestamp(r.CreatedAt),
UpdatedAt: SafeTimestamp(r.UpdatedAt),
}
}
func TCPRouterToProto(r *db.TcpRouter, d []*mantraev1.DnsProvider) *mantraev1.Router {
config, err := MarshalStruct(r.Config)
if err != nil {
return nil
}
return &mantraev1.Router{
Id: r.ID,
ProfileId: r.ProfileID,
AgentId: SafeString(r.AgentID),
Name: r.Name,
Config: config,
Enabled: r.Enabled,
Type: mantraev1.RouterType_ROUTER_TYPE_TCP,
DnsProviders: d,
CreatedAt: SafeTimestamp(r.CreatedAt),
UpdatedAt: SafeTimestamp(r.UpdatedAt),
}
}
func UDPRouterToProto(r *db.UdpRouter) *mantraev1.Router {
config, err := MarshalStruct(r.Config)
if err != nil {
return nil
}
return &mantraev1.Router{
Id: r.ID,
ProfileId: r.ProfileID,
AgentId: SafeString(r.AgentID),
Name: r.Name,
Config: config,
Enabled: r.Enabled,
Type: mantraev1.RouterType_ROUTER_TYPE_UDP,
CreatedAt: SafeTimestamp(r.CreatedAt),
UpdatedAt: SafeTimestamp(r.UpdatedAt),
}
}
func HTTPRoutersToProto(routers []db.HttpRouter, q *db.Queries) []*mantraev1.Router {
var routersProto []*mantraev1.Router
for _, r := range routers {
result, _ := q.GetDnsProvidersByHttpRouter(context.Background(), r.ID)
routersProto = append(routersProto, HTTPRouterToProto(&r, DNSProvidersToProto(result)))
}
return routersProto
}
func TCPRoutersToProto(routers []db.TcpRouter, q *db.Queries) []*mantraev1.Router {
var routersProto []*mantraev1.Router
for _, r := range routers {
result, _ := q.GetDnsProvidersByTcpRouter(context.Background(), r.ID)
routersProto = append(routersProto, TCPRouterToProto(&r, DNSProvidersToProto(result)))
}
return routersProto
}
func UDPRoutersToProto(routers []db.UdpRouter) []*mantraev1.Router {
var routersProto []*mantraev1.Router
for _, r := range routers {
routersProto = append(routersProto, UDPRouterToProto(&r))
}
return routersProto
}
// Specialized batch conversion functions
func RoutersByProfileToProto(
routers []db.ListRoutersByProfileRow,
q *db.Queries,
) []*mantraev1.Router {
var routersProto []*mantraev1.Router
for _, r := range routers {
switch r.Type {
case "http":
config, err := MarshalStruct(r.Config)
if err != nil {
return nil
}
result, _ := q.GetDnsProvidersByHttpRouter(context.Background(), r.ID)
routersProto = append(routersProto, &mantraev1.Router{
Id: r.ID,
ProfileId: r.ProfileID,
AgentId: SafeString(r.AgentID),
Name: r.Name,
Config: config,
Enabled: r.Enabled,
Type: mantraev1.RouterType_ROUTER_TYPE_HTTP,
DnsProviders: DNSProvidersToProto(result),
CreatedAt: SafeTimestamp(r.CreatedAt),
UpdatedAt: SafeTimestamp(r.UpdatedAt),
})
case "tcp":
config, err := MarshalStruct(r.Config)
if err != nil {
return nil
}
result, _ := q.GetDnsProvidersByTcpRouter(context.Background(), r.ID)
routersProto = append(routersProto, &mantraev1.Router{
Id: r.ID,
ProfileId: r.ProfileID,
AgentId: SafeString(r.AgentID),
Name: r.Name,
Config: config,
Enabled: r.Enabled,
Type: mantraev1.RouterType_ROUTER_TYPE_TCP,
DnsProviders: DNSProvidersToProto(result),
CreatedAt: SafeTimestamp(r.CreatedAt),
UpdatedAt: SafeTimestamp(r.UpdatedAt),
})
case "udp":
config, err := MarshalStruct(r.Config)
if err != nil {
return nil
}
routersProto = append(routersProto, &mantraev1.Router{
Id: r.ID,
ProfileId: r.ProfileID,
AgentId: SafeString(r.AgentID),
Name: r.Name,
Config: config,
Enabled: r.Enabled,
Type: mantraev1.RouterType_ROUTER_TYPE_UDP,
CreatedAt: SafeTimestamp(r.CreatedAt),
UpdatedAt: SafeTimestamp(r.UpdatedAt),
})
default:
return nil
}
}
return routersProto
}
func RoutersByAgentToProto(routers []db.ListRoutersByAgentRow, q *db.Queries) []*mantraev1.Router {
var routersProto []*mantraev1.Router
for _, r := range routers {
switch r.Type {
case "http":
config, err := MarshalStruct(r.Config)
if err != nil {
return nil
}
result, _ := q.GetDnsProvidersByHttpRouter(context.Background(), r.ID)
routersProto = append(routersProto, &mantraev1.Router{
Id: r.ID,
ProfileId: r.ProfileID,
AgentId: SafeString(r.AgentID),
Name: r.Name,
Config: config,
Enabled: r.Enabled,
Type: mantraev1.RouterType_ROUTER_TYPE_HTTP,
DnsProviders: DNSProvidersToProto(result),
CreatedAt: SafeTimestamp(r.CreatedAt),
UpdatedAt: SafeTimestamp(r.UpdatedAt),
})
case "tcp":
config, err := MarshalStruct(r.Config)
if err != nil {
return nil
}
result, _ := q.GetDnsProvidersByTcpRouter(context.Background(), r.ID)
routersProto = append(routersProto, &mantraev1.Router{
Id: r.ID,
ProfileId: r.ProfileID,
AgentId: SafeString(r.AgentID),
Name: r.Name,
Config: config,
Enabled: r.Enabled,
Type: mantraev1.RouterType_ROUTER_TYPE_TCP,
DnsProviders: DNSProvidersToProto(result),
CreatedAt: SafeTimestamp(r.CreatedAt),
UpdatedAt: SafeTimestamp(r.UpdatedAt),
})
case "udp":
config, err := MarshalStruct(r.Config)
if err != nil {
return nil
}
routersProto = append(routersProto, &mantraev1.Router{
Id: r.ID,
ProfileId: r.ProfileID,
AgentId: SafeString(r.AgentID),
Name: r.Name,
Config: config,
Enabled: r.Enabled,
Type: mantraev1.RouterType_ROUTER_TYPE_UDP,
CreatedAt: SafeTimestamp(r.CreatedAt),
UpdatedAt: SafeTimestamp(r.UpdatedAt),
})
default:
return nil
}
}
return routersProto
}

View File

@@ -1,156 +0,0 @@
package convert
import (
"github.com/mizuchilabs/mantrae/internal/store/db"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
func HTTPServersTransportToProto(in *db.HttpServersTransport) *mantraev1.ServersTransport {
config, err := MarshalStruct(in.Config)
if err != nil {
return nil
}
return &mantraev1.ServersTransport{
Id: in.ID,
ProfileId: in.ProfileID,
AgentId: SafeString(in.AgentID),
Name: in.Name,
Config: config,
Enabled: in.Enabled,
Type: mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_HTTP,
CreatedAt: SafeTimestamp(in.CreatedAt),
UpdatedAt: SafeTimestamp(in.UpdatedAt),
}
}
func TCPServersTransportToProto(in *db.TcpServersTransport) *mantraev1.ServersTransport {
config, err := MarshalStruct(in.Config)
if err != nil {
return nil
}
return &mantraev1.ServersTransport{
Id: in.ID,
ProfileId: in.ProfileID,
AgentId: SafeString(in.AgentID),
Name: in.Name,
Config: config,
Enabled: in.Enabled,
Type: mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_TCP,
CreatedAt: SafeTimestamp(in.CreatedAt),
UpdatedAt: SafeTimestamp(in.UpdatedAt),
}
}
func HTTPServersTransportsToProto(in []db.HttpServersTransport) []*mantraev1.ServersTransport {
var out []*mantraev1.ServersTransport
for _, s := range in {
out = append(out, HTTPServersTransportToProto(&s))
}
return out
}
func TCPServersTransportsToProto(in []db.TcpServersTransport) []*mantraev1.ServersTransport {
var out []*mantraev1.ServersTransport
for _, s := range in {
out = append(out, TCPServersTransportToProto(&s))
}
return out
}
func ServersTransportsByProfileToProto(
in []db.ListServersTransportsByProfileRow,
q *db.Queries,
) []*mantraev1.ServersTransport {
var out []*mantraev1.ServersTransport
for _, s := range in {
switch s.Type {
case "http":
config, err := MarshalStruct(s.Config)
if err != nil {
return nil
}
out = append(out, &mantraev1.ServersTransport{
Id: s.ID,
ProfileId: s.ProfileID,
AgentId: SafeString(s.AgentID),
Name: s.Name,
Config: config,
Enabled: s.Enabled,
Type: mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_HTTP,
CreatedAt: SafeTimestamp(s.CreatedAt),
UpdatedAt: SafeTimestamp(s.UpdatedAt),
})
case "tcp":
config, err := MarshalStruct(s.Config)
if err != nil {
return nil
}
out = append(out, &mantraev1.ServersTransport{
Id: s.ID,
ProfileId: s.ProfileID,
AgentId: SafeString(s.AgentID),
Name: s.Name,
Config: config,
Enabled: s.Enabled,
Type: mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_TCP,
CreatedAt: SafeTimestamp(s.CreatedAt),
UpdatedAt: SafeTimestamp(s.UpdatedAt),
})
default:
return nil
}
}
return out
}
func ServersTransportsByAgentToProto(
in []db.ListServersTransportsByAgentRow,
q *db.Queries,
) []*mantraev1.ServersTransport {
var out []*mantraev1.ServersTransport
for _, s := range in {
switch s.Type {
case "http":
config, err := MarshalStruct(s.Config)
if err != nil {
return nil
}
out = append(out, &mantraev1.ServersTransport{
Id: s.ID,
ProfileId: s.ProfileID,
AgentId: SafeString(s.AgentID),
Name: s.Name,
Config: config,
Enabled: s.Enabled,
Type: mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_HTTP,
CreatedAt: SafeTimestamp(s.CreatedAt),
UpdatedAt: SafeTimestamp(s.UpdatedAt),
})
case "tcp":
config, err := MarshalStruct(s.Config)
if err != nil {
return nil
}
out = append(out, &mantraev1.ServersTransport{
Id: s.ID,
ProfileId: s.ProfileID,
AgentId: SafeString(s.AgentID),
Name: s.Name,
Config: config,
Enabled: s.Enabled,
Type: mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_TCP,
CreatedAt: SafeTimestamp(s.CreatedAt),
UpdatedAt: SafeTimestamp(s.UpdatedAt),
})
default:
return nil
}
}
return out
}

View File

@@ -1,206 +0,0 @@
package convert
import (
"github.com/mizuchilabs/mantrae/internal/store/db"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
func HTTPServiceToProto(s *db.HttpService) *mantraev1.Service {
config, err := MarshalStruct(s.Config)
if err != nil {
return nil
}
return &mantraev1.Service{
Id: s.ID,
ProfileId: s.ProfileID,
AgentId: SafeString(s.AgentID),
Name: s.Name,
Config: config,
Enabled: s.Enabled,
Type: mantraev1.ServiceType_SERVICE_TYPE_HTTP,
CreatedAt: SafeTimestamp(s.CreatedAt),
UpdatedAt: SafeTimestamp(s.UpdatedAt),
}
}
func TCPServiceToProto(s *db.TcpService) *mantraev1.Service {
config, err := MarshalStruct(s.Config)
if err != nil {
return nil
}
return &mantraev1.Service{
Id: s.ID,
ProfileId: s.ProfileID,
AgentId: SafeString(s.AgentID),
Name: s.Name,
Config: config,
Enabled: s.Enabled,
Type: mantraev1.ServiceType_SERVICE_TYPE_TCP,
CreatedAt: SafeTimestamp(s.CreatedAt),
UpdatedAt: SafeTimestamp(s.UpdatedAt),
}
}
func UDPServiceToProto(s *db.UdpService) *mantraev1.Service {
config, err := MarshalStruct(s.Config)
if err != nil {
return nil
}
return &mantraev1.Service{
Id: s.ID,
ProfileId: s.ProfileID,
AgentId: SafeString(s.AgentID),
Name: s.Name,
Config: config,
Enabled: s.Enabled,
Type: mantraev1.ServiceType_SERVICE_TYPE_UDP,
CreatedAt: SafeTimestamp(s.CreatedAt),
UpdatedAt: SafeTimestamp(s.UpdatedAt),
}
}
func HTTPServicesToProto(services []db.HttpService) []*mantraev1.Service {
var servicesProto []*mantraev1.Service
for _, s := range services {
servicesProto = append(servicesProto, HTTPServiceToProto(&s))
}
return servicesProto
}
func TCPServicesToProto(services []db.TcpService) []*mantraev1.Service {
var servicesProto []*mantraev1.Service
for _, s := range services {
servicesProto = append(servicesProto, TCPServiceToProto(&s))
}
return servicesProto
}
func UDPServicesToProto(services []db.UdpService) []*mantraev1.Service {
var servicesProto []*mantraev1.Service
for _, s := range services {
servicesProto = append(servicesProto, UDPServiceToProto(&s))
}
return servicesProto
}
// Specialized batch conversion functions
func ServicesByProfileToProto(services []db.ListServicesByProfileRow) []*mantraev1.Service {
var servicesProto []*mantraev1.Service
for _, s := range services {
switch s.Type {
case "http":
config, err := MarshalStruct(s.Config)
if err != nil {
return nil
}
servicesProto = append(servicesProto, &mantraev1.Service{
Id: s.ID,
ProfileId: s.ProfileID,
AgentId: SafeString(s.AgentID),
Name: s.Name,
Config: config,
Enabled: s.Enabled,
Type: mantraev1.ServiceType_SERVICE_TYPE_HTTP,
CreatedAt: SafeTimestamp(s.CreatedAt),
UpdatedAt: SafeTimestamp(s.UpdatedAt),
})
case "tcp":
config, err := MarshalStruct(s.Config)
if err != nil {
return nil
}
servicesProto = append(servicesProto, &mantraev1.Service{
Id: s.ID,
ProfileId: s.ProfileID,
AgentId: SafeString(s.AgentID),
Name: s.Name,
Config: config,
Enabled: s.Enabled,
Type: mantraev1.ServiceType_SERVICE_TYPE_TCP,
CreatedAt: SafeTimestamp(s.CreatedAt),
UpdatedAt: SafeTimestamp(s.UpdatedAt),
})
case "udp":
config, err := MarshalStruct(s.Config)
if err != nil {
return nil
}
servicesProto = append(servicesProto, &mantraev1.Service{
Id: s.ID,
ProfileId: s.ProfileID,
AgentId: SafeString(s.AgentID),
Name: s.Name,
Config: config,
Enabled: s.Enabled,
Type: mantraev1.ServiceType_SERVICE_TYPE_UDP,
CreatedAt: SafeTimestamp(s.CreatedAt),
UpdatedAt: SafeTimestamp(s.UpdatedAt),
})
default:
return nil
}
}
return servicesProto
}
func ServicesByAgentToProto(services []db.ListServicesByAgentRow) []*mantraev1.Service {
var servicesProto []*mantraev1.Service
for _, s := range services {
switch s.Type {
case "http":
config, err := MarshalStruct(s.Config)
if err != nil {
return nil
}
servicesProto = append(servicesProto, &mantraev1.Service{
Id: s.ID,
ProfileId: s.ProfileID,
AgentId: SafeString(s.AgentID),
Name: s.Name,
Config: config,
Enabled: s.Enabled,
Type: mantraev1.ServiceType_SERVICE_TYPE_HTTP,
CreatedAt: SafeTimestamp(s.CreatedAt),
UpdatedAt: SafeTimestamp(s.UpdatedAt),
})
case "tcp":
config, err := MarshalStruct(s.Config)
if err != nil {
return nil
}
servicesProto = append(servicesProto, &mantraev1.Service{
Id: s.ID,
ProfileId: s.ProfileID,
AgentId: SafeString(s.AgentID),
Name: s.Name,
Config: config,
Enabled: s.Enabled,
Type: mantraev1.ServiceType_SERVICE_TYPE_TCP,
CreatedAt: SafeTimestamp(s.CreatedAt),
UpdatedAt: SafeTimestamp(s.UpdatedAt),
})
case "udp":
config, err := MarshalStruct(s.Config)
if err != nil {
return nil
}
servicesProto = append(servicesProto, &mantraev1.Service{
Id: s.ID,
ProfileId: s.ProfileID,
AgentId: SafeString(s.AgentID),
Name: s.Name,
Config: config,
Enabled: s.Enabled,
Type: mantraev1.ServiceType_SERVICE_TYPE_UDP,
CreatedAt: SafeTimestamp(s.CreatedAt),
UpdatedAt: SafeTimestamp(s.UpdatedAt),
})
default:
return nil
}
}
return servicesProto
}

View File

@@ -1,48 +0,0 @@
package convert
import (
"github.com/mizuchilabs/mantrae/internal/store/db"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
func UserToProtoUnsafe(u *db.User) *mantraev1.User {
return &mantraev1.User{
Id: u.ID,
Username: u.Username,
Password: u.Password,
Email: SafeString(u.Email),
Otp: SafeString(u.Otp),
OtpExpiry: SafeTimestamp(u.OtpExpiry),
LastLogin: SafeTimestamp(u.LastLogin),
CreatedAt: SafeTimestamp(u.CreatedAt),
UpdatedAt: SafeTimestamp(u.UpdatedAt),
}
}
func UsersToProtoUnsafe(users []db.User) []*mantraev1.User {
var usersProto []*mantraev1.User
for _, u := range users {
usersProto = append(usersProto, UserToProtoUnsafe(&u))
}
return usersProto
}
// Safe version omits password and otp fields
func UserToProto(u *db.User) *mantraev1.User {
return &mantraev1.User{
Id: u.ID,
Username: u.Username,
Email: SafeString(u.Email),
LastLogin: SafeTimestamp(u.LastLogin),
CreatedAt: SafeTimestamp(u.CreatedAt),
UpdatedAt: SafeTimestamp(u.UpdatedAt),
}
}
func UsersToProto(users []db.User) []*mantraev1.User {
var usersProto []*mantraev1.User
for _, u := range users {
usersProto = append(usersProto, UserToProto(&u))
}
return usersProto
}

View File

@@ -1,135 +0,0 @@
// Package events provides a centralized event broadcasting system.
package events
import (
"slices"
"sync"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
)
type EventBroadcaster struct {
mu sync.RWMutex
profileClients map[int64]map[chan *mantraev1.ProfileEvent]*EventFilter
globalClients map[chan *mantraev1.GlobalEvent]*GlobalEventFilter
}
type EventFilter struct {
ProfileID int64
ResourceTypes []mantraev1.ResourceType
}
type GlobalEventFilter struct {
ResourceTypes []mantraev1.ResourceType
}
func NewEventBroadcaster() *EventBroadcaster {
return &EventBroadcaster{
profileClients: make(map[int64]map[chan *mantraev1.ProfileEvent]*EventFilter),
globalClients: make(map[chan *mantraev1.GlobalEvent]*GlobalEventFilter),
}
}
func (b *EventBroadcaster) RegisterProfileClient(
filter *EventFilter,
ch chan *mantraev1.ProfileEvent,
) {
b.mu.Lock()
defer b.mu.Unlock()
if b.profileClients[filter.ProfileID] == nil {
b.profileClients[filter.ProfileID] = make(map[chan *mantraev1.ProfileEvent]*EventFilter)
}
b.profileClients[filter.ProfileID][ch] = filter
}
func (b *EventBroadcaster) UnregisterProfileClient(ch chan *mantraev1.ProfileEvent) {
b.mu.Lock()
defer b.mu.Unlock()
for profileID, clients := range b.profileClients {
if _, exists := clients[ch]; exists {
delete(clients, ch)
if len(clients) == 0 {
delete(b.profileClients, profileID)
}
close(ch)
return
}
}
}
func (b *EventBroadcaster) RegisterGlobalClient(
filter *GlobalEventFilter,
ch chan *mantraev1.GlobalEvent,
) {
b.mu.Lock()
defer b.mu.Unlock()
if b.globalClients[ch] == nil {
b.globalClients[ch] = filter
}
}
func (b *EventBroadcaster) UnregisterGlobalClient(ch chan *mantraev1.GlobalEvent) {
b.mu.Lock()
defer b.mu.Unlock()
if _, exists := b.globalClients[ch]; exists {
delete(b.globalClients, ch)
close(ch)
}
}
func (b *EventBroadcaster) BroadcastProfileEvent(event *mantraev1.ProfileEvent) {
b.mu.RLock()
defer b.mu.RUnlock()
if clients, exists := b.profileClients[event.ProfileId]; exists {
for ch, filter := range clients {
// Apply filtering
if b.matchesFilter(event, filter) {
select {
case ch <- event:
default:
// Channel is full, skip
}
}
}
}
}
func (b *EventBroadcaster) BroadcastGlobalEvent(event *mantraev1.GlobalEvent) {
b.mu.RLock()
defer b.mu.RUnlock()
for ch, filter := range b.globalClients {
// Apply filtering for global events
if b.matchesGlobalFilter(event, filter) {
select {
case ch <- event:
default:
// Channel is full, skip
}
}
}
}
func (b *EventBroadcaster) matchesFilter(event *mantraev1.ProfileEvent, filter *EventFilter) bool {
// Filter by resource types if specified
if len(filter.ResourceTypes) > 0 {
return slices.Contains(filter.ResourceTypes, event.ResourceType)
}
return true
}
func (b *EventBroadcaster) matchesGlobalFilter(
event *mantraev1.GlobalEvent,
filter *GlobalEventFilter,
) bool {
if len(filter.ResourceTypes) > 0 {
return slices.Contains(filter.ResourceTypes, event.ResourceType)
}
return true
}

View File

@@ -16,10 +16,12 @@ SELECT
COUNT(*)
FROM
agents
WHERE
profile_id = ?
`
func (q *Queries) CountAgents(ctx context.Context) (int64, error) {
row := q.queryRow(ctx, q.countAgentsStmt, countAgents)
func (q *Queries) CountAgents(ctx context.Context, profileID int64) (int64, error) {
row := q.queryRow(ctx, q.countAgentsStmt, countAgents, profileID)
var count int64
err := row.Scan(&count)
return count, err
@@ -100,23 +102,23 @@ SELECT
FROM
agents
WHERE
profile_id = ?
profile_id = ?1
ORDER BY
created_at DESC
LIMIT
?
COALESCE(CAST(?3 AS INTEGER), -1)
OFFSET
?
COALESCE(CAST(?2 AS INTEGER), 0)
`
type ListAgentsParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
Offset *int64 `json:"offset"`
Limit *int64 `json:"limit"`
}
func (q *Queries) ListAgents(ctx context.Context, arg ListAgentsParams) ([]Agent, error) {
rows, err := q.query(ctx, q.listAgentsStmt, listAgents, arg.ProfileID, arg.Limit, arg.Offset)
rows, err := q.query(ctx, q.listAgentsStmt, listAgents, arg.ProfileID, arg.Offset, arg.Limit)
if err != nil {
return nil, err
}

View File

@@ -88,14 +88,14 @@ FROM
ORDER BY
a.created_at DESC
LIMIT
?
COALESCE(CAST(?2 AS INTEGER), -1)
OFFSET
?
COALESCE(CAST(?1 AS INTEGER), 0)
`
type ListAuditLogsParams struct {
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
Offset *int64 `json:"offset"`
Limit *int64 `json:"limit"`
}
type ListAuditLogsRow struct {
@@ -112,7 +112,7 @@ type ListAuditLogsRow struct {
}
func (q *Queries) ListAuditLogs(ctx context.Context, arg ListAuditLogsParams) ([]ListAuditLogsRow, error) {
rows, err := q.query(ctx, q.listAuditLogsStmt, listAuditLogs, arg.Limit, arg.Offset)
rows, err := q.query(ctx, q.listAuditLogsStmt, listAuditLogs, arg.Offset, arg.Limit)
if err != nil {
return nil, err
}

View File

@@ -0,0 +1,423 @@
package db
import (
"encoding/json"
"errors"
"fmt"
"time"
"github.com/mizuchilabs/mantrae/internal/store/schema"
mantraev1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
"google.golang.org/protobuf/types/known/structpb"
"google.golang.org/protobuf/types/known/timestamppb"
)
// SQL to Proto ---------------------------------------------------------------
func (p *Profile) ToProto() *mantraev1.Profile {
return &mantraev1.Profile{
Id: p.ID,
Name: p.Name,
Description: SafeString(p.Description),
Token: p.Token,
CreatedAt: SafeTimestamp(p.CreatedAt),
UpdatedAt: SafeTimestamp(p.UpdatedAt),
}
}
func (e *EntryPoint) ToProto() *mantraev1.EntryPoint {
return &mantraev1.EntryPoint{
Id: e.ID,
ProfileId: e.ProfileID,
Name: e.Name,
Address: e.Address,
IsDefault: e.IsDefault,
CreatedAt: SafeTimestamp(e.CreatedAt),
UpdatedAt: SafeTimestamp(e.UpdatedAt),
}
}
func (r *HttpRouter) ToProto() *mantraev1.Router {
config, err := MarshalStruct(r.Config)
if err != nil {
return nil
}
return &mantraev1.Router{
Id: r.ID,
ProfileId: r.ProfileID,
AgentId: SafeString(r.AgentID),
Name: r.Name,
Config: config,
Enabled: r.Enabled,
Type: mantraev1.RouterType_ROUTER_TYPE_HTTP,
CreatedAt: SafeTimestamp(r.CreatedAt),
UpdatedAt: SafeTimestamp(r.UpdatedAt),
}
}
func (r *TcpRouter) ToProto() *mantraev1.Router {
config, err := MarshalStruct(r.Config)
if err != nil {
return nil
}
return &mantraev1.Router{
Id: r.ID,
ProfileId: r.ProfileID,
AgentId: SafeString(r.AgentID),
Name: r.Name,
Config: config,
Enabled: r.Enabled,
Type: mantraev1.RouterType_ROUTER_TYPE_TCP,
CreatedAt: SafeTimestamp(r.CreatedAt),
UpdatedAt: SafeTimestamp(r.UpdatedAt),
}
}
func (r *UdpRouter) ToProto() *mantraev1.Router {
config, err := MarshalStruct(r.Config)
if err != nil {
return nil
}
return &mantraev1.Router{
Id: r.ID,
ProfileId: r.ProfileID,
AgentId: SafeString(r.AgentID),
Name: r.Name,
Config: config,
Enabled: r.Enabled,
Type: mantraev1.RouterType_ROUTER_TYPE_UDP,
CreatedAt: SafeTimestamp(r.CreatedAt),
UpdatedAt: SafeTimestamp(r.UpdatedAt),
}
}
func (s *HttpService) ToProto() *mantraev1.Service {
config, err := MarshalStruct(s.Config)
if err != nil {
return nil
}
return &mantraev1.Service{
Id: s.ID,
ProfileId: s.ProfileID,
AgentId: SafeString(s.AgentID),
Name: s.Name,
Config: config,
Enabled: s.Enabled,
Type: mantraev1.ServiceType_SERVICE_TYPE_HTTP,
CreatedAt: SafeTimestamp(s.CreatedAt),
UpdatedAt: SafeTimestamp(s.UpdatedAt),
}
}
func (s *TcpService) ToProto() *mantraev1.Service {
config, err := MarshalStruct(s.Config)
if err != nil {
return nil
}
return &mantraev1.Service{
Id: s.ID,
ProfileId: s.ProfileID,
AgentId: SafeString(s.AgentID),
Name: s.Name,
Config: config,
Enabled: s.Enabled,
Type: mantraev1.ServiceType_SERVICE_TYPE_TCP,
CreatedAt: SafeTimestamp(s.CreatedAt),
UpdatedAt: SafeTimestamp(s.UpdatedAt),
}
}
func (s *UdpService) ToProto() *mantraev1.Service {
config, err := MarshalStruct(s.Config)
if err != nil {
return nil
}
return &mantraev1.Service{
Id: s.ID,
ProfileId: s.ProfileID,
AgentId: SafeString(s.AgentID),
Name: s.Name,
Config: config,
Enabled: s.Enabled,
Type: mantraev1.ServiceType_SERVICE_TYPE_UDP,
CreatedAt: SafeTimestamp(s.CreatedAt),
UpdatedAt: SafeTimestamp(s.UpdatedAt),
}
}
func (m *HttpMiddleware) ToProto() *mantraev1.Middleware {
config, err := MarshalStruct(m.Config)
if err != nil {
return nil
}
return &mantraev1.Middleware{
Id: m.ID,
ProfileId: m.ProfileID,
AgentId: SafeString(m.AgentID),
Name: m.Name,
Config: config,
Enabled: m.Enabled,
IsDefault: m.IsDefault,
Type: mantraev1.MiddlewareType_MIDDLEWARE_TYPE_HTTP,
CreatedAt: SafeTimestamp(m.CreatedAt),
UpdatedAt: SafeTimestamp(m.UpdatedAt),
}
}
func (m *TcpMiddleware) ToProto() *mantraev1.Middleware {
config, err := MarshalStruct(m.Config)
if err != nil {
return nil
}
return &mantraev1.Middleware{
Id: m.ID,
ProfileId: m.ProfileID,
AgentId: SafeString(m.AgentID),
Name: m.Name,
Config: config,
Enabled: m.Enabled,
IsDefault: m.IsDefault,
Type: mantraev1.MiddlewareType_MIDDLEWARE_TYPE_TCP,
CreatedAt: SafeTimestamp(m.CreatedAt),
UpdatedAt: SafeTimestamp(m.UpdatedAt),
}
}
func (m *HttpServersTransport) ToProto() *mantraev1.ServersTransport {
config, err := MarshalStruct(m.Config)
if err != nil {
return nil
}
return &mantraev1.ServersTransport{
Id: m.ID,
ProfileId: m.ProfileID,
AgentId: SafeString(m.AgentID),
Name: m.Name,
Config: config,
Enabled: m.Enabled,
Type: mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_HTTP,
CreatedAt: SafeTimestamp(m.CreatedAt),
UpdatedAt: SafeTimestamp(m.UpdatedAt),
}
}
func (m *TcpServersTransport) ToProto() *mantraev1.ServersTransport {
config, err := MarshalStruct(m.Config)
if err != nil {
return nil
}
return &mantraev1.ServersTransport{
Id: m.ID,
ProfileId: m.ProfileID,
AgentId: SafeString(m.AgentID),
Name: m.Name,
Config: config,
Enabled: m.Enabled,
Type: mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_TCP,
CreatedAt: SafeTimestamp(m.CreatedAt),
UpdatedAt: SafeTimestamp(m.UpdatedAt),
}
}
func (u *User) ToProto() *mantraev1.User {
return &mantraev1.User{
Id: u.ID,
Username: u.Username,
Password: u.Password,
Email: SafeString(u.Email),
Otp: SafeString(u.Otp),
OtpExpiry: SafeTimestamp(u.OtpExpiry),
LastLogin: SafeTimestamp(u.LastLogin),
CreatedAt: SafeTimestamp(u.CreatedAt),
UpdatedAt: SafeTimestamp(u.UpdatedAt),
}
}
func (a *Agent) ToProto() *mantraev1.Agent {
var containers []*mantraev1.Container
if a.Containers != nil {
for _, c := range *a.Containers {
containers = append(containers, &mantraev1.Container{
Id: c.ID,
Name: c.Name,
Labels: c.Labels,
Image: c.Image,
Portmap: c.Portmap,
Status: c.Status,
Created: SafeTimestamp(c.Created),
})
}
}
return &mantraev1.Agent{
Id: a.ID,
ProfileId: a.ProfileID,
Hostname: SafeString(a.Hostname),
PublicIp: SafeString(a.PublicIp),
PrivateIp: SafeString(a.PrivateIp),
Containers: containers,
ActiveIp: SafeString(a.ActiveIp),
Token: a.Token,
CreatedAt: SafeTimestamp(a.CreatedAt),
UpdatedAt: SafeTimestamp(a.UpdatedAt),
}
}
func (d *DnsProvider) ToProto() *mantraev1.DnsProvider {
var dnsType mantraev1.DnsProviderType
switch d.Type {
case "cloudflare":
dnsType = mantraev1.DnsProviderType_DNS_PROVIDER_TYPE_CLOUDFLARE
case "powerdns":
dnsType = mantraev1.DnsProviderType_DNS_PROVIDER_TYPE_POWERDNS
case "technitium":
dnsType = mantraev1.DnsProviderType_DNS_PROVIDER_TYPE_TECHNITIUM
default:
return nil
}
return &mantraev1.DnsProvider{
Id: d.ID,
Name: d.Name,
Type: dnsType,
Config: &mantraev1.DnsProviderConfig{
ApiKey: d.Config.APIKey,
ApiUrl: d.Config.APIUrl,
Ip: d.Config.IP,
Proxied: d.Config.Proxied,
AutoUpdate: d.Config.AutoUpdate,
ZoneType: d.Config.ZoneType,
},
IsDefault: d.IsDefault,
CreatedAt: SafeTimestamp(d.CreatedAt),
UpdatedAt: SafeTimestamp(d.UpdatedAt),
}
}
func (a *ListAuditLogsRow) ToProto() *mantraev1.AuditLog {
return &mantraev1.AuditLog{
Id: a.ID,
Event: a.Event,
Details: SafeString(a.Details),
ProfileId: SafeInt64(a.ProfileID),
ProfileName: SafeString(a.ProfileName),
UserId: SafeString(a.UserID),
UserName: SafeString(a.UserName),
AgentId: SafeString(a.AgentID),
AgentName: SafeString(a.AgentName),
CreatedAt: SafeTimestamp(a.CreatedAt),
}
}
// Proto to SQL ---------------------------------------------------------------
func (r *HttpRouter) FromProto(proto *mantraev1.Router) error {
if proto.Type != mantraev1.RouterType_ROUTER_TYPE_HTTP {
return errors.New("invalid router type for HTTP router")
}
config, err := UnmarshalStruct[schema.HTTPRouter](proto.Config)
if err != nil {
return fmt.Errorf("failed to unmarshal config: %w", err)
}
r.ID = proto.Id
r.ProfileID = proto.ProfileId
r.AgentID = StringPtr(proto.AgentId)
r.Name = proto.Name
r.Config = config
r.Enabled = proto.Enabled
r.CreatedAt = TimePtr(proto.CreatedAt.AsTime())
r.UpdatedAt = TimePtr(proto.UpdatedAt.AsTime())
return nil
}
// Common helper --------------------------------------------------------------
func SafeString(s *string) string {
if s == nil {
return ""
}
return *s
}
func SafeInt32(i *int32) int32 {
if i == nil {
return 0
}
return *i
}
func SafeInt64(i *int64) int64 {
if i == nil {
return 0
}
return *i
}
func SafeFloat32(f *float32) float32 {
if f == nil {
return 0.0
}
return *f
}
func SafeFloat64(f *float64) float64 {
if f == nil {
return 0.0
}
return *f
}
func SafeTimestamp(t *time.Time) *timestamppb.Timestamp {
if t == nil {
return nil
}
return timestamppb.New(*t)
}
func StringPtr(s string) *string {
if s == "" {
return nil
}
return &s
}
func TimePtr(t time.Time) *time.Time {
if t.IsZero() {
return nil
}
return &t
}
func UnmarshalStruct[T any](s *structpb.Struct) (*T, error) {
// Marshal the proto Struct to JSON bytes
data, err := s.MarshalJSON()
if err != nil {
return nil, err
}
// Unmarshal into your target struct
var out T
if err := json.Unmarshal(data, &out); err != nil {
return nil, err
}
return &out, nil
}
func MarshalStruct[T any](s *T) (*structpb.Struct, error) {
// Marshal the target struct to JSON bytes
data, err := json.Marshal(s)
if err != nil {
return nil, err
}
// Unmarshal into your proto Struct
var out structpb.Struct
if err := out.UnmarshalJSON(data); err != nil {
return nil, err
}
return &out, nil
}

View File

@@ -39,45 +39,15 @@ func Prepare(ctx context.Context, db DBTX) (*Queries, error) {
if q.countHttpMiddlewaresStmt, err = db.PrepareContext(ctx, countHttpMiddlewares); err != nil {
return nil, fmt.Errorf("error preparing query CountHttpMiddlewares: %w", err)
}
if q.countHttpMiddlewaresByAgentStmt, err = db.PrepareContext(ctx, countHttpMiddlewaresByAgent); err != nil {
return nil, fmt.Errorf("error preparing query CountHttpMiddlewaresByAgent: %w", err)
}
if q.countHttpMiddlewaresByProfileStmt, err = db.PrepareContext(ctx, countHttpMiddlewaresByProfile); err != nil {
return nil, fmt.Errorf("error preparing query CountHttpMiddlewaresByProfile: %w", err)
}
if q.countHttpRoutersStmt, err = db.PrepareContext(ctx, countHttpRouters); err != nil {
return nil, fmt.Errorf("error preparing query CountHttpRouters: %w", err)
}
if q.countHttpRoutersByAgentStmt, err = db.PrepareContext(ctx, countHttpRoutersByAgent); err != nil {
return nil, fmt.Errorf("error preparing query CountHttpRoutersByAgent: %w", err)
}
if q.countHttpRoutersByProfileStmt, err = db.PrepareContext(ctx, countHttpRoutersByProfile); err != nil {
return nil, fmt.Errorf("error preparing query CountHttpRoutersByProfile: %w", err)
}
if q.countHttpServersTransportsStmt, err = db.PrepareContext(ctx, countHttpServersTransports); err != nil {
return nil, fmt.Errorf("error preparing query CountHttpServersTransports: %w", err)
}
if q.countHttpServersTransportsByAgentStmt, err = db.PrepareContext(ctx, countHttpServersTransportsByAgent); err != nil {
return nil, fmt.Errorf("error preparing query CountHttpServersTransportsByAgent: %w", err)
}
if q.countHttpServersTransportsByProfileStmt, err = db.PrepareContext(ctx, countHttpServersTransportsByProfile); err != nil {
return nil, fmt.Errorf("error preparing query CountHttpServersTransportsByProfile: %w", err)
}
if q.countHttpServicesStmt, err = db.PrepareContext(ctx, countHttpServices); err != nil {
return nil, fmt.Errorf("error preparing query CountHttpServices: %w", err)
}
if q.countHttpServicesByAgentStmt, err = db.PrepareContext(ctx, countHttpServicesByAgent); err != nil {
return nil, fmt.Errorf("error preparing query CountHttpServicesByAgent: %w", err)
}
if q.countHttpServicesByProfileStmt, err = db.PrepareContext(ctx, countHttpServicesByProfile); err != nil {
return nil, fmt.Errorf("error preparing query CountHttpServicesByProfile: %w", err)
}
if q.countMiddlewaresByAgentStmt, err = db.PrepareContext(ctx, countMiddlewaresByAgent); err != nil {
return nil, fmt.Errorf("error preparing query CountMiddlewaresByAgent: %w", err)
}
if q.countMiddlewaresByProfileStmt, err = db.PrepareContext(ctx, countMiddlewaresByProfile); err != nil {
return nil, fmt.Errorf("error preparing query CountMiddlewaresByProfile: %w", err)
}
if q.countProfilesStmt, err = db.PrepareContext(ctx, countProfiles); err != nil {
return nil, fmt.Errorf("error preparing query CountProfiles: %w", err)
}
@@ -102,60 +72,24 @@ func Prepare(ctx context.Context, db DBTX) (*Queries, error) {
if q.countTcpMiddlewaresStmt, err = db.PrepareContext(ctx, countTcpMiddlewares); err != nil {
return nil, fmt.Errorf("error preparing query CountTcpMiddlewares: %w", err)
}
if q.countTcpMiddlewaresByAgentStmt, err = db.PrepareContext(ctx, countTcpMiddlewaresByAgent); err != nil {
return nil, fmt.Errorf("error preparing query CountTcpMiddlewaresByAgent: %w", err)
}
if q.countTcpMiddlewaresByProfileStmt, err = db.PrepareContext(ctx, countTcpMiddlewaresByProfile); err != nil {
return nil, fmt.Errorf("error preparing query CountTcpMiddlewaresByProfile: %w", err)
}
if q.countTcpRoutersStmt, err = db.PrepareContext(ctx, countTcpRouters); err != nil {
return nil, fmt.Errorf("error preparing query CountTcpRouters: %w", err)
}
if q.countTcpRoutersByAgentStmt, err = db.PrepareContext(ctx, countTcpRoutersByAgent); err != nil {
return nil, fmt.Errorf("error preparing query CountTcpRoutersByAgent: %w", err)
}
if q.countTcpRoutersByProfileStmt, err = db.PrepareContext(ctx, countTcpRoutersByProfile); err != nil {
return nil, fmt.Errorf("error preparing query CountTcpRoutersByProfile: %w", err)
}
if q.countTcpServersTransportsStmt, err = db.PrepareContext(ctx, countTcpServersTransports); err != nil {
return nil, fmt.Errorf("error preparing query CountTcpServersTransports: %w", err)
}
if q.countTcpServersTransportsByAgentStmt, err = db.PrepareContext(ctx, countTcpServersTransportsByAgent); err != nil {
return nil, fmt.Errorf("error preparing query CountTcpServersTransportsByAgent: %w", err)
}
if q.countTcpServersTransportsByProfileStmt, err = db.PrepareContext(ctx, countTcpServersTransportsByProfile); err != nil {
return nil, fmt.Errorf("error preparing query CountTcpServersTransportsByProfile: %w", err)
}
if q.countTcpServicesStmt, err = db.PrepareContext(ctx, countTcpServices); err != nil {
return nil, fmt.Errorf("error preparing query CountTcpServices: %w", err)
}
if q.countTcpServicesByAgentStmt, err = db.PrepareContext(ctx, countTcpServicesByAgent); err != nil {
return nil, fmt.Errorf("error preparing query CountTcpServicesByAgent: %w", err)
}
if q.countTcpServicesByProfileStmt, err = db.PrepareContext(ctx, countTcpServicesByProfile); err != nil {
return nil, fmt.Errorf("error preparing query CountTcpServicesByProfile: %w", err)
}
if q.countTraefikInstancesStmt, err = db.PrepareContext(ctx, countTraefikInstances); err != nil {
return nil, fmt.Errorf("error preparing query CountTraefikInstances: %w", err)
}
if q.countUdpRoutersStmt, err = db.PrepareContext(ctx, countUdpRouters); err != nil {
return nil, fmt.Errorf("error preparing query CountUdpRouters: %w", err)
}
if q.countUdpRoutersByAgentStmt, err = db.PrepareContext(ctx, countUdpRoutersByAgent); err != nil {
return nil, fmt.Errorf("error preparing query CountUdpRoutersByAgent: %w", err)
}
if q.countUdpRoutersByProfileStmt, err = db.PrepareContext(ctx, countUdpRoutersByProfile); err != nil {
return nil, fmt.Errorf("error preparing query CountUdpRoutersByProfile: %w", err)
}
if q.countUdpServicesStmt, err = db.PrepareContext(ctx, countUdpServices); err != nil {
return nil, fmt.Errorf("error preparing query CountUdpServices: %w", err)
}
if q.countUdpServicesByAgentStmt, err = db.PrepareContext(ctx, countUdpServicesByAgent); err != nil {
return nil, fmt.Errorf("error preparing query CountUdpServicesByAgent: %w", err)
}
if q.countUdpServicesByProfileStmt, err = db.PrepareContext(ctx, countUdpServicesByProfile); err != nil {
return nil, fmt.Errorf("error preparing query CountUdpServicesByProfile: %w", err)
}
if q.countUsersStmt, err = db.PrepareContext(ctx, countUsers); err != nil {
return nil, fmt.Errorf("error preparing query CountUsers: %w", err)
}
@@ -411,45 +345,27 @@ func Prepare(ctx context.Context, db DBTX) (*Queries, error) {
if q.listHttpMiddlewaresStmt, err = db.PrepareContext(ctx, listHttpMiddlewares); err != nil {
return nil, fmt.Errorf("error preparing query ListHttpMiddlewares: %w", err)
}
if q.listHttpMiddlewaresByAgentStmt, err = db.PrepareContext(ctx, listHttpMiddlewaresByAgent); err != nil {
return nil, fmt.Errorf("error preparing query ListHttpMiddlewaresByAgent: %w", err)
}
if q.listHttpMiddlewaresEnabledStmt, err = db.PrepareContext(ctx, listHttpMiddlewaresEnabled); err != nil {
return nil, fmt.Errorf("error preparing query ListHttpMiddlewaresEnabled: %w", err)
}
if q.listHttpRoutersStmt, err = db.PrepareContext(ctx, listHttpRouters); err != nil {
return nil, fmt.Errorf("error preparing query ListHttpRouters: %w", err)
}
if q.listHttpRoutersByAgentStmt, err = db.PrepareContext(ctx, listHttpRoutersByAgent); err != nil {
return nil, fmt.Errorf("error preparing query ListHttpRoutersByAgent: %w", err)
}
if q.listHttpRoutersEnabledStmt, err = db.PrepareContext(ctx, listHttpRoutersEnabled); err != nil {
return nil, fmt.Errorf("error preparing query ListHttpRoutersEnabled: %w", err)
}
if q.listHttpServersTransportsStmt, err = db.PrepareContext(ctx, listHttpServersTransports); err != nil {
return nil, fmt.Errorf("error preparing query ListHttpServersTransports: %w", err)
}
if q.listHttpServersTransportsByAgentStmt, err = db.PrepareContext(ctx, listHttpServersTransportsByAgent); err != nil {
return nil, fmt.Errorf("error preparing query ListHttpServersTransportsByAgent: %w", err)
}
if q.listHttpServersTransportsEnabledStmt, err = db.PrepareContext(ctx, listHttpServersTransportsEnabled); err != nil {
return nil, fmt.Errorf("error preparing query ListHttpServersTransportsEnabled: %w", err)
}
if q.listHttpServicesStmt, err = db.PrepareContext(ctx, listHttpServices); err != nil {
return nil, fmt.Errorf("error preparing query ListHttpServices: %w", err)
}
if q.listHttpServicesByAgentStmt, err = db.PrepareContext(ctx, listHttpServicesByAgent); err != nil {
return nil, fmt.Errorf("error preparing query ListHttpServicesByAgent: %w", err)
}
if q.listHttpServicesEnabledStmt, err = db.PrepareContext(ctx, listHttpServicesEnabled); err != nil {
return nil, fmt.Errorf("error preparing query ListHttpServicesEnabled: %w", err)
}
if q.listMiddlewaresByAgentStmt, err = db.PrepareContext(ctx, listMiddlewaresByAgent); err != nil {
return nil, fmt.Errorf("error preparing query ListMiddlewaresByAgent: %w", err)
}
if q.listMiddlewaresByProfileStmt, err = db.PrepareContext(ctx, listMiddlewaresByProfile); err != nil {
return nil, fmt.Errorf("error preparing query ListMiddlewaresByProfile: %w", err)
}
if q.listProfilesStmt, err = db.PrepareContext(ctx, listProfiles); err != nil {
return nil, fmt.Errorf("error preparing query ListProfiles: %w", err)
}
@@ -477,36 +393,24 @@ func Prepare(ctx context.Context, db DBTX) (*Queries, error) {
if q.listTcpMiddlewaresStmt, err = db.PrepareContext(ctx, listTcpMiddlewares); err != nil {
return nil, fmt.Errorf("error preparing query ListTcpMiddlewares: %w", err)
}
if q.listTcpMiddlewaresByAgentStmt, err = db.PrepareContext(ctx, listTcpMiddlewaresByAgent); err != nil {
return nil, fmt.Errorf("error preparing query ListTcpMiddlewaresByAgent: %w", err)
}
if q.listTcpMiddlewaresEnabledStmt, err = db.PrepareContext(ctx, listTcpMiddlewaresEnabled); err != nil {
return nil, fmt.Errorf("error preparing query ListTcpMiddlewaresEnabled: %w", err)
}
if q.listTcpRoutersStmt, err = db.PrepareContext(ctx, listTcpRouters); err != nil {
return nil, fmt.Errorf("error preparing query ListTcpRouters: %w", err)
}
if q.listTcpRoutersByAgentStmt, err = db.PrepareContext(ctx, listTcpRoutersByAgent); err != nil {
return nil, fmt.Errorf("error preparing query ListTcpRoutersByAgent: %w", err)
}
if q.listTcpRoutersEnabledStmt, err = db.PrepareContext(ctx, listTcpRoutersEnabled); err != nil {
return nil, fmt.Errorf("error preparing query ListTcpRoutersEnabled: %w", err)
}
if q.listTcpServersTransportsStmt, err = db.PrepareContext(ctx, listTcpServersTransports); err != nil {
return nil, fmt.Errorf("error preparing query ListTcpServersTransports: %w", err)
}
if q.listTcpServersTransportsByAgentStmt, err = db.PrepareContext(ctx, listTcpServersTransportsByAgent); err != nil {
return nil, fmt.Errorf("error preparing query ListTcpServersTransportsByAgent: %w", err)
}
if q.listTcpServersTransportsEnabledStmt, err = db.PrepareContext(ctx, listTcpServersTransportsEnabled); err != nil {
return nil, fmt.Errorf("error preparing query ListTcpServersTransportsEnabled: %w", err)
}
if q.listTcpServicesStmt, err = db.PrepareContext(ctx, listTcpServices); err != nil {
return nil, fmt.Errorf("error preparing query ListTcpServices: %w", err)
}
if q.listTcpServicesByAgentStmt, err = db.PrepareContext(ctx, listTcpServicesByAgent); err != nil {
return nil, fmt.Errorf("error preparing query ListTcpServicesByAgent: %w", err)
}
if q.listTcpServicesEnabledStmt, err = db.PrepareContext(ctx, listTcpServicesEnabled); err != nil {
return nil, fmt.Errorf("error preparing query ListTcpServicesEnabled: %w", err)
}
@@ -516,18 +420,12 @@ func Prepare(ctx context.Context, db DBTX) (*Queries, error) {
if q.listUdpRoutersStmt, err = db.PrepareContext(ctx, listUdpRouters); err != nil {
return nil, fmt.Errorf("error preparing query ListUdpRouters: %w", err)
}
if q.listUdpRoutersByAgentStmt, err = db.PrepareContext(ctx, listUdpRoutersByAgent); err != nil {
return nil, fmt.Errorf("error preparing query ListUdpRoutersByAgent: %w", err)
}
if q.listUdpRoutersEnabledStmt, err = db.PrepareContext(ctx, listUdpRoutersEnabled); err != nil {
return nil, fmt.Errorf("error preparing query ListUdpRoutersEnabled: %w", err)
}
if q.listUdpServicesStmt, err = db.PrepareContext(ctx, listUdpServices); err != nil {
return nil, fmt.Errorf("error preparing query ListUdpServices: %w", err)
}
if q.listUdpServicesByAgentStmt, err = db.PrepareContext(ctx, listUdpServicesByAgent); err != nil {
return nil, fmt.Errorf("error preparing query ListUdpServicesByAgent: %w", err)
}
if q.listUdpServicesEnabledStmt, err = db.PrepareContext(ctx, listUdpServicesEnabled); err != nil {
return nil, fmt.Errorf("error preparing query ListUdpServicesEnabled: %w", err)
}
@@ -648,71 +546,21 @@ func (q *Queries) Close() error {
err = fmt.Errorf("error closing countHttpMiddlewaresStmt: %w", cerr)
}
}
if q.countHttpMiddlewaresByAgentStmt != nil {
if cerr := q.countHttpMiddlewaresByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countHttpMiddlewaresByAgentStmt: %w", cerr)
}
}
if q.countHttpMiddlewaresByProfileStmt != nil {
if cerr := q.countHttpMiddlewaresByProfileStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countHttpMiddlewaresByProfileStmt: %w", cerr)
}
}
if q.countHttpRoutersStmt != nil {
if cerr := q.countHttpRoutersStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countHttpRoutersStmt: %w", cerr)
}
}
if q.countHttpRoutersByAgentStmt != nil {
if cerr := q.countHttpRoutersByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countHttpRoutersByAgentStmt: %w", cerr)
}
}
if q.countHttpRoutersByProfileStmt != nil {
if cerr := q.countHttpRoutersByProfileStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countHttpRoutersByProfileStmt: %w", cerr)
}
}
if q.countHttpServersTransportsStmt != nil {
if cerr := q.countHttpServersTransportsStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countHttpServersTransportsStmt: %w", cerr)
}
}
if q.countHttpServersTransportsByAgentStmt != nil {
if cerr := q.countHttpServersTransportsByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countHttpServersTransportsByAgentStmt: %w", cerr)
}
}
if q.countHttpServersTransportsByProfileStmt != nil {
if cerr := q.countHttpServersTransportsByProfileStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countHttpServersTransportsByProfileStmt: %w", cerr)
}
}
if q.countHttpServicesStmt != nil {
if cerr := q.countHttpServicesStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countHttpServicesStmt: %w", cerr)
}
}
if q.countHttpServicesByAgentStmt != nil {
if cerr := q.countHttpServicesByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countHttpServicesByAgentStmt: %w", cerr)
}
}
if q.countHttpServicesByProfileStmt != nil {
if cerr := q.countHttpServicesByProfileStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countHttpServicesByProfileStmt: %w", cerr)
}
}
if q.countMiddlewaresByAgentStmt != nil {
if cerr := q.countMiddlewaresByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countMiddlewaresByAgentStmt: %w", cerr)
}
}
if q.countMiddlewaresByProfileStmt != nil {
if cerr := q.countMiddlewaresByProfileStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countMiddlewaresByProfileStmt: %w", cerr)
}
}
if q.countProfilesStmt != nil {
if cerr := q.countProfilesStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countProfilesStmt: %w", cerr)
@@ -753,61 +601,21 @@ func (q *Queries) Close() error {
err = fmt.Errorf("error closing countTcpMiddlewaresStmt: %w", cerr)
}
}
if q.countTcpMiddlewaresByAgentStmt != nil {
if cerr := q.countTcpMiddlewaresByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countTcpMiddlewaresByAgentStmt: %w", cerr)
}
}
if q.countTcpMiddlewaresByProfileStmt != nil {
if cerr := q.countTcpMiddlewaresByProfileStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countTcpMiddlewaresByProfileStmt: %w", cerr)
}
}
if q.countTcpRoutersStmt != nil {
if cerr := q.countTcpRoutersStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countTcpRoutersStmt: %w", cerr)
}
}
if q.countTcpRoutersByAgentStmt != nil {
if cerr := q.countTcpRoutersByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countTcpRoutersByAgentStmt: %w", cerr)
}
}
if q.countTcpRoutersByProfileStmt != nil {
if cerr := q.countTcpRoutersByProfileStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countTcpRoutersByProfileStmt: %w", cerr)
}
}
if q.countTcpServersTransportsStmt != nil {
if cerr := q.countTcpServersTransportsStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countTcpServersTransportsStmt: %w", cerr)
}
}
if q.countTcpServersTransportsByAgentStmt != nil {
if cerr := q.countTcpServersTransportsByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countTcpServersTransportsByAgentStmt: %w", cerr)
}
}
if q.countTcpServersTransportsByProfileStmt != nil {
if cerr := q.countTcpServersTransportsByProfileStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countTcpServersTransportsByProfileStmt: %w", cerr)
}
}
if q.countTcpServicesStmt != nil {
if cerr := q.countTcpServicesStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countTcpServicesStmt: %w", cerr)
}
}
if q.countTcpServicesByAgentStmt != nil {
if cerr := q.countTcpServicesByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countTcpServicesByAgentStmt: %w", cerr)
}
}
if q.countTcpServicesByProfileStmt != nil {
if cerr := q.countTcpServicesByProfileStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countTcpServicesByProfileStmt: %w", cerr)
}
}
if q.countTraefikInstancesStmt != nil {
if cerr := q.countTraefikInstancesStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countTraefikInstancesStmt: %w", cerr)
@@ -818,31 +626,11 @@ func (q *Queries) Close() error {
err = fmt.Errorf("error closing countUdpRoutersStmt: %w", cerr)
}
}
if q.countUdpRoutersByAgentStmt != nil {
if cerr := q.countUdpRoutersByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countUdpRoutersByAgentStmt: %w", cerr)
}
}
if q.countUdpRoutersByProfileStmt != nil {
if cerr := q.countUdpRoutersByProfileStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countUdpRoutersByProfileStmt: %w", cerr)
}
}
if q.countUdpServicesStmt != nil {
if cerr := q.countUdpServicesStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countUdpServicesStmt: %w", cerr)
}
}
if q.countUdpServicesByAgentStmt != nil {
if cerr := q.countUdpServicesByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countUdpServicesByAgentStmt: %w", cerr)
}
}
if q.countUdpServicesByProfileStmt != nil {
if cerr := q.countUdpServicesByProfileStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countUdpServicesByProfileStmt: %w", cerr)
}
}
if q.countUsersStmt != nil {
if cerr := q.countUsersStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing countUsersStmt: %w", cerr)
@@ -1268,11 +1056,6 @@ func (q *Queries) Close() error {
err = fmt.Errorf("error closing listHttpMiddlewaresStmt: %w", cerr)
}
}
if q.listHttpMiddlewaresByAgentStmt != nil {
if cerr := q.listHttpMiddlewaresByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listHttpMiddlewaresByAgentStmt: %w", cerr)
}
}
if q.listHttpMiddlewaresEnabledStmt != nil {
if cerr := q.listHttpMiddlewaresEnabledStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listHttpMiddlewaresEnabledStmt: %w", cerr)
@@ -1283,11 +1066,6 @@ func (q *Queries) Close() error {
err = fmt.Errorf("error closing listHttpRoutersStmt: %w", cerr)
}
}
if q.listHttpRoutersByAgentStmt != nil {
if cerr := q.listHttpRoutersByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listHttpRoutersByAgentStmt: %w", cerr)
}
}
if q.listHttpRoutersEnabledStmt != nil {
if cerr := q.listHttpRoutersEnabledStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listHttpRoutersEnabledStmt: %w", cerr)
@@ -1298,11 +1076,6 @@ func (q *Queries) Close() error {
err = fmt.Errorf("error closing listHttpServersTransportsStmt: %w", cerr)
}
}
if q.listHttpServersTransportsByAgentStmt != nil {
if cerr := q.listHttpServersTransportsByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listHttpServersTransportsByAgentStmt: %w", cerr)
}
}
if q.listHttpServersTransportsEnabledStmt != nil {
if cerr := q.listHttpServersTransportsEnabledStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listHttpServersTransportsEnabledStmt: %w", cerr)
@@ -1313,26 +1086,11 @@ func (q *Queries) Close() error {
err = fmt.Errorf("error closing listHttpServicesStmt: %w", cerr)
}
}
if q.listHttpServicesByAgentStmt != nil {
if cerr := q.listHttpServicesByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listHttpServicesByAgentStmt: %w", cerr)
}
}
if q.listHttpServicesEnabledStmt != nil {
if cerr := q.listHttpServicesEnabledStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listHttpServicesEnabledStmt: %w", cerr)
}
}
if q.listMiddlewaresByAgentStmt != nil {
if cerr := q.listMiddlewaresByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listMiddlewaresByAgentStmt: %w", cerr)
}
}
if q.listMiddlewaresByProfileStmt != nil {
if cerr := q.listMiddlewaresByProfileStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listMiddlewaresByProfileStmt: %w", cerr)
}
}
if q.listProfilesStmt != nil {
if cerr := q.listProfilesStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listProfilesStmt: %w", cerr)
@@ -1378,11 +1136,6 @@ func (q *Queries) Close() error {
err = fmt.Errorf("error closing listTcpMiddlewaresStmt: %w", cerr)
}
}
if q.listTcpMiddlewaresByAgentStmt != nil {
if cerr := q.listTcpMiddlewaresByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listTcpMiddlewaresByAgentStmt: %w", cerr)
}
}
if q.listTcpMiddlewaresEnabledStmt != nil {
if cerr := q.listTcpMiddlewaresEnabledStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listTcpMiddlewaresEnabledStmt: %w", cerr)
@@ -1393,11 +1146,6 @@ func (q *Queries) Close() error {
err = fmt.Errorf("error closing listTcpRoutersStmt: %w", cerr)
}
}
if q.listTcpRoutersByAgentStmt != nil {
if cerr := q.listTcpRoutersByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listTcpRoutersByAgentStmt: %w", cerr)
}
}
if q.listTcpRoutersEnabledStmt != nil {
if cerr := q.listTcpRoutersEnabledStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listTcpRoutersEnabledStmt: %w", cerr)
@@ -1408,11 +1156,6 @@ func (q *Queries) Close() error {
err = fmt.Errorf("error closing listTcpServersTransportsStmt: %w", cerr)
}
}
if q.listTcpServersTransportsByAgentStmt != nil {
if cerr := q.listTcpServersTransportsByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listTcpServersTransportsByAgentStmt: %w", cerr)
}
}
if q.listTcpServersTransportsEnabledStmt != nil {
if cerr := q.listTcpServersTransportsEnabledStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listTcpServersTransportsEnabledStmt: %w", cerr)
@@ -1423,11 +1166,6 @@ func (q *Queries) Close() error {
err = fmt.Errorf("error closing listTcpServicesStmt: %w", cerr)
}
}
if q.listTcpServicesByAgentStmt != nil {
if cerr := q.listTcpServicesByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listTcpServicesByAgentStmt: %w", cerr)
}
}
if q.listTcpServicesEnabledStmt != nil {
if cerr := q.listTcpServicesEnabledStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listTcpServicesEnabledStmt: %w", cerr)
@@ -1443,11 +1181,6 @@ func (q *Queries) Close() error {
err = fmt.Errorf("error closing listUdpRoutersStmt: %w", cerr)
}
}
if q.listUdpRoutersByAgentStmt != nil {
if cerr := q.listUdpRoutersByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listUdpRoutersByAgentStmt: %w", cerr)
}
}
if q.listUdpRoutersEnabledStmt != nil {
if cerr := q.listUdpRoutersEnabledStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listUdpRoutersEnabledStmt: %w", cerr)
@@ -1458,11 +1191,6 @@ func (q *Queries) Close() error {
err = fmt.Errorf("error closing listUdpServicesStmt: %w", cerr)
}
}
if q.listUdpServicesByAgentStmt != nil {
if cerr := q.listUdpServicesByAgentStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listUdpServicesByAgentStmt: %w", cerr)
}
}
if q.listUdpServicesEnabledStmt != nil {
if cerr := q.listUdpServicesEnabledStmt.Close(); cerr != nil {
err = fmt.Errorf("error closing listUdpServicesEnabledStmt: %w", cerr)
@@ -1657,19 +1385,9 @@ type Queries struct {
countDnsProvidersStmt *sql.Stmt
countEntryPointsStmt *sql.Stmt
countHttpMiddlewaresStmt *sql.Stmt
countHttpMiddlewaresByAgentStmt *sql.Stmt
countHttpMiddlewaresByProfileStmt *sql.Stmt
countHttpRoutersStmt *sql.Stmt
countHttpRoutersByAgentStmt *sql.Stmt
countHttpRoutersByProfileStmt *sql.Stmt
countHttpServersTransportsStmt *sql.Stmt
countHttpServersTransportsByAgentStmt *sql.Stmt
countHttpServersTransportsByProfileStmt *sql.Stmt
countHttpServicesStmt *sql.Stmt
countHttpServicesByAgentStmt *sql.Stmt
countHttpServicesByProfileStmt *sql.Stmt
countMiddlewaresByAgentStmt *sql.Stmt
countMiddlewaresByProfileStmt *sql.Stmt
countProfilesStmt *sql.Stmt
countRoutersByAgentStmt *sql.Stmt
countRoutersByProfileStmt *sql.Stmt
@@ -1678,24 +1396,12 @@ type Queries struct {
countServicesByAgentStmt *sql.Stmt
countServicesByProfileStmt *sql.Stmt
countTcpMiddlewaresStmt *sql.Stmt
countTcpMiddlewaresByAgentStmt *sql.Stmt
countTcpMiddlewaresByProfileStmt *sql.Stmt
countTcpRoutersStmt *sql.Stmt
countTcpRoutersByAgentStmt *sql.Stmt
countTcpRoutersByProfileStmt *sql.Stmt
countTcpServersTransportsStmt *sql.Stmt
countTcpServersTransportsByAgentStmt *sql.Stmt
countTcpServersTransportsByProfileStmt *sql.Stmt
countTcpServicesStmt *sql.Stmt
countTcpServicesByAgentStmt *sql.Stmt
countTcpServicesByProfileStmt *sql.Stmt
countTraefikInstancesStmt *sql.Stmt
countUdpRoutersStmt *sql.Stmt
countUdpRoutersByAgentStmt *sql.Stmt
countUdpRoutersByProfileStmt *sql.Stmt
countUdpServicesStmt *sql.Stmt
countUdpServicesByAgentStmt *sql.Stmt
countUdpServicesByProfileStmt *sql.Stmt
countUsersStmt *sql.Stmt
createAgentStmt *sql.Stmt
createAuditLogStmt *sql.Stmt
@@ -1781,19 +1487,13 @@ type Queries struct {
listEntryPointsStmt *sql.Stmt
listErrorsStmt *sql.Stmt
listHttpMiddlewaresStmt *sql.Stmt
listHttpMiddlewaresByAgentStmt *sql.Stmt
listHttpMiddlewaresEnabledStmt *sql.Stmt
listHttpRoutersStmt *sql.Stmt
listHttpRoutersByAgentStmt *sql.Stmt
listHttpRoutersEnabledStmt *sql.Stmt
listHttpServersTransportsStmt *sql.Stmt
listHttpServersTransportsByAgentStmt *sql.Stmt
listHttpServersTransportsEnabledStmt *sql.Stmt
listHttpServicesStmt *sql.Stmt
listHttpServicesByAgentStmt *sql.Stmt
listHttpServicesEnabledStmt *sql.Stmt
listMiddlewaresByAgentStmt *sql.Stmt
listMiddlewaresByProfileStmt *sql.Stmt
listProfilesStmt *sql.Stmt
listRoutersByAgentStmt *sql.Stmt
listRoutersByProfileStmt *sql.Stmt
@@ -1803,23 +1503,17 @@ type Queries struct {
listServicesByProfileStmt *sql.Stmt
listSettingsStmt *sql.Stmt
listTcpMiddlewaresStmt *sql.Stmt
listTcpMiddlewaresByAgentStmt *sql.Stmt
listTcpMiddlewaresEnabledStmt *sql.Stmt
listTcpRoutersStmt *sql.Stmt
listTcpRoutersByAgentStmt *sql.Stmt
listTcpRoutersEnabledStmt *sql.Stmt
listTcpServersTransportsStmt *sql.Stmt
listTcpServersTransportsByAgentStmt *sql.Stmt
listTcpServersTransportsEnabledStmt *sql.Stmt
listTcpServicesStmt *sql.Stmt
listTcpServicesByAgentStmt *sql.Stmt
listTcpServicesEnabledStmt *sql.Stmt
listTraefikInstancesStmt *sql.Stmt
listUdpRoutersStmt *sql.Stmt
listUdpRoutersByAgentStmt *sql.Stmt
listUdpRoutersEnabledStmt *sql.Stmt
listUdpServicesStmt *sql.Stmt
listUdpServicesByAgentStmt *sql.Stmt
listUdpServicesEnabledStmt *sql.Stmt
listUsersStmt *sql.Stmt
logErrorStmt *sql.Stmt
@@ -1861,19 +1555,9 @@ func (q *Queries) WithTx(tx *sql.Tx) *Queries {
countDnsProvidersStmt: q.countDnsProvidersStmt,
countEntryPointsStmt: q.countEntryPointsStmt,
countHttpMiddlewaresStmt: q.countHttpMiddlewaresStmt,
countHttpMiddlewaresByAgentStmt: q.countHttpMiddlewaresByAgentStmt,
countHttpMiddlewaresByProfileStmt: q.countHttpMiddlewaresByProfileStmt,
countHttpRoutersStmt: q.countHttpRoutersStmt,
countHttpRoutersByAgentStmt: q.countHttpRoutersByAgentStmt,
countHttpRoutersByProfileStmt: q.countHttpRoutersByProfileStmt,
countHttpServersTransportsStmt: q.countHttpServersTransportsStmt,
countHttpServersTransportsByAgentStmt: q.countHttpServersTransportsByAgentStmt,
countHttpServersTransportsByProfileStmt: q.countHttpServersTransportsByProfileStmt,
countHttpServicesStmt: q.countHttpServicesStmt,
countHttpServicesByAgentStmt: q.countHttpServicesByAgentStmt,
countHttpServicesByProfileStmt: q.countHttpServicesByProfileStmt,
countMiddlewaresByAgentStmt: q.countMiddlewaresByAgentStmt,
countMiddlewaresByProfileStmt: q.countMiddlewaresByProfileStmt,
countProfilesStmt: q.countProfilesStmt,
countRoutersByAgentStmt: q.countRoutersByAgentStmt,
countRoutersByProfileStmt: q.countRoutersByProfileStmt,
@@ -1882,24 +1566,12 @@ func (q *Queries) WithTx(tx *sql.Tx) *Queries {
countServicesByAgentStmt: q.countServicesByAgentStmt,
countServicesByProfileStmt: q.countServicesByProfileStmt,
countTcpMiddlewaresStmt: q.countTcpMiddlewaresStmt,
countTcpMiddlewaresByAgentStmt: q.countTcpMiddlewaresByAgentStmt,
countTcpMiddlewaresByProfileStmt: q.countTcpMiddlewaresByProfileStmt,
countTcpRoutersStmt: q.countTcpRoutersStmt,
countTcpRoutersByAgentStmt: q.countTcpRoutersByAgentStmt,
countTcpRoutersByProfileStmt: q.countTcpRoutersByProfileStmt,
countTcpServersTransportsStmt: q.countTcpServersTransportsStmt,
countTcpServersTransportsByAgentStmt: q.countTcpServersTransportsByAgentStmt,
countTcpServersTransportsByProfileStmt: q.countTcpServersTransportsByProfileStmt,
countTcpServicesStmt: q.countTcpServicesStmt,
countTcpServicesByAgentStmt: q.countTcpServicesByAgentStmt,
countTcpServicesByProfileStmt: q.countTcpServicesByProfileStmt,
countTraefikInstancesStmt: q.countTraefikInstancesStmt,
countUdpRoutersStmt: q.countUdpRoutersStmt,
countUdpRoutersByAgentStmt: q.countUdpRoutersByAgentStmt,
countUdpRoutersByProfileStmt: q.countUdpRoutersByProfileStmt,
countUdpServicesStmt: q.countUdpServicesStmt,
countUdpServicesByAgentStmt: q.countUdpServicesByAgentStmt,
countUdpServicesByProfileStmt: q.countUdpServicesByProfileStmt,
countUsersStmt: q.countUsersStmt,
createAgentStmt: q.createAgentStmt,
createAuditLogStmt: q.createAuditLogStmt,
@@ -1985,19 +1657,13 @@ func (q *Queries) WithTx(tx *sql.Tx) *Queries {
listEntryPointsStmt: q.listEntryPointsStmt,
listErrorsStmt: q.listErrorsStmt,
listHttpMiddlewaresStmt: q.listHttpMiddlewaresStmt,
listHttpMiddlewaresByAgentStmt: q.listHttpMiddlewaresByAgentStmt,
listHttpMiddlewaresEnabledStmt: q.listHttpMiddlewaresEnabledStmt,
listHttpRoutersStmt: q.listHttpRoutersStmt,
listHttpRoutersByAgentStmt: q.listHttpRoutersByAgentStmt,
listHttpRoutersEnabledStmt: q.listHttpRoutersEnabledStmt,
listHttpServersTransportsStmt: q.listHttpServersTransportsStmt,
listHttpServersTransportsByAgentStmt: q.listHttpServersTransportsByAgentStmt,
listHttpServersTransportsEnabledStmt: q.listHttpServersTransportsEnabledStmt,
listHttpServicesStmt: q.listHttpServicesStmt,
listHttpServicesByAgentStmt: q.listHttpServicesByAgentStmt,
listHttpServicesEnabledStmt: q.listHttpServicesEnabledStmt,
listMiddlewaresByAgentStmt: q.listMiddlewaresByAgentStmt,
listMiddlewaresByProfileStmt: q.listMiddlewaresByProfileStmt,
listProfilesStmt: q.listProfilesStmt,
listRoutersByAgentStmt: q.listRoutersByAgentStmt,
listRoutersByProfileStmt: q.listRoutersByProfileStmt,
@@ -2007,23 +1673,17 @@ func (q *Queries) WithTx(tx *sql.Tx) *Queries {
listServicesByProfileStmt: q.listServicesByProfileStmt,
listSettingsStmt: q.listSettingsStmt,
listTcpMiddlewaresStmt: q.listTcpMiddlewaresStmt,
listTcpMiddlewaresByAgentStmt: q.listTcpMiddlewaresByAgentStmt,
listTcpMiddlewaresEnabledStmt: q.listTcpMiddlewaresEnabledStmt,
listTcpRoutersStmt: q.listTcpRoutersStmt,
listTcpRoutersByAgentStmt: q.listTcpRoutersByAgentStmt,
listTcpRoutersEnabledStmt: q.listTcpRoutersEnabledStmt,
listTcpServersTransportsStmt: q.listTcpServersTransportsStmt,
listTcpServersTransportsByAgentStmt: q.listTcpServersTransportsByAgentStmt,
listTcpServersTransportsEnabledStmt: q.listTcpServersTransportsEnabledStmt,
listTcpServicesStmt: q.listTcpServicesStmt,
listTcpServicesByAgentStmt: q.listTcpServicesByAgentStmt,
listTcpServicesEnabledStmt: q.listTcpServicesEnabledStmt,
listTraefikInstancesStmt: q.listTraefikInstancesStmt,
listUdpRoutersStmt: q.listUdpRoutersStmt,
listUdpRoutersByAgentStmt: q.listUdpRoutersByAgentStmt,
listUdpRoutersEnabledStmt: q.listUdpRoutersEnabledStmt,
listUdpServicesStmt: q.listUdpServicesStmt,
listUdpServicesByAgentStmt: q.listUdpServicesByAgentStmt,
listUdpServicesEnabledStmt: q.listUdpServicesEnabledStmt,
listUsersStmt: q.listUsersStmt,
logErrorStmt: q.logErrorStmt,

View File

@@ -157,20 +157,20 @@ SELECT
FROM
dns_providers
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(?2 AS INTEGER), -1)
OFFSET
?
COALESCE(CAST(?1 AS INTEGER), 0)
`
type ListDnsProvidersParams struct {
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
Offset *int64 `json:"offset"`
Limit *int64 `json:"limit"`
}
func (q *Queries) ListDnsProviders(ctx context.Context, arg ListDnsProvidersParams) ([]DnsProvider, error) {
rows, err := q.query(ctx, q.listDnsProvidersStmt, listDnsProviders, arg.Limit, arg.Offset)
rows, err := q.query(ctx, q.listDnsProvidersStmt, listDnsProviders, arg.Offset, arg.Limit)
if err != nil {
return nil, err
}

View File

@@ -14,10 +14,12 @@ SELECT
COUNT(*)
FROM
entry_points
WHERE
profile_id = ?
`
func (q *Queries) CountEntryPoints(ctx context.Context) (int64, error) {
row := q.queryRow(ctx, q.countEntryPointsStmt, countEntryPoints)
func (q *Queries) CountEntryPoints(ctx context.Context, profileID int64) (int64, error) {
row := q.queryRow(ctx, q.countEntryPointsStmt, countEntryPoints, profileID)
var count int64
err := row.Scan(&count)
return count, err
@@ -131,23 +133,23 @@ SELECT
FROM
entry_points
WHERE
profile_id = ?
profile_id = ?1
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(?3 AS INTEGER), -1)
OFFSET
?
COALESCE(CAST(?2 AS INTEGER), 0)
`
type ListEntryPointsParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
Offset *int64 `json:"offset"`
Limit *int64 `json:"limit"`
}
func (q *Queries) ListEntryPoints(ctx context.Context, arg ListEntryPointsParams) ([]EntryPoint, error) {
rows, err := q.query(ctx, q.listEntryPointsStmt, listEntryPoints, arg.ProfileID, arg.Limit, arg.Offset)
rows, err := q.query(ctx, q.listEntryPointsStmt, listEntryPoints, arg.ProfileID, arg.Offset, arg.Limit)
if err != nil {
return nil, err
}

View File

@@ -16,42 +16,21 @@ SELECT
COUNT(*)
FROM
http_middlewares
WHERE
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
`
func (q *Queries) CountHttpMiddlewares(ctx context.Context) (int64, error) {
row := q.queryRow(ctx, q.countHttpMiddlewaresStmt, countHttpMiddlewares)
var count int64
err := row.Scan(&count)
return count, err
type CountHttpMiddlewaresParams struct {
ProfileID int64 `json:"profileId"`
AgentID *string `json:"agentId"`
}
const countHttpMiddlewaresByAgent = `-- name: CountHttpMiddlewaresByAgent :one
SELECT
COUNT(*)
FROM
http_middlewares
WHERE
agent_id = ?
`
func (q *Queries) CountHttpMiddlewaresByAgent(ctx context.Context, agentID *string) (int64, error) {
row := q.queryRow(ctx, q.countHttpMiddlewaresByAgentStmt, countHttpMiddlewaresByAgent, agentID)
var count int64
err := row.Scan(&count)
return count, err
}
const countHttpMiddlewaresByProfile = `-- name: CountHttpMiddlewaresByProfile :one
SELECT
COUNT(*)
FROM
http_middlewares
WHERE
profile_id = ?
`
func (q *Queries) CountHttpMiddlewaresByProfile(ctx context.Context, profileID int64) (int64, error) {
row := q.queryRow(ctx, q.countHttpMiddlewaresByProfileStmt, countHttpMiddlewaresByProfile, profileID)
func (q *Queries) CountHttpMiddlewares(ctx context.Context, arg CountHttpMiddlewaresParams) (int64, error) {
row := q.queryRow(ctx, q.countHttpMiddlewaresStmt, countHttpMiddlewares, arg.ProfileID, arg.AgentID)
var count int64
err := row.Scan(&count)
return count, err
@@ -154,77 +133,33 @@ SELECT
FROM
http_middlewares
WHERE
profile_id = ?
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(?4 AS INTEGER), -1)
OFFSET
?
COALESCE(CAST(?3 AS INTEGER), 0)
`
type ListHttpMiddlewaresParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
AgentID *string `json:"agentId"`
Offset *int64 `json:"offset"`
Limit *int64 `json:"limit"`
}
func (q *Queries) ListHttpMiddlewares(ctx context.Context, arg ListHttpMiddlewaresParams) ([]HttpMiddleware, error) {
rows, err := q.query(ctx, q.listHttpMiddlewaresStmt, listHttpMiddlewares, arg.ProfileID, arg.Limit, arg.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
var items []HttpMiddleware
for rows.Next() {
var i HttpMiddleware
if err := rows.Scan(
&i.ID,
&i.ProfileID,
&i.AgentID,
&i.Name,
&i.Config,
&i.Enabled,
&i.IsDefault,
&i.CreatedAt,
&i.UpdatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listHttpMiddlewaresByAgent = `-- name: ListHttpMiddlewaresByAgent :many
SELECT
id, profile_id, agent_id, name, config, enabled, is_default, created_at, updated_at
FROM
http_middlewares
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListHttpMiddlewaresByAgentParams struct {
AgentID *string `json:"agentId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListHttpMiddlewaresByAgent(ctx context.Context, arg ListHttpMiddlewaresByAgentParams) ([]HttpMiddleware, error) {
rows, err := q.query(ctx, q.listHttpMiddlewaresByAgentStmt, listHttpMiddlewaresByAgent, arg.AgentID, arg.Limit, arg.Offset)
rows, err := q.query(ctx, q.listHttpMiddlewaresStmt, listHttpMiddlewares,
arg.ProfileID,
arg.AgentID,
arg.Offset,
arg.Limit,
)
if err != nil {
return nil, err
}
@@ -264,22 +199,10 @@ FROM
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListHttpMiddlewaresEnabledParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListHttpMiddlewaresEnabled(ctx context.Context, arg ListHttpMiddlewaresEnabledParams) ([]HttpMiddleware, error) {
rows, err := q.query(ctx, q.listHttpMiddlewaresEnabledStmt, listHttpMiddlewaresEnabled, arg.ProfileID, arg.Limit, arg.Offset)
func (q *Queries) ListHttpMiddlewaresEnabled(ctx context.Context, profileID int64) ([]HttpMiddleware, error) {
rows, err := q.query(ctx, q.listHttpMiddlewaresEnabledStmt, listHttpMiddlewaresEnabled, profileID)
if err != nil {
return nil, err
}

View File

@@ -16,42 +16,21 @@ SELECT
COUNT(*)
FROM
http_routers
WHERE
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
`
func (q *Queries) CountHttpRouters(ctx context.Context) (int64, error) {
row := q.queryRow(ctx, q.countHttpRoutersStmt, countHttpRouters)
var count int64
err := row.Scan(&count)
return count, err
type CountHttpRoutersParams struct {
ProfileID int64 `json:"profileId"`
AgentID *string `json:"agentId"`
}
const countHttpRoutersByAgent = `-- name: CountHttpRoutersByAgent :one
SELECT
COUNT(*)
FROM
http_routers
WHERE
agent_id = ?
`
func (q *Queries) CountHttpRoutersByAgent(ctx context.Context, agentID *string) (int64, error) {
row := q.queryRow(ctx, q.countHttpRoutersByAgentStmt, countHttpRoutersByAgent, agentID)
var count int64
err := row.Scan(&count)
return count, err
}
const countHttpRoutersByProfile = `-- name: CountHttpRoutersByProfile :one
SELECT
COUNT(*)
FROM
http_routers
WHERE
profile_id = ?
`
func (q *Queries) CountHttpRoutersByProfile(ctx context.Context, profileID int64) (int64, error) {
row := q.queryRow(ctx, q.countHttpRoutersByProfileStmt, countHttpRoutersByProfile, profileID)
func (q *Queries) CountHttpRouters(ctx context.Context, arg CountHttpRoutersParams) (int64, error) {
row := q.queryRow(ctx, q.countHttpRoutersStmt, countHttpRouters, arg.ProfileID, arg.AgentID)
var count int64
err := row.Scan(&count)
return count, err
@@ -265,76 +244,33 @@ SELECT
FROM
http_routers
WHERE
profile_id = ?
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(?4 AS INTEGER), -1)
OFFSET
?
COALESCE(CAST(?3 AS INTEGER), 0)
`
type ListHttpRoutersParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
AgentID *string `json:"agentId"`
Offset *int64 `json:"offset"`
Limit *int64 `json:"limit"`
}
func (q *Queries) ListHttpRouters(ctx context.Context, arg ListHttpRoutersParams) ([]HttpRouter, error) {
rows, err := q.query(ctx, q.listHttpRoutersStmt, listHttpRouters, arg.ProfileID, arg.Limit, arg.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
var items []HttpRouter
for rows.Next() {
var i HttpRouter
if err := rows.Scan(
&i.ID,
&i.ProfileID,
&i.AgentID,
&i.Name,
&i.Config,
&i.Enabled,
&i.CreatedAt,
&i.UpdatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listHttpRoutersByAgent = `-- name: ListHttpRoutersByAgent :many
SELECT
id, profile_id, agent_id, name, config, enabled, created_at, updated_at
FROM
http_routers
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListHttpRoutersByAgentParams struct {
AgentID *string `json:"agentId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListHttpRoutersByAgent(ctx context.Context, arg ListHttpRoutersByAgentParams) ([]HttpRouter, error) {
rows, err := q.query(ctx, q.listHttpRoutersByAgentStmt, listHttpRoutersByAgent, arg.AgentID, arg.Limit, arg.Offset)
rows, err := q.query(ctx, q.listHttpRoutersStmt, listHttpRouters,
arg.ProfileID,
arg.AgentID,
arg.Offset,
arg.Limit,
)
if err != nil {
return nil, err
}
@@ -373,22 +309,10 @@ FROM
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListHttpRoutersEnabledParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListHttpRoutersEnabled(ctx context.Context, arg ListHttpRoutersEnabledParams) ([]HttpRouter, error) {
rows, err := q.query(ctx, q.listHttpRoutersEnabledStmt, listHttpRoutersEnabled, arg.ProfileID, arg.Limit, arg.Offset)
func (q *Queries) ListHttpRoutersEnabled(ctx context.Context, profileID int64) ([]HttpRouter, error) {
rows, err := q.query(ctx, q.listHttpRoutersEnabledStmt, listHttpRoutersEnabled, profileID)
if err != nil {
return nil, err
}

View File

@@ -16,42 +16,21 @@ SELECT
COUNT(*)
FROM
http_servers_transports
WHERE
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
`
func (q *Queries) CountHttpServersTransports(ctx context.Context) (int64, error) {
row := q.queryRow(ctx, q.countHttpServersTransportsStmt, countHttpServersTransports)
var count int64
err := row.Scan(&count)
return count, err
type CountHttpServersTransportsParams struct {
ProfileID int64 `json:"profileId"`
AgentID *string `json:"agentId"`
}
const countHttpServersTransportsByAgent = `-- name: CountHttpServersTransportsByAgent :one
SELECT
COUNT(*)
FROM
http_servers_transports
WHERE
agent_id = ?
`
func (q *Queries) CountHttpServersTransportsByAgent(ctx context.Context, agentID *string) (int64, error) {
row := q.queryRow(ctx, q.countHttpServersTransportsByAgentStmt, countHttpServersTransportsByAgent, agentID)
var count int64
err := row.Scan(&count)
return count, err
}
const countHttpServersTransportsByProfile = `-- name: CountHttpServersTransportsByProfile :one
SELECT
COUNT(*)
FROM
http_servers_transports
WHERE
profile_id = ?
`
func (q *Queries) CountHttpServersTransportsByProfile(ctx context.Context, profileID int64) (int64, error) {
row := q.queryRow(ctx, q.countHttpServersTransportsByProfileStmt, countHttpServersTransportsByProfile, profileID)
func (q *Queries) CountHttpServersTransports(ctx context.Context, arg CountHttpServersTransportsParams) (int64, error) {
row := q.queryRow(ctx, q.countHttpServersTransportsStmt, countHttpServersTransports, arg.ProfileID, arg.AgentID)
var count int64
err := row.Scan(&count)
return count, err
@@ -141,76 +120,33 @@ SELECT
FROM
http_servers_transports
WHERE
profile_id = ?
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(?4 AS INTEGER), -1)
OFFSET
?
COALESCE(CAST(?3 AS INTEGER), 0)
`
type ListHttpServersTransportsParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
AgentID *string `json:"agentId"`
Offset *int64 `json:"offset"`
Limit *int64 `json:"limit"`
}
func (q *Queries) ListHttpServersTransports(ctx context.Context, arg ListHttpServersTransportsParams) ([]HttpServersTransport, error) {
rows, err := q.query(ctx, q.listHttpServersTransportsStmt, listHttpServersTransports, arg.ProfileID, arg.Limit, arg.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
var items []HttpServersTransport
for rows.Next() {
var i HttpServersTransport
if err := rows.Scan(
&i.ID,
&i.ProfileID,
&i.AgentID,
&i.Name,
&i.Config,
&i.Enabled,
&i.CreatedAt,
&i.UpdatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listHttpServersTransportsByAgent = `-- name: ListHttpServersTransportsByAgent :many
SELECT
id, profile_id, agent_id, name, config, enabled, created_at, updated_at
FROM
http_servers_transports
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListHttpServersTransportsByAgentParams struct {
AgentID *string `json:"agentId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListHttpServersTransportsByAgent(ctx context.Context, arg ListHttpServersTransportsByAgentParams) ([]HttpServersTransport, error) {
rows, err := q.query(ctx, q.listHttpServersTransportsByAgentStmt, listHttpServersTransportsByAgent, arg.AgentID, arg.Limit, arg.Offset)
rows, err := q.query(ctx, q.listHttpServersTransportsStmt, listHttpServersTransports,
arg.ProfileID,
arg.AgentID,
arg.Offset,
arg.Limit,
)
if err != nil {
return nil, err
}
@@ -249,22 +185,10 @@ FROM
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListHttpServersTransportsEnabledParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListHttpServersTransportsEnabled(ctx context.Context, arg ListHttpServersTransportsEnabledParams) ([]HttpServersTransport, error) {
rows, err := q.query(ctx, q.listHttpServersTransportsEnabledStmt, listHttpServersTransportsEnabled, arg.ProfileID, arg.Limit, arg.Offset)
func (q *Queries) ListHttpServersTransportsEnabled(ctx context.Context, profileID int64) ([]HttpServersTransport, error) {
rows, err := q.query(ctx, q.listHttpServersTransportsEnabledStmt, listHttpServersTransportsEnabled, profileID)
if err != nil {
return nil, err
}

View File

@@ -16,42 +16,21 @@ SELECT
COUNT(*)
FROM
http_services
WHERE
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
`
func (q *Queries) CountHttpServices(ctx context.Context) (int64, error) {
row := q.queryRow(ctx, q.countHttpServicesStmt, countHttpServices)
var count int64
err := row.Scan(&count)
return count, err
type CountHttpServicesParams struct {
ProfileID int64 `json:"profileId"`
AgentID *string `json:"agentId"`
}
const countHttpServicesByAgent = `-- name: CountHttpServicesByAgent :one
SELECT
COUNT(*)
FROM
http_services
WHERE
agent_id = ?
`
func (q *Queries) CountHttpServicesByAgent(ctx context.Context, agentID *string) (int64, error) {
row := q.queryRow(ctx, q.countHttpServicesByAgentStmt, countHttpServicesByAgent, agentID)
var count int64
err := row.Scan(&count)
return count, err
}
const countHttpServicesByProfile = `-- name: CountHttpServicesByProfile :one
SELECT
COUNT(*)
FROM
http_services
WHERE
profile_id = ?
`
func (q *Queries) CountHttpServicesByProfile(ctx context.Context, profileID int64) (int64, error) {
row := q.queryRow(ctx, q.countHttpServicesByProfileStmt, countHttpServicesByProfile, profileID)
func (q *Queries) CountHttpServices(ctx context.Context, arg CountHttpServicesParams) (int64, error) {
row := q.queryRow(ctx, q.countHttpServicesStmt, countHttpServices, arg.ProfileID, arg.AgentID)
var count int64
err := row.Scan(&count)
return count, err
@@ -166,76 +145,33 @@ SELECT
FROM
http_services
WHERE
profile_id = ?
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(?4 AS INTEGER), -1)
OFFSET
?
COALESCE(CAST(?3 AS INTEGER), 0)
`
type ListHttpServicesParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
AgentID *string `json:"agentId"`
Offset *int64 `json:"offset"`
Limit *int64 `json:"limit"`
}
func (q *Queries) ListHttpServices(ctx context.Context, arg ListHttpServicesParams) ([]HttpService, error) {
rows, err := q.query(ctx, q.listHttpServicesStmt, listHttpServices, arg.ProfileID, arg.Limit, arg.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
var items []HttpService
for rows.Next() {
var i HttpService
if err := rows.Scan(
&i.ID,
&i.ProfileID,
&i.AgentID,
&i.Name,
&i.Config,
&i.Enabled,
&i.CreatedAt,
&i.UpdatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listHttpServicesByAgent = `-- name: ListHttpServicesByAgent :many
SELECT
id, profile_id, agent_id, name, config, enabled, created_at, updated_at
FROM
http_services
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListHttpServicesByAgentParams struct {
AgentID *string `json:"agentId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListHttpServicesByAgent(ctx context.Context, arg ListHttpServicesByAgentParams) ([]HttpService, error) {
rows, err := q.query(ctx, q.listHttpServicesByAgentStmt, listHttpServicesByAgent, arg.AgentID, arg.Limit, arg.Offset)
rows, err := q.query(ctx, q.listHttpServicesStmt, listHttpServices,
arg.ProfileID,
arg.AgentID,
arg.Offset,
arg.Limit,
)
if err != nil {
return nil, err
}
@@ -274,22 +210,10 @@ FROM
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListHttpServicesEnabledParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListHttpServicesEnabled(ctx context.Context, arg ListHttpServicesEnabledParams) ([]HttpService, error) {
rows, err := q.query(ctx, q.listHttpServicesEnabledStmt, listHttpServicesEnabled, arg.ProfileID, arg.Limit, arg.Offset)
func (q *Queries) ListHttpServicesEnabled(ctx context.Context, profileID int64) ([]HttpService, error) {
rows, err := q.query(ctx, q.listHttpServicesEnabledStmt, listHttpServicesEnabled, profileID)
if err != nil {
return nil, err
}

View File

@@ -1,235 +0,0 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.29.0
// source: middlewares.sql
package db
import (
"context"
"time"
"github.com/mizuchilabs/mantrae/internal/store/schema"
)
const countMiddlewaresByAgent = `-- name: CountMiddlewaresByAgent :one
SELECT
COUNT(*)
FROM
http_middlewares
WHERE
http_middlewares.agent_id = ?
UNION ALL
SELECT
COUNT(*)
FROM
tcp_middlewares
WHERE
tcp_middlewares.agent_id = ?
`
type CountMiddlewaresByAgentParams struct {
AgentID *string `json:"agentId"`
AgentID_2 *string `json:"agentId2"`
}
func (q *Queries) CountMiddlewaresByAgent(ctx context.Context, arg CountMiddlewaresByAgentParams) (int64, error) {
row := q.queryRow(ctx, q.countMiddlewaresByAgentStmt, countMiddlewaresByAgent, arg.AgentID, arg.AgentID_2)
var count int64
err := row.Scan(&count)
return count, err
}
const countMiddlewaresByProfile = `-- name: CountMiddlewaresByProfile :one
SELECT
COUNT(*)
FROM
http_middlewares
WHERE
http_middlewares.profile_id = ?
UNION ALL
SELECT
COUNT(*)
FROM
tcp_middlewares
WHERE
tcp_middlewares.profile_id = ?
`
type CountMiddlewaresByProfileParams struct {
ProfileID int64 `json:"profileId"`
ProfileID_2 int64 `json:"profileId2"`
}
func (q *Queries) CountMiddlewaresByProfile(ctx context.Context, arg CountMiddlewaresByProfileParams) (int64, error) {
row := q.queryRow(ctx, q.countMiddlewaresByProfileStmt, countMiddlewaresByProfile, arg.ProfileID, arg.ProfileID_2)
var count int64
err := row.Scan(&count)
return count, err
}
const listMiddlewaresByAgent = `-- name: ListMiddlewaresByAgent :many
SELECT
id, profile_id, agent_id, name, config, enabled, is_default, created_at, updated_at,
'http' AS type
FROM
http_middlewares
WHERE
http_middlewares.agent_id = ?
UNION ALL
SELECT
id, profile_id, agent_id, name, config, enabled, is_default, created_at, updated_at,
'tcp' AS type
FROM
tcp_middlewares
WHERE
tcp_middlewares.agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListMiddlewaresByAgentParams struct {
AgentID *string `json:"agentId"`
AgentID_2 *string `json:"agentId2"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
type ListMiddlewaresByAgentRow struct {
ID int64 `json:"id"`
ProfileID int64 `json:"profileId"`
AgentID *string `json:"agentId"`
Name string `json:"name"`
Config *schema.HTTPMiddleware `json:"config"`
Enabled bool `json:"enabled"`
IsDefault bool `json:"isDefault"`
CreatedAt *time.Time `json:"createdAt"`
UpdatedAt *time.Time `json:"updatedAt"`
Type string `json:"type"`
}
func (q *Queries) ListMiddlewaresByAgent(ctx context.Context, arg ListMiddlewaresByAgentParams) ([]ListMiddlewaresByAgentRow, error) {
rows, err := q.query(ctx, q.listMiddlewaresByAgentStmt, listMiddlewaresByAgent,
arg.AgentID,
arg.AgentID_2,
arg.Limit,
arg.Offset,
)
if err != nil {
return nil, err
}
defer rows.Close()
var items []ListMiddlewaresByAgentRow
for rows.Next() {
var i ListMiddlewaresByAgentRow
if err := rows.Scan(
&i.ID,
&i.ProfileID,
&i.AgentID,
&i.Name,
&i.Config,
&i.Enabled,
&i.IsDefault,
&i.CreatedAt,
&i.UpdatedAt,
&i.Type,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listMiddlewaresByProfile = `-- name: ListMiddlewaresByProfile :many
SELECT
id, profile_id, agent_id, name, config, enabled, is_default, created_at, updated_at,
'http' AS type
FROM
http_middlewares
WHERE
http_middlewares.profile_id = ?
UNION ALL
SELECT
id, profile_id, agent_id, name, config, enabled, is_default, created_at, updated_at,
'tcp' AS type
FROM
tcp_middlewares
WHERE
tcp_middlewares.profile_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListMiddlewaresByProfileParams struct {
ProfileID int64 `json:"profileId"`
ProfileID_2 int64 `json:"profileId2"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
type ListMiddlewaresByProfileRow struct {
ID int64 `json:"id"`
ProfileID int64 `json:"profileId"`
AgentID *string `json:"agentId"`
Name string `json:"name"`
Config *schema.HTTPMiddleware `json:"config"`
Enabled bool `json:"enabled"`
IsDefault bool `json:"isDefault"`
CreatedAt *time.Time `json:"createdAt"`
UpdatedAt *time.Time `json:"updatedAt"`
Type string `json:"type"`
}
func (q *Queries) ListMiddlewaresByProfile(ctx context.Context, arg ListMiddlewaresByProfileParams) ([]ListMiddlewaresByProfileRow, error) {
rows, err := q.query(ctx, q.listMiddlewaresByProfileStmt, listMiddlewaresByProfile,
arg.ProfileID,
arg.ProfileID_2,
arg.Limit,
arg.Offset,
)
if err != nil {
return nil, err
}
defer rows.Close()
var items []ListMiddlewaresByProfileRow
for rows.Next() {
var i ListMiddlewaresByProfileRow
if err := rows.Scan(
&i.ID,
&i.ProfileID,
&i.AgentID,
&i.Name,
&i.Config,
&i.Enabled,
&i.IsDefault,
&i.CreatedAt,
&i.UpdatedAt,
&i.Type,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}

View File

@@ -115,10 +115,10 @@ type HttpService struct {
type Profile struct {
ID int64 `json:"id"`
Name string `json:"name"`
CreatedAt *time.Time `json:"createdAt"`
UpdatedAt *time.Time `json:"updatedAt"`
Description *string `json:"description"`
Token string `json:"token"`
CreatedAt *time.Time `json:"createdAt"`
UpdatedAt *time.Time `json:"updatedAt"`
}
type Setting struct {

View File

@@ -27,7 +27,7 @@ const createProfile = `-- name: CreateProfile :one
INSERT INTO
profiles (name, description, token, created_at, updated_at)
VALUES
(?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) RETURNING id, name, created_at, updated_at, description, token
(?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) RETURNING id, name, description, token, created_at, updated_at
`
type CreateProfileParams struct {
@@ -42,10 +42,10 @@ func (q *Queries) CreateProfile(ctx context.Context, arg CreateProfileParams) (P
err := row.Scan(
&i.ID,
&i.Name,
&i.CreatedAt,
&i.UpdatedAt,
&i.Description,
&i.Token,
&i.CreatedAt,
&i.UpdatedAt,
)
return i, err
}
@@ -63,7 +63,7 @@ func (q *Queries) DeleteProfile(ctx context.Context, id int64) error {
const getProfile = `-- name: GetProfile :one
SELECT
id, name, created_at, updated_at, description, token
id, name, description, token, created_at, updated_at
FROM
profiles
WHERE
@@ -76,17 +76,17 @@ func (q *Queries) GetProfile(ctx context.Context, id int64) (Profile, error) {
err := row.Scan(
&i.ID,
&i.Name,
&i.CreatedAt,
&i.UpdatedAt,
&i.Description,
&i.Token,
&i.CreatedAt,
&i.UpdatedAt,
)
return i, err
}
const getProfileByName = `-- name: GetProfileByName :one
SELECT
id, name, created_at, updated_at, description, token
id, name, description, token, created_at, updated_at
FROM
profiles
WHERE
@@ -99,34 +99,34 @@ func (q *Queries) GetProfileByName(ctx context.Context, name string) (Profile, e
err := row.Scan(
&i.ID,
&i.Name,
&i.CreatedAt,
&i.UpdatedAt,
&i.Description,
&i.Token,
&i.CreatedAt,
&i.UpdatedAt,
)
return i, err
}
const listProfiles = `-- name: ListProfiles :many
SELECT
id, name, created_at, updated_at, description, token
id, name, description, token, created_at, updated_at
FROM
profiles
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(?2 AS INTEGER), -1)
OFFSET
?
COALESCE(CAST(?1 AS INTEGER), 0)
`
type ListProfilesParams struct {
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
Offset *int64 `json:"offset"`
Limit *int64 `json:"limit"`
}
func (q *Queries) ListProfiles(ctx context.Context, arg ListProfilesParams) ([]Profile, error) {
rows, err := q.query(ctx, q.listProfilesStmt, listProfiles, arg.Limit, arg.Offset)
rows, err := q.query(ctx, q.listProfilesStmt, listProfiles, arg.Offset, arg.Limit)
if err != nil {
return nil, err
}
@@ -137,10 +137,10 @@ func (q *Queries) ListProfiles(ctx context.Context, arg ListProfilesParams) ([]P
if err := rows.Scan(
&i.ID,
&i.Name,
&i.CreatedAt,
&i.UpdatedAt,
&i.Description,
&i.Token,
&i.CreatedAt,
&i.UpdatedAt,
); err != nil {
return nil, err
}
@@ -163,7 +163,7 @@ SET
token = ?,
updated_at = CURRENT_TIMESTAMP
WHERE
id = ? RETURNING id, name, created_at, updated_at, description, token
id = ? RETURNING id, name, description, token, created_at, updated_at
`
type UpdateProfileParams struct {
@@ -184,10 +184,10 @@ func (q *Queries) UpdateProfile(ctx context.Context, arg UpdateProfileParams) (P
err := row.Scan(
&i.ID,
&i.Name,
&i.CreatedAt,
&i.UpdatedAt,
&i.Description,
&i.Token,
&i.CreatedAt,
&i.UpdatedAt,
)
return i, err
}

View File

@@ -9,24 +9,14 @@ import (
)
type Querier interface {
CountAgents(ctx context.Context) (int64, error)
CountAgents(ctx context.Context, profileID int64) (int64, error)
CountAuditLogs(ctx context.Context) (int64, error)
CountDnsProviders(ctx context.Context) (int64, error)
CountEntryPoints(ctx context.Context) (int64, error)
CountHttpMiddlewares(ctx context.Context) (int64, error)
CountHttpMiddlewaresByAgent(ctx context.Context, agentID *string) (int64, error)
CountHttpMiddlewaresByProfile(ctx context.Context, profileID int64) (int64, error)
CountHttpRouters(ctx context.Context) (int64, error)
CountHttpRoutersByAgent(ctx context.Context, agentID *string) (int64, error)
CountHttpRoutersByProfile(ctx context.Context, profileID int64) (int64, error)
CountHttpServersTransports(ctx context.Context) (int64, error)
CountHttpServersTransportsByAgent(ctx context.Context, agentID *string) (int64, error)
CountHttpServersTransportsByProfile(ctx context.Context, profileID int64) (int64, error)
CountHttpServices(ctx context.Context) (int64, error)
CountHttpServicesByAgent(ctx context.Context, agentID *string) (int64, error)
CountHttpServicesByProfile(ctx context.Context, profileID int64) (int64, error)
CountMiddlewaresByAgent(ctx context.Context, arg CountMiddlewaresByAgentParams) (int64, error)
CountMiddlewaresByProfile(ctx context.Context, arg CountMiddlewaresByProfileParams) (int64, error)
CountEntryPoints(ctx context.Context, profileID int64) (int64, error)
CountHttpMiddlewares(ctx context.Context, arg CountHttpMiddlewaresParams) (int64, error)
CountHttpRouters(ctx context.Context, arg CountHttpRoutersParams) (int64, error)
CountHttpServersTransports(ctx context.Context, arg CountHttpServersTransportsParams) (int64, error)
CountHttpServices(ctx context.Context, arg CountHttpServicesParams) (int64, error)
CountProfiles(ctx context.Context) (int64, error)
CountRoutersByAgent(ctx context.Context, arg CountRoutersByAgentParams) (int64, error)
CountRoutersByProfile(ctx context.Context, arg CountRoutersByProfileParams) (int64, error)
@@ -34,25 +24,13 @@ type Querier interface {
CountServersTransportsByProfile(ctx context.Context, arg CountServersTransportsByProfileParams) (int64, error)
CountServicesByAgent(ctx context.Context, arg CountServicesByAgentParams) (int64, error)
CountServicesByProfile(ctx context.Context, arg CountServicesByProfileParams) (int64, error)
CountTcpMiddlewares(ctx context.Context) (int64, error)
CountTcpMiddlewaresByAgent(ctx context.Context, agentID *string) (int64, error)
CountTcpMiddlewaresByProfile(ctx context.Context, profileID int64) (int64, error)
CountTcpRouters(ctx context.Context) (int64, error)
CountTcpRoutersByAgent(ctx context.Context, agentID *string) (int64, error)
CountTcpRoutersByProfile(ctx context.Context, profileID int64) (int64, error)
CountTcpServersTransports(ctx context.Context) (int64, error)
CountTcpServersTransportsByAgent(ctx context.Context, agentID *string) (int64, error)
CountTcpServersTransportsByProfile(ctx context.Context, profileID int64) (int64, error)
CountTcpServices(ctx context.Context) (int64, error)
CountTcpServicesByAgent(ctx context.Context, agentID *string) (int64, error)
CountTcpServicesByProfile(ctx context.Context, profileID int64) (int64, error)
CountTcpMiddlewares(ctx context.Context, arg CountTcpMiddlewaresParams) (int64, error)
CountTcpRouters(ctx context.Context, arg CountTcpRoutersParams) (int64, error)
CountTcpServersTransports(ctx context.Context, arg CountTcpServersTransportsParams) (int64, error)
CountTcpServices(ctx context.Context, arg CountTcpServicesParams) (int64, error)
CountTraefikInstances(ctx context.Context) (int64, error)
CountUdpRouters(ctx context.Context) (int64, error)
CountUdpRoutersByAgent(ctx context.Context, agentID *string) (int64, error)
CountUdpRoutersByProfile(ctx context.Context, profileID int64) (int64, error)
CountUdpServices(ctx context.Context) (int64, error)
CountUdpServicesByAgent(ctx context.Context, agentID *string) (int64, error)
CountUdpServicesByProfile(ctx context.Context, profileID int64) (int64, error)
CountUdpRouters(ctx context.Context, arg CountUdpRoutersParams) (int64, error)
CountUdpServices(ctx context.Context, arg CountUdpServicesParams) (int64, error)
CountUsers(ctx context.Context) (int64, error)
CreateAgent(ctx context.Context, arg CreateAgentParams) (Agent, error)
CreateAuditLog(ctx context.Context, arg CreateAuditLogParams) error
@@ -138,19 +116,13 @@ type Querier interface {
ListEntryPoints(ctx context.Context, arg ListEntryPointsParams) ([]EntryPoint, error)
ListErrors(ctx context.Context) ([]Error, error)
ListHttpMiddlewares(ctx context.Context, arg ListHttpMiddlewaresParams) ([]HttpMiddleware, error)
ListHttpMiddlewaresByAgent(ctx context.Context, arg ListHttpMiddlewaresByAgentParams) ([]HttpMiddleware, error)
ListHttpMiddlewaresEnabled(ctx context.Context, arg ListHttpMiddlewaresEnabledParams) ([]HttpMiddleware, error)
ListHttpMiddlewaresEnabled(ctx context.Context, profileID int64) ([]HttpMiddleware, error)
ListHttpRouters(ctx context.Context, arg ListHttpRoutersParams) ([]HttpRouter, error)
ListHttpRoutersByAgent(ctx context.Context, arg ListHttpRoutersByAgentParams) ([]HttpRouter, error)
ListHttpRoutersEnabled(ctx context.Context, arg ListHttpRoutersEnabledParams) ([]HttpRouter, error)
ListHttpRoutersEnabled(ctx context.Context, profileID int64) ([]HttpRouter, error)
ListHttpServersTransports(ctx context.Context, arg ListHttpServersTransportsParams) ([]HttpServersTransport, error)
ListHttpServersTransportsByAgent(ctx context.Context, arg ListHttpServersTransportsByAgentParams) ([]HttpServersTransport, error)
ListHttpServersTransportsEnabled(ctx context.Context, arg ListHttpServersTransportsEnabledParams) ([]HttpServersTransport, error)
ListHttpServersTransportsEnabled(ctx context.Context, profileID int64) ([]HttpServersTransport, error)
ListHttpServices(ctx context.Context, arg ListHttpServicesParams) ([]HttpService, error)
ListHttpServicesByAgent(ctx context.Context, arg ListHttpServicesByAgentParams) ([]HttpService, error)
ListHttpServicesEnabled(ctx context.Context, arg ListHttpServicesEnabledParams) ([]HttpService, error)
ListMiddlewaresByAgent(ctx context.Context, arg ListMiddlewaresByAgentParams) ([]ListMiddlewaresByAgentRow, error)
ListMiddlewaresByProfile(ctx context.Context, arg ListMiddlewaresByProfileParams) ([]ListMiddlewaresByProfileRow, error)
ListHttpServicesEnabled(ctx context.Context, profileID int64) ([]HttpService, error)
ListProfiles(ctx context.Context, arg ListProfilesParams) ([]Profile, error)
ListRoutersByAgent(ctx context.Context, arg ListRoutersByAgentParams) ([]ListRoutersByAgentRow, error)
ListRoutersByProfile(ctx context.Context, arg ListRoutersByProfileParams) ([]ListRoutersByProfileRow, error)
@@ -160,24 +132,18 @@ type Querier interface {
ListServicesByProfile(ctx context.Context, arg ListServicesByProfileParams) ([]ListServicesByProfileRow, error)
ListSettings(ctx context.Context) ([]Setting, error)
ListTcpMiddlewares(ctx context.Context, arg ListTcpMiddlewaresParams) ([]TcpMiddleware, error)
ListTcpMiddlewaresByAgent(ctx context.Context, arg ListTcpMiddlewaresByAgentParams) ([]TcpMiddleware, error)
ListTcpMiddlewaresEnabled(ctx context.Context, arg ListTcpMiddlewaresEnabledParams) ([]TcpMiddleware, error)
ListTcpMiddlewaresEnabled(ctx context.Context, profileID int64) ([]TcpMiddleware, error)
ListTcpRouters(ctx context.Context, arg ListTcpRoutersParams) ([]TcpRouter, error)
ListTcpRoutersByAgent(ctx context.Context, arg ListTcpRoutersByAgentParams) ([]TcpRouter, error)
ListTcpRoutersEnabled(ctx context.Context, arg ListTcpRoutersEnabledParams) ([]TcpRouter, error)
ListTcpRoutersEnabled(ctx context.Context, profileID int64) ([]TcpRouter, error)
ListTcpServersTransports(ctx context.Context, arg ListTcpServersTransportsParams) ([]TcpServersTransport, error)
ListTcpServersTransportsByAgent(ctx context.Context, arg ListTcpServersTransportsByAgentParams) ([]TcpServersTransport, error)
ListTcpServersTransportsEnabled(ctx context.Context, arg ListTcpServersTransportsEnabledParams) ([]TcpServersTransport, error)
ListTcpServersTransportsEnabled(ctx context.Context, profileID int64) ([]TcpServersTransport, error)
ListTcpServices(ctx context.Context, arg ListTcpServicesParams) ([]TcpService, error)
ListTcpServicesByAgent(ctx context.Context, arg ListTcpServicesByAgentParams) ([]TcpService, error)
ListTcpServicesEnabled(ctx context.Context, arg ListTcpServicesEnabledParams) ([]TcpService, error)
ListTcpServicesEnabled(ctx context.Context, profileID int64) ([]TcpService, error)
ListTraefikInstances(ctx context.Context, arg ListTraefikInstancesParams) ([]TraefikInstance, error)
ListUdpRouters(ctx context.Context, arg ListUdpRoutersParams) ([]UdpRouter, error)
ListUdpRoutersByAgent(ctx context.Context, arg ListUdpRoutersByAgentParams) ([]UdpRouter, error)
ListUdpRoutersEnabled(ctx context.Context, arg ListUdpRoutersEnabledParams) ([]UdpRouter, error)
ListUdpRoutersEnabled(ctx context.Context, profileID int64) ([]UdpRouter, error)
ListUdpServices(ctx context.Context, arg ListUdpServicesParams) ([]UdpService, error)
ListUdpServicesByAgent(ctx context.Context, arg ListUdpServicesByAgentParams) ([]UdpService, error)
ListUdpServicesEnabled(ctx context.Context, arg ListUdpServicesEnabledParams) ([]UdpService, error)
ListUdpServicesEnabled(ctx context.Context, profileID int64) ([]UdpService, error)
ListUsers(ctx context.Context, arg ListUsersParams) ([]User, error)
LogError(ctx context.Context, arg LogErrorParams) error
PurgeTraefikInstances(ctx context.Context) error

View File

@@ -16,42 +16,21 @@ SELECT
COUNT(*)
FROM
tcp_middlewares
WHERE
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
`
func (q *Queries) CountTcpMiddlewares(ctx context.Context) (int64, error) {
row := q.queryRow(ctx, q.countTcpMiddlewaresStmt, countTcpMiddlewares)
var count int64
err := row.Scan(&count)
return count, err
type CountTcpMiddlewaresParams struct {
ProfileID int64 `json:"profileId"`
AgentID *string `json:"agentId"`
}
const countTcpMiddlewaresByAgent = `-- name: CountTcpMiddlewaresByAgent :one
SELECT
COUNT(*)
FROM
tcp_middlewares
WHERE
agent_id = ?
`
func (q *Queries) CountTcpMiddlewaresByAgent(ctx context.Context, agentID *string) (int64, error) {
row := q.queryRow(ctx, q.countTcpMiddlewaresByAgentStmt, countTcpMiddlewaresByAgent, agentID)
var count int64
err := row.Scan(&count)
return count, err
}
const countTcpMiddlewaresByProfile = `-- name: CountTcpMiddlewaresByProfile :one
SELECT
COUNT(*)
FROM
tcp_middlewares
WHERE
profile_id = ?
`
func (q *Queries) CountTcpMiddlewaresByProfile(ctx context.Context, profileID int64) (int64, error) {
row := q.queryRow(ctx, q.countTcpMiddlewaresByProfileStmt, countTcpMiddlewaresByProfile, profileID)
func (q *Queries) CountTcpMiddlewares(ctx context.Context, arg CountTcpMiddlewaresParams) (int64, error) {
row := q.queryRow(ctx, q.countTcpMiddlewaresStmt, countTcpMiddlewares, arg.ProfileID, arg.AgentID)
var count int64
err := row.Scan(&count)
return count, err
@@ -154,77 +133,33 @@ SELECT
FROM
tcp_middlewares
WHERE
profile_id = ?
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(?4 AS INTEGER), -1)
OFFSET
?
COALESCE(CAST(?3 AS INTEGER), 0)
`
type ListTcpMiddlewaresParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
AgentID *string `json:"agentId"`
Offset *int64 `json:"offset"`
Limit *int64 `json:"limit"`
}
func (q *Queries) ListTcpMiddlewares(ctx context.Context, arg ListTcpMiddlewaresParams) ([]TcpMiddleware, error) {
rows, err := q.query(ctx, q.listTcpMiddlewaresStmt, listTcpMiddlewares, arg.ProfileID, arg.Limit, arg.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
var items []TcpMiddleware
for rows.Next() {
var i TcpMiddleware
if err := rows.Scan(
&i.ID,
&i.ProfileID,
&i.AgentID,
&i.Name,
&i.Config,
&i.Enabled,
&i.IsDefault,
&i.CreatedAt,
&i.UpdatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listTcpMiddlewaresByAgent = `-- name: ListTcpMiddlewaresByAgent :many
SELECT
id, profile_id, agent_id, name, config, enabled, is_default, created_at, updated_at
FROM
tcp_middlewares
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListTcpMiddlewaresByAgentParams struct {
AgentID *string `json:"agentId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListTcpMiddlewaresByAgent(ctx context.Context, arg ListTcpMiddlewaresByAgentParams) ([]TcpMiddleware, error) {
rows, err := q.query(ctx, q.listTcpMiddlewaresByAgentStmt, listTcpMiddlewaresByAgent, arg.AgentID, arg.Limit, arg.Offset)
rows, err := q.query(ctx, q.listTcpMiddlewaresStmt, listTcpMiddlewares,
arg.ProfileID,
arg.AgentID,
arg.Offset,
arg.Limit,
)
if err != nil {
return nil, err
}
@@ -264,22 +199,10 @@ FROM
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListTcpMiddlewaresEnabledParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListTcpMiddlewaresEnabled(ctx context.Context, arg ListTcpMiddlewaresEnabledParams) ([]TcpMiddleware, error) {
rows, err := q.query(ctx, q.listTcpMiddlewaresEnabledStmt, listTcpMiddlewaresEnabled, arg.ProfileID, arg.Limit, arg.Offset)
func (q *Queries) ListTcpMiddlewaresEnabled(ctx context.Context, profileID int64) ([]TcpMiddleware, error) {
rows, err := q.query(ctx, q.listTcpMiddlewaresEnabledStmt, listTcpMiddlewaresEnabled, profileID)
if err != nil {
return nil, err
}

View File

@@ -16,42 +16,21 @@ SELECT
COUNT(*)
FROM
tcp_routers
WHERE
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
`
func (q *Queries) CountTcpRouters(ctx context.Context) (int64, error) {
row := q.queryRow(ctx, q.countTcpRoutersStmt, countTcpRouters)
var count int64
err := row.Scan(&count)
return count, err
type CountTcpRoutersParams struct {
ProfileID int64 `json:"profileId"`
AgentID *string `json:"agentId"`
}
const countTcpRoutersByAgent = `-- name: CountTcpRoutersByAgent :one
SELECT
COUNT(*)
FROM
tcp_routers
WHERE
agent_id = ?
`
func (q *Queries) CountTcpRoutersByAgent(ctx context.Context, agentID *string) (int64, error) {
row := q.queryRow(ctx, q.countTcpRoutersByAgentStmt, countTcpRoutersByAgent, agentID)
var count int64
err := row.Scan(&count)
return count, err
}
const countTcpRoutersByProfile = `-- name: CountTcpRoutersByProfile :one
SELECT
COUNT(*)
FROM
tcp_routers
WHERE
profile_id = ?
`
func (q *Queries) CountTcpRoutersByProfile(ctx context.Context, profileID int64) (int64, error) {
row := q.queryRow(ctx, q.countTcpRoutersByProfileStmt, countTcpRoutersByProfile, profileID)
func (q *Queries) CountTcpRouters(ctx context.Context, arg CountTcpRoutersParams) (int64, error) {
row := q.queryRow(ctx, q.countTcpRoutersStmt, countTcpRouters, arg.ProfileID, arg.AgentID)
var count int64
err := row.Scan(&count)
return count, err
@@ -265,76 +244,33 @@ SELECT
FROM
tcp_routers
WHERE
profile_id = ?
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(?4 AS INTEGER), -1)
OFFSET
?
COALESCE(CAST(?3 AS INTEGER), 0)
`
type ListTcpRoutersParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
AgentID *string `json:"agentId"`
Offset *int64 `json:"offset"`
Limit *int64 `json:"limit"`
}
func (q *Queries) ListTcpRouters(ctx context.Context, arg ListTcpRoutersParams) ([]TcpRouter, error) {
rows, err := q.query(ctx, q.listTcpRoutersStmt, listTcpRouters, arg.ProfileID, arg.Limit, arg.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
var items []TcpRouter
for rows.Next() {
var i TcpRouter
if err := rows.Scan(
&i.ID,
&i.ProfileID,
&i.AgentID,
&i.Name,
&i.Config,
&i.Enabled,
&i.CreatedAt,
&i.UpdatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listTcpRoutersByAgent = `-- name: ListTcpRoutersByAgent :many
SELECT
id, profile_id, agent_id, name, config, enabled, created_at, updated_at
FROM
tcp_routers
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListTcpRoutersByAgentParams struct {
AgentID *string `json:"agentId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListTcpRoutersByAgent(ctx context.Context, arg ListTcpRoutersByAgentParams) ([]TcpRouter, error) {
rows, err := q.query(ctx, q.listTcpRoutersByAgentStmt, listTcpRoutersByAgent, arg.AgentID, arg.Limit, arg.Offset)
rows, err := q.query(ctx, q.listTcpRoutersStmt, listTcpRouters,
arg.ProfileID,
arg.AgentID,
arg.Offset,
arg.Limit,
)
if err != nil {
return nil, err
}
@@ -373,22 +309,10 @@ FROM
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListTcpRoutersEnabledParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListTcpRoutersEnabled(ctx context.Context, arg ListTcpRoutersEnabledParams) ([]TcpRouter, error) {
rows, err := q.query(ctx, q.listTcpRoutersEnabledStmt, listTcpRoutersEnabled, arg.ProfileID, arg.Limit, arg.Offset)
func (q *Queries) ListTcpRoutersEnabled(ctx context.Context, profileID int64) ([]TcpRouter, error) {
rows, err := q.query(ctx, q.listTcpRoutersEnabledStmt, listTcpRoutersEnabled, profileID)
if err != nil {
return nil, err
}

View File

@@ -16,42 +16,21 @@ SELECT
COUNT(*)
FROM
tcp_servers_transports
WHERE
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
`
func (q *Queries) CountTcpServersTransports(ctx context.Context) (int64, error) {
row := q.queryRow(ctx, q.countTcpServersTransportsStmt, countTcpServersTransports)
var count int64
err := row.Scan(&count)
return count, err
type CountTcpServersTransportsParams struct {
ProfileID int64 `json:"profileId"`
AgentID *string `json:"agentId"`
}
const countTcpServersTransportsByAgent = `-- name: CountTcpServersTransportsByAgent :one
SELECT
COUNT(*)
FROM
tcp_servers_transports
WHERE
agent_id = ?
`
func (q *Queries) CountTcpServersTransportsByAgent(ctx context.Context, agentID *string) (int64, error) {
row := q.queryRow(ctx, q.countTcpServersTransportsByAgentStmt, countTcpServersTransportsByAgent, agentID)
var count int64
err := row.Scan(&count)
return count, err
}
const countTcpServersTransportsByProfile = `-- name: CountTcpServersTransportsByProfile :one
SELECT
COUNT(*)
FROM
tcp_servers_transports
WHERE
profile_id = ?
`
func (q *Queries) CountTcpServersTransportsByProfile(ctx context.Context, profileID int64) (int64, error) {
row := q.queryRow(ctx, q.countTcpServersTransportsByProfileStmt, countTcpServersTransportsByProfile, profileID)
func (q *Queries) CountTcpServersTransports(ctx context.Context, arg CountTcpServersTransportsParams) (int64, error) {
row := q.queryRow(ctx, q.countTcpServersTransportsStmt, countTcpServersTransports, arg.ProfileID, arg.AgentID)
var count int64
err := row.Scan(&count)
return count, err
@@ -141,76 +120,33 @@ SELECT
FROM
tcp_servers_transports
WHERE
profile_id = ?
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(?4 AS INTEGER), -1)
OFFSET
?
COALESCE(CAST(?3 AS INTEGER), 0)
`
type ListTcpServersTransportsParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
AgentID *string `json:"agentId"`
Offset *int64 `json:"offset"`
Limit *int64 `json:"limit"`
}
func (q *Queries) ListTcpServersTransports(ctx context.Context, arg ListTcpServersTransportsParams) ([]TcpServersTransport, error) {
rows, err := q.query(ctx, q.listTcpServersTransportsStmt, listTcpServersTransports, arg.ProfileID, arg.Limit, arg.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
var items []TcpServersTransport
for rows.Next() {
var i TcpServersTransport
if err := rows.Scan(
&i.ID,
&i.ProfileID,
&i.AgentID,
&i.Name,
&i.Config,
&i.Enabled,
&i.CreatedAt,
&i.UpdatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listTcpServersTransportsByAgent = `-- name: ListTcpServersTransportsByAgent :many
SELECT
id, profile_id, agent_id, name, config, enabled, created_at, updated_at
FROM
tcp_servers_transports
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListTcpServersTransportsByAgentParams struct {
AgentID *string `json:"agentId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListTcpServersTransportsByAgent(ctx context.Context, arg ListTcpServersTransportsByAgentParams) ([]TcpServersTransport, error) {
rows, err := q.query(ctx, q.listTcpServersTransportsByAgentStmt, listTcpServersTransportsByAgent, arg.AgentID, arg.Limit, arg.Offset)
rows, err := q.query(ctx, q.listTcpServersTransportsStmt, listTcpServersTransports,
arg.ProfileID,
arg.AgentID,
arg.Offset,
arg.Limit,
)
if err != nil {
return nil, err
}
@@ -249,22 +185,10 @@ FROM
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListTcpServersTransportsEnabledParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListTcpServersTransportsEnabled(ctx context.Context, arg ListTcpServersTransportsEnabledParams) ([]TcpServersTransport, error) {
rows, err := q.query(ctx, q.listTcpServersTransportsEnabledStmt, listTcpServersTransportsEnabled, arg.ProfileID, arg.Limit, arg.Offset)
func (q *Queries) ListTcpServersTransportsEnabled(ctx context.Context, profileID int64) ([]TcpServersTransport, error) {
rows, err := q.query(ctx, q.listTcpServersTransportsEnabledStmt, listTcpServersTransportsEnabled, profileID)
if err != nil {
return nil, err
}

View File

@@ -16,42 +16,21 @@ SELECT
COUNT(*)
FROM
tcp_services
WHERE
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
`
func (q *Queries) CountTcpServices(ctx context.Context) (int64, error) {
row := q.queryRow(ctx, q.countTcpServicesStmt, countTcpServices)
var count int64
err := row.Scan(&count)
return count, err
type CountTcpServicesParams struct {
ProfileID int64 `json:"profileId"`
AgentID *string `json:"agentId"`
}
const countTcpServicesByAgent = `-- name: CountTcpServicesByAgent :one
SELECT
COUNT(*)
FROM
tcp_services
WHERE
agent_id = ?
`
func (q *Queries) CountTcpServicesByAgent(ctx context.Context, agentID *string) (int64, error) {
row := q.queryRow(ctx, q.countTcpServicesByAgentStmt, countTcpServicesByAgent, agentID)
var count int64
err := row.Scan(&count)
return count, err
}
const countTcpServicesByProfile = `-- name: CountTcpServicesByProfile :one
SELECT
COUNT(*)
FROM
tcp_services
WHERE
profile_id = ?
`
func (q *Queries) CountTcpServicesByProfile(ctx context.Context, profileID int64) (int64, error) {
row := q.queryRow(ctx, q.countTcpServicesByProfileStmt, countTcpServicesByProfile, profileID)
func (q *Queries) CountTcpServices(ctx context.Context, arg CountTcpServicesParams) (int64, error) {
row := q.queryRow(ctx, q.countTcpServicesStmt, countTcpServices, arg.ProfileID, arg.AgentID)
var count int64
err := row.Scan(&count)
return count, err
@@ -166,76 +145,33 @@ SELECT
FROM
tcp_services
WHERE
profile_id = ?
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(?4 AS INTEGER), -1)
OFFSET
?
COALESCE(CAST(?3 AS INTEGER), 0)
`
type ListTcpServicesParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
AgentID *string `json:"agentId"`
Offset *int64 `json:"offset"`
Limit *int64 `json:"limit"`
}
func (q *Queries) ListTcpServices(ctx context.Context, arg ListTcpServicesParams) ([]TcpService, error) {
rows, err := q.query(ctx, q.listTcpServicesStmt, listTcpServices, arg.ProfileID, arg.Limit, arg.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
var items []TcpService
for rows.Next() {
var i TcpService
if err := rows.Scan(
&i.ID,
&i.ProfileID,
&i.AgentID,
&i.Name,
&i.Config,
&i.Enabled,
&i.CreatedAt,
&i.UpdatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listTcpServicesByAgent = `-- name: ListTcpServicesByAgent :many
SELECT
id, profile_id, agent_id, name, config, enabled, created_at, updated_at
FROM
tcp_services
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListTcpServicesByAgentParams struct {
AgentID *string `json:"agentId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListTcpServicesByAgent(ctx context.Context, arg ListTcpServicesByAgentParams) ([]TcpService, error) {
rows, err := q.query(ctx, q.listTcpServicesByAgentStmt, listTcpServicesByAgent, arg.AgentID, arg.Limit, arg.Offset)
rows, err := q.query(ctx, q.listTcpServicesStmt, listTcpServices,
arg.ProfileID,
arg.AgentID,
arg.Offset,
arg.Limit,
)
if err != nil {
return nil, err
}
@@ -274,22 +210,10 @@ FROM
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListTcpServicesEnabledParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListTcpServicesEnabled(ctx context.Context, arg ListTcpServicesEnabledParams) ([]TcpService, error) {
rows, err := q.query(ctx, q.listTcpServicesEnabledStmt, listTcpServicesEnabled, arg.ProfileID, arg.Limit, arg.Offset)
func (q *Queries) ListTcpServicesEnabled(ctx context.Context, profileID int64) ([]TcpService, error) {
rows, err := q.query(ctx, q.listTcpServicesEnabledStmt, listTcpServicesEnabled, profileID)
if err != nil {
return nil, err
}

View File

@@ -16,42 +16,21 @@ SELECT
COUNT(*)
FROM
udp_routers
WHERE
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
`
func (q *Queries) CountUdpRouters(ctx context.Context) (int64, error) {
row := q.queryRow(ctx, q.countUdpRoutersStmt, countUdpRouters)
var count int64
err := row.Scan(&count)
return count, err
type CountUdpRoutersParams struct {
ProfileID int64 `json:"profileId"`
AgentID *string `json:"agentId"`
}
const countUdpRoutersByAgent = `-- name: CountUdpRoutersByAgent :one
SELECT
COUNT(*)
FROM
udp_routers
WHERE
agent_id = ?
`
func (q *Queries) CountUdpRoutersByAgent(ctx context.Context, agentID *string) (int64, error) {
row := q.queryRow(ctx, q.countUdpRoutersByAgentStmt, countUdpRoutersByAgent, agentID)
var count int64
err := row.Scan(&count)
return count, err
}
const countUdpRoutersByProfile = `-- name: CountUdpRoutersByProfile :one
SELECT
COUNT(*)
FROM
udp_routers
WHERE
profile_id = ?
`
func (q *Queries) CountUdpRoutersByProfile(ctx context.Context, profileID int64) (int64, error) {
row := q.queryRow(ctx, q.countUdpRoutersByProfileStmt, countUdpRoutersByProfile, profileID)
func (q *Queries) CountUdpRouters(ctx context.Context, arg CountUdpRoutersParams) (int64, error) {
row := q.queryRow(ctx, q.countUdpRoutersStmt, countUdpRouters, arg.ProfileID, arg.AgentID)
var count int64
err := row.Scan(&count)
return count, err
@@ -203,76 +182,33 @@ SELECT
FROM
udp_routers
WHERE
profile_id = ?
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(?4 AS INTEGER), -1)
OFFSET
?
COALESCE(CAST(?3 AS INTEGER), 0)
`
type ListUdpRoutersParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
AgentID *string `json:"agentId"`
Offset *int64 `json:"offset"`
Limit *int64 `json:"limit"`
}
func (q *Queries) ListUdpRouters(ctx context.Context, arg ListUdpRoutersParams) ([]UdpRouter, error) {
rows, err := q.query(ctx, q.listUdpRoutersStmt, listUdpRouters, arg.ProfileID, arg.Limit, arg.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
var items []UdpRouter
for rows.Next() {
var i UdpRouter
if err := rows.Scan(
&i.ID,
&i.ProfileID,
&i.AgentID,
&i.Name,
&i.Config,
&i.Enabled,
&i.CreatedAt,
&i.UpdatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listUdpRoutersByAgent = `-- name: ListUdpRoutersByAgent :many
SELECT
id, profile_id, agent_id, name, config, enabled, created_at, updated_at
FROM
udp_routers
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListUdpRoutersByAgentParams struct {
AgentID *string `json:"agentId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListUdpRoutersByAgent(ctx context.Context, arg ListUdpRoutersByAgentParams) ([]UdpRouter, error) {
rows, err := q.query(ctx, q.listUdpRoutersByAgentStmt, listUdpRoutersByAgent, arg.AgentID, arg.Limit, arg.Offset)
rows, err := q.query(ctx, q.listUdpRoutersStmt, listUdpRouters,
arg.ProfileID,
arg.AgentID,
arg.Offset,
arg.Limit,
)
if err != nil {
return nil, err
}
@@ -311,22 +247,10 @@ FROM
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListUdpRoutersEnabledParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListUdpRoutersEnabled(ctx context.Context, arg ListUdpRoutersEnabledParams) ([]UdpRouter, error) {
rows, err := q.query(ctx, q.listUdpRoutersEnabledStmt, listUdpRoutersEnabled, arg.ProfileID, arg.Limit, arg.Offset)
func (q *Queries) ListUdpRoutersEnabled(ctx context.Context, profileID int64) ([]UdpRouter, error) {
rows, err := q.query(ctx, q.listUdpRoutersEnabledStmt, listUdpRoutersEnabled, profileID)
if err != nil {
return nil, err
}

View File

@@ -16,42 +16,21 @@ SELECT
COUNT(*)
FROM
udp_services
WHERE
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
`
func (q *Queries) CountUdpServices(ctx context.Context) (int64, error) {
row := q.queryRow(ctx, q.countUdpServicesStmt, countUdpServices)
var count int64
err := row.Scan(&count)
return count, err
type CountUdpServicesParams struct {
ProfileID int64 `json:"profileId"`
AgentID *string `json:"agentId"`
}
const countUdpServicesByAgent = `-- name: CountUdpServicesByAgent :one
SELECT
COUNT(*)
FROM
udp_services
WHERE
agent_id = ?
`
func (q *Queries) CountUdpServicesByAgent(ctx context.Context, agentID *string) (int64, error) {
row := q.queryRow(ctx, q.countUdpServicesByAgentStmt, countUdpServicesByAgent, agentID)
var count int64
err := row.Scan(&count)
return count, err
}
const countUdpServicesByProfile = `-- name: CountUdpServicesByProfile :one
SELECT
COUNT(*)
FROM
udp_services
WHERE
profile_id = ?
`
func (q *Queries) CountUdpServicesByProfile(ctx context.Context, profileID int64) (int64, error) {
row := q.queryRow(ctx, q.countUdpServicesByProfileStmt, countUdpServicesByProfile, profileID)
func (q *Queries) CountUdpServices(ctx context.Context, arg CountUdpServicesParams) (int64, error) {
row := q.queryRow(ctx, q.countUdpServicesStmt, countUdpServices, arg.ProfileID, arg.AgentID)
var count int64
err := row.Scan(&count)
return count, err
@@ -166,76 +145,33 @@ SELECT
FROM
udp_services
WHERE
profile_id = ?
profile_id = ?1
AND (
CAST(?2 AS TEXT) IS NULL
OR agent_id = CAST(?2 AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(?4 AS INTEGER), -1)
OFFSET
?
COALESCE(CAST(?3 AS INTEGER), 0)
`
type ListUdpServicesParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
AgentID *string `json:"agentId"`
Offset *int64 `json:"offset"`
Limit *int64 `json:"limit"`
}
func (q *Queries) ListUdpServices(ctx context.Context, arg ListUdpServicesParams) ([]UdpService, error) {
rows, err := q.query(ctx, q.listUdpServicesStmt, listUdpServices, arg.ProfileID, arg.Limit, arg.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
var items []UdpService
for rows.Next() {
var i UdpService
if err := rows.Scan(
&i.ID,
&i.ProfileID,
&i.AgentID,
&i.Name,
&i.Config,
&i.Enabled,
&i.CreatedAt,
&i.UpdatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listUdpServicesByAgent = `-- name: ListUdpServicesByAgent :many
SELECT
id, profile_id, agent_id, name, config, enabled, created_at, updated_at
FROM
udp_services
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListUdpServicesByAgentParams struct {
AgentID *string `json:"agentId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListUdpServicesByAgent(ctx context.Context, arg ListUdpServicesByAgentParams) ([]UdpService, error) {
rows, err := q.query(ctx, q.listUdpServicesByAgentStmt, listUdpServicesByAgent, arg.AgentID, arg.Limit, arg.Offset)
rows, err := q.query(ctx, q.listUdpServicesStmt, listUdpServices,
arg.ProfileID,
arg.AgentID,
arg.Offset,
arg.Limit,
)
if err != nil {
return nil, err
}
@@ -274,22 +210,10 @@ FROM
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?
`
type ListUdpServicesEnabledParams struct {
ProfileID int64 `json:"profileId"`
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
}
func (q *Queries) ListUdpServicesEnabled(ctx context.Context, arg ListUdpServicesEnabledParams) ([]UdpService, error) {
rows, err := q.query(ctx, q.listUdpServicesEnabledStmt, listUdpServicesEnabled, arg.ProfileID, arg.Limit, arg.Offset)
func (q *Queries) ListUdpServicesEnabled(ctx context.Context, profileID int64) ([]UdpService, error) {
rows, err := q.query(ctx, q.listUdpServicesEnabledStmt, listUdpServicesEnabled, profileID)
if err != nil {
return nil, err
}

View File

@@ -162,20 +162,20 @@ SELECT
FROM
users
ORDER BY
username
created_at DESC
LIMIT
?
COALESCE(CAST(?2 AS INTEGER), -1)
OFFSET
?
COALESCE(CAST(?1 AS INTEGER), 0)
`
type ListUsersParams struct {
Limit int64 `json:"limit"`
Offset int64 `json:"offset"`
Offset *int64 `json:"offset"`
Limit *int64 `json:"limit"`
}
func (q *Queries) ListUsers(ctx context.Context, arg ListUsersParams) ([]User, error) {
rows, err := q.query(ctx, q.listUsersStmt, listUsers, arg.Limit, arg.Offset)
rows, err := q.query(ctx, q.listUsersStmt, listUsers, arg.Offset, arg.Limit)
if err != nil {
return nil, err
}

View File

@@ -183,25 +183,29 @@ CREATE TABLE audit_logs (
);
-- Update profiles table structure
-- Remove columns that are now in traefik_instances
ALTER TABLE profiles
DROP COLUMN url;
CREATE TABLE new_profiles (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
description TEXT,
token TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id) REFERENCES profiles (id) ON DELETE CASCADE
);
ALTER TABLE profiles
DROP COLUMN username;
INSERT INTO
new_profiles (id, name, token)
SELECT
id,
name,
''
FROM
profiles;
ALTER TABLE profiles
DROP COLUMN password;
DROP TABLE profiles;
ALTER TABLE profiles
DROP COLUMN tls;
-- Add description column to profiles
ALTER TABLE profiles
ADD COLUMN description TEXT;
ALTER TABLE profiles
ADD COLUMN token TEXT NOT NULL;
ALTER TABLE new_profiles
RENAME TO profiles;
-- Update agents table - change JSON columns to TEXT
UPDATE agents

View File

@@ -18,19 +18,21 @@ SELECT
FROM
agents
WHERE
profile_id = ?
profile_id = sqlc.arg ('profile_id')
ORDER BY
created_at DESC
LIMIT
?
COALESCE(CAST(sqlc.narg ('limit') AS INTEGER), -1)
OFFSET
?;
COALESCE(CAST(sqlc.narg ('offset') AS INTEGER), 0);
-- name: CountAgents :one
SELECT
COUNT(*)
FROM
agents;
agents
WHERE
profile_id = ?;
-- name: UpdateAgent :one
UPDATE agents

View File

@@ -18,9 +18,9 @@ FROM
ORDER BY
a.created_at DESC
LIMIT
?
COALESCE(CAST(sqlc.narg ('limit') AS INTEGER), -1)
OFFSET
?;
COALESCE(CAST(sqlc.narg ('offset') AS INTEGER), 0);
-- name: CountAuditLogs :one
SELECT

View File

@@ -50,11 +50,11 @@ SELECT
FROM
dns_providers
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(sqlc.narg ('limit') AS INTEGER), -1)
OFFSET
?;
COALESCE(CAST(sqlc.narg ('offset') AS INTEGER), 0);
-- name: CountDnsProviders :one
SELECT

View File

@@ -42,19 +42,21 @@ SELECT
FROM
entry_points
WHERE
profile_id = ?
profile_id = sqlc.arg ('profile_id')
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(sqlc.narg ('limit') AS INTEGER), -1)
OFFSET
?;
COALESCE(CAST(sqlc.narg ('offset') AS INTEGER), 0);
-- name: CountEntryPoints :one
SELECT
COUNT(*)
FROM
entry_points;
entry_points
WHERE
profile_id = ?;
-- name: UpdateEntryPoint :one
UPDATE entry_points

View File

@@ -41,27 +41,17 @@ SELECT
FROM
http_middlewares
WHERE
profile_id = ?
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(sqlc.narg ('limit') AS INTEGER), -1)
OFFSET
?;
-- name: ListHttpMiddlewaresByAgent :many
SELECT
*
FROM
http_middlewares
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?;
COALESCE(CAST(sqlc.narg ('offset') AS INTEGER), 0);
-- name: ListHttpMiddlewaresEnabled :many
SELECT
@@ -70,35 +60,19 @@ FROM
http_middlewares
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?;
AND enabled = TRUE;
-- name: CountHttpMiddlewares :one
SELECT
COUNT(*)
FROM
http_middlewares;
-- name: CountHttpMiddlewaresByProfile :one
SELECT
COUNT(*)
FROM
http_middlewares
WHERE
profile_id = ?;
-- name: CountHttpMiddlewaresByAgent :one
SELECT
COUNT(*)
FROM
http_middlewares
WHERE
agent_id = ?;
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
);
-- name: UpdateHttpMiddleware :one
UPDATE http_middlewares

View File

@@ -67,27 +67,17 @@ SELECT
FROM
http_routers
WHERE
profile_id = ?
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(sqlc.narg ('limit') AS INTEGER), -1)
OFFSET
?;
-- name: ListHttpRoutersByAgent :many
SELECT
*
FROM
http_routers
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?;
COALESCE(CAST(sqlc.narg ('offset') AS INTEGER), 0);
-- name: ListHttpRoutersEnabled :many
SELECT
@@ -96,35 +86,19 @@ FROM
http_routers
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?;
AND enabled = TRUE;
-- name: CountHttpRouters :one
SELECT
COUNT(*)
FROM
http_routers;
-- name: CountHttpRoutersByProfile :one
SELECT
COUNT(*)
FROM
http_routers
WHERE
profile_id = ?;
-- name: CountHttpRoutersByAgent :one
SELECT
COUNT(*)
FROM
http_routers
WHERE
agent_id = ?;
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
);
-- name: UpdateHttpRouter :one
UPDATE http_routers

View File

@@ -25,27 +25,17 @@ SELECT
FROM
http_servers_transports
WHERE
profile_id = ?
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(sqlc.narg ('limit') AS INTEGER), -1)
OFFSET
?;
-- name: ListHttpServersTransportsByAgent :many
SELECT
*
FROM
http_servers_transports
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?;
COALESCE(CAST(sqlc.narg ('offset') AS INTEGER), 0);
-- name: ListHttpServersTransportsEnabled :many
SELECT
@@ -54,35 +44,19 @@ FROM
http_servers_transports
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?;
AND enabled = TRUE;
-- name: CountHttpServersTransports :one
SELECT
COUNT(*)
FROM
http_servers_transports;
-- name: CountHttpServersTransportsByProfile :one
SELECT
COUNT(*)
FROM
http_servers_transports
WHERE
profile_id = ?;
-- name: CountHttpServersTransportsByAgent :one
SELECT
COUNT(*)
FROM
http_servers_transports
WHERE
agent_id = ?;
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
);
-- name: UpdateHttpServersTransport :one
UPDATE http_servers_transports

View File

@@ -33,13 +33,17 @@ SELECT
FROM
http_services
WHERE
profile_id = ?
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(sqlc.narg ('limit') AS INTEGER), -1)
OFFSET
?;
COALESCE(CAST(sqlc.narg ('offset') AS INTEGER), 0);
-- name: ListHttpServicesEnabled :many
SELECT
@@ -48,49 +52,19 @@ FROM
http_services
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?;
-- name: ListHttpServicesByAgent :many
SELECT
*
FROM
http_services
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?;
AND enabled = TRUE;
-- name: CountHttpServices :one
SELECT
COUNT(*)
FROM
http_services;
-- name: CountHttpServicesByProfile :one
SELECT
COUNT(*)
FROM
http_services
WHERE
profile_id = ?;
-- name: CountHttpServicesByAgent :one
SELECT
COUNT(*)
FROM
http_services
WHERE
agent_id = ?;
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
);
-- name: UpdateHttpService :one
UPDATE http_services

View File

@@ -1,75 +0,0 @@
-- name: ListMiddlewaresByProfile :many
SELECT
*,
'http' AS type
FROM
http_middlewares
WHERE
http_middlewares.profile_id = ?
UNION ALL
SELECT
*,
'tcp' AS type
FROM
tcp_middlewares
WHERE
tcp_middlewares.profile_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?;
-- name: ListMiddlewaresByAgent :many
SELECT
*,
'http' AS type
FROM
http_middlewares
WHERE
http_middlewares.agent_id = ?
UNION ALL
SELECT
*,
'tcp' AS type
FROM
tcp_middlewares
WHERE
tcp_middlewares.agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?;
-- name: CountMiddlewaresByProfile :one
SELECT
COUNT(*)
FROM
http_middlewares
WHERE
http_middlewares.profile_id = ?
UNION ALL
SELECT
COUNT(*)
FROM
tcp_middlewares
WHERE
tcp_middlewares.profile_id = ?;
-- name: CountMiddlewaresByAgent :one
SELECT
COUNT(*)
FROM
http_middlewares
WHERE
http_middlewares.agent_id = ?
UNION ALL
SELECT
COUNT(*)
FROM
tcp_middlewares
WHERE
tcp_middlewares.agent_id = ?;

View File

@@ -26,11 +26,11 @@ SELECT
FROM
profiles
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(sqlc.narg ('limit') AS INTEGER), -1)
OFFSET
?;
COALESCE(CAST(sqlc.narg ('offset') AS INTEGER), 0);
-- name: CountProfiles :one
SELECT

View File

@@ -41,27 +41,17 @@ SELECT
FROM
tcp_middlewares
WHERE
profile_id = ?
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(sqlc.narg ('limit') AS INTEGER), -1)
OFFSET
?;
-- name: ListTcpMiddlewaresByAgent :many
SELECT
*
FROM
tcp_middlewares
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?;
COALESCE(CAST(sqlc.narg ('offset') AS INTEGER), 0);
-- name: ListTcpMiddlewaresEnabled :many
SELECT
@@ -70,35 +60,19 @@ FROM
tcp_middlewares
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?;
AND enabled = TRUE;
-- name: CountTcpMiddlewares :one
SELECT
COUNT(*)
FROM
tcp_middlewares;
-- name: CountTcpMiddlewaresByProfile :one
SELECT
COUNT(*)
FROM
tcp_middlewares
WHERE
profile_id = ?;
-- name: CountTcpMiddlewaresByAgent :one
SELECT
COUNT(*)
FROM
tcp_middlewares
WHERE
agent_id = ?;
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
);
-- name: UpdateTcpMiddleware :one
UPDATE tcp_middlewares

View File

@@ -67,27 +67,17 @@ SELECT
FROM
tcp_routers
WHERE
profile_id = ?
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(sqlc.narg ('limit') AS INTEGER), -1)
OFFSET
?;
-- name: ListTcpRoutersByAgent :many
SELECT
*
FROM
tcp_routers
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?;
COALESCE(CAST(sqlc.narg ('offset') AS INTEGER), 0);
-- name: ListTcpRoutersEnabled :many
SELECT
@@ -96,35 +86,19 @@ FROM
tcp_routers
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?;
AND enabled = TRUE;
-- name: CountTcpRouters :one
SELECT
COUNT(*)
FROM
tcp_routers;
-- name: CountTcpRoutersByProfile :one
SELECT
COUNT(*)
FROM
tcp_routers
WHERE
profile_id = ?;
-- name: CountTcpRoutersByAgent :one
SELECT
COUNT(*)
FROM
tcp_routers
WHERE
agent_id = ?;
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
);
-- name: UpdateTcpRouter :one
UPDATE tcp_routers

View File

@@ -25,27 +25,17 @@ SELECT
FROM
tcp_servers_transports
WHERE
profile_id = ?
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(sqlc.narg ('limit') AS INTEGER), -1)
OFFSET
?;
-- name: ListTcpServersTransportsByAgent :many
SELECT
*
FROM
tcp_servers_transports
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?;
COALESCE(CAST(sqlc.narg ('offset') AS INTEGER), 0);
-- name: ListTcpServersTransportsEnabled :many
SELECT
@@ -54,35 +44,19 @@ FROM
tcp_servers_transports
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?;
AND enabled = TRUE;
-- name: CountTcpServersTransports :one
SELECT
COUNT(*)
FROM
tcp_servers_transports;
-- name: CountTcpServersTransportsByProfile :one
SELECT
COUNT(*)
FROM
tcp_servers_transports
WHERE
profile_id = ?;
-- name: CountTcpServersTransportsByAgent :one
SELECT
COUNT(*)
FROM
tcp_servers_transports
WHERE
agent_id = ?;
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
);
-- name: UpdateTcpServersTransport :one
UPDATE tcp_servers_transports

View File

@@ -33,27 +33,17 @@ SELECT
FROM
tcp_services
WHERE
profile_id = ?
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(sqlc.narg ('limit') AS INTEGER), -1)
OFFSET
?;
-- name: ListTcpServicesByAgent :many
SELECT
*
FROM
tcp_services
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?;
COALESCE(CAST(sqlc.narg ('offset') AS INTEGER), 0);
-- name: ListTcpServicesEnabled :many
SELECT
@@ -62,35 +52,19 @@ FROM
tcp_services
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?;
AND enabled = TRUE;
-- name: CountTcpServices :one
SELECT
COUNT(*)
FROM
tcp_services;
-- name: CountTcpServicesByProfile :one
SELECT
COUNT(*)
FROM
tcp_services
WHERE
profile_id = ?;
-- name: CountTcpServicesByAgent :one
SELECT
COUNT(*)
FROM
tcp_services
WHERE
agent_id = ?;
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
);
-- name: UpdateTcpService :one
UPDATE tcp_services

View File

@@ -46,27 +46,17 @@ SELECT
FROM
udp_routers
WHERE
profile_id = ?
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(sqlc.narg ('limit') AS INTEGER), -1)
OFFSET
?;
-- name: ListUdpRoutersByAgent :many
SELECT
*
FROM
udp_routers
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?;
COALESCE(CAST(sqlc.narg ('offset') AS INTEGER), 0);
-- name: ListUdpRoutersEnabled :many
SELECT
@@ -75,35 +65,19 @@ FROM
udp_routers
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?;
AND enabled = TRUE;
-- name: CountUdpRouters :one
SELECT
COUNT(*)
FROM
udp_routers;
-- name: CountUdpRoutersByProfile :one
SELECT
COUNT(*)
FROM
udp_routers
WHERE
profile_id = ?;
-- name: CountUdpRoutersByAgent :one
SELECT
COUNT(*)
FROM
udp_routers
WHERE
agent_id = ?;
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
);
-- name: UpdateUdpRouter :one
UPDATE udp_routers

View File

@@ -33,27 +33,17 @@ SELECT
FROM
udp_services
WHERE
profile_id = ?
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
)
ORDER BY
name
created_at DESC
LIMIT
?
COALESCE(CAST(sqlc.narg ('limit') AS INTEGER), -1)
OFFSET
?;
-- name: ListUdpServicesByAgent :many
SELECT
*
FROM
udp_services
WHERE
agent_id = ?
ORDER BY
name
LIMIT
?
OFFSET
?;
COALESCE(CAST(sqlc.narg ('offset') AS INTEGER), 0);
-- name: ListUdpServicesEnabled :many
SELECT
@@ -62,35 +52,19 @@ FROM
udp_services
WHERE
profile_id = ?
AND enabled = TRUE
ORDER BY
name
LIMIT
?
OFFSET
?;
AND enabled = TRUE;
-- name: CountUdpServices :one
SELECT
COUNT(*)
FROM
udp_services;
-- name: CountUdpServicesByProfile :one
SELECT
COUNT(*)
FROM
udp_services
WHERE
profile_id = ?;
-- name: CountUdpServicesByAgent :one
SELECT
COUNT(*)
FROM
udp_services
WHERE
agent_id = ?;
profile_id = sqlc.arg ('profile_id')
AND (
CAST(sqlc.narg ('agent_id') AS TEXT) IS NULL
OR agent_id = CAST(sqlc.narg ('agent_id') AS TEXT)
);
-- name: UpdateUdpService :one
UPDATE udp_services

View File

@@ -41,11 +41,11 @@ SELECT
FROM
users
ORDER BY
username
created_at DESC
LIMIT
?
COALESCE(CAST(sqlc.narg ('limit') AS INTEGER), -1)
OFFSET
?;
COALESCE(CAST(sqlc.narg ('offset') AS INTEGER), 0);
-- name: CountUsers :one
SELECT

View File

@@ -1,3 +1,6 @@
//go:build dev
// +build dev
package store
import (

View File

@@ -9,6 +9,7 @@ import (
"github.com/mizuchilabs/mantrae/internal/storage"
"github.com/mizuchilabs/mantrae/internal/store/db"
"github.com/mizuchilabs/mantrae/internal/store/schema"
"github.com/traefik/traefik/v3/pkg/config/dynamic"
"gopkg.in/yaml.v3"
)
@@ -39,79 +40,49 @@ func BuildDynamicConfig(
}
// Routers
httpRouters, err := q.ListHttpRoutersEnabled(
ctx,
db.ListHttpRoutersEnabledParams{ProfileID: profile.ID, Limit: -1, Offset: 0},
)
httpRouters, err := q.ListHttpRoutersEnabled(ctx, profile.ID)
if err != nil {
return nil, err
}
tcpRouters, err := q.ListTcpRoutersEnabled(
ctx,
db.ListTcpRoutersEnabledParams{ProfileID: profile.ID, Limit: -1, Offset: 0},
)
tcpRouters, err := q.ListTcpRoutersEnabled(ctx, profile.ID)
if err != nil {
return nil, err
}
udpRouters, err := q.ListUdpRoutersEnabled(
ctx,
db.ListUdpRoutersEnabledParams{ProfileID: profile.ID, Limit: -1, Offset: 0},
)
udpRouters, err := q.ListUdpRoutersEnabled(ctx, profile.ID)
if err != nil {
return nil, err
}
// Services
httpServices, err := q.ListHttpServicesEnabled(
ctx,
db.ListHttpServicesEnabledParams{ProfileID: profile.ID, Limit: -1, Offset: 0},
)
httpServices, err := q.ListHttpServicesEnabled(ctx, profile.ID)
if err != nil {
return nil, err
}
tcpServices, err := q.ListTcpServicesEnabled(
ctx,
db.ListTcpServicesEnabledParams{ProfileID: profile.ID, Limit: -1, Offset: 0},
)
tcpServices, err := q.ListTcpServicesEnabled(ctx, profile.ID)
if err != nil {
return nil, err
}
udpServices, err := q.ListUdpServicesEnabled(
ctx,
db.ListUdpServicesEnabledParams{ProfileID: profile.ID, Limit: -1, Offset: 0},
)
udpServices, err := q.ListUdpServicesEnabled(ctx, profile.ID)
if err != nil {
return nil, err
}
// Middlewares
httpMiddlewares, err := q.ListHttpMiddlewaresEnabled(
ctx,
db.ListHttpMiddlewaresEnabledParams{ProfileID: profile.ID, Limit: -1, Offset: 0},
)
httpMiddlewares, err := q.ListHttpMiddlewaresEnabled(ctx, profile.ID)
if err != nil {
return nil, err
}
tcpMiddlewares, err := q.ListTcpMiddlewaresEnabled(
ctx,
db.ListTcpMiddlewaresEnabledParams{ProfileID: profile.ID, Limit: -1, Offset: 0},
)
tcpMiddlewares, err := q.ListTcpMiddlewaresEnabled(ctx, profile.ID)
if err != nil {
return nil, err
}
// Servers Transports
httpServersTransports, err := q.ListHttpServersTransportsEnabled(
ctx,
db.ListHttpServersTransportsEnabledParams{ProfileID: profile.ID, Limit: -1, Offset: 0},
)
httpServersTransports, err := q.ListHttpServersTransportsEnabled(ctx, profile.ID)
if err != nil {
return nil, err
}
tcpServersTransports, err := q.ListTcpServersTransportsEnabled(
ctx,
db.ListTcpServersTransportsEnabledParams{ProfileID: profile.ID, Limit: -1, Offset: 0},
)
tcpServersTransports, err := q.ListTcpServersTransportsEnabled(ctx, profile.ID)
if err != nil {
return nil, err
}
@@ -167,7 +138,7 @@ func BuildDynamicConfig(
}
func BackupDynamicConfigs(ctx context.Context, q *db.Queries, store storage.Backend) error {
profiles, err := q.ListProfiles(ctx, db.ListProfilesParams{Limit: -1, Offset: 0})
profiles, err := q.ListProfiles(ctx, db.ListProfilesParams{})
if err != nil {
return err
}
@@ -211,3 +182,97 @@ func BackupDynamicConfigs(ctx context.Context, q *db.Queries, store storage.Back
}
return nil
}
// DynamicToDB saves a Traefik dynamic configuration to the database
func DynamicToDB(
ctx context.Context,
q db.Queries,
profileID int64,
dynamic *dynamic.Configuration,
) error {
for k, v := range dynamic.HTTP.Routers {
if _, err := q.CreateHttpRouter(ctx, db.CreateHttpRouterParams{
ProfileID: profileID,
Name: k,
Config: schema.WrapRouter(v),
}); err != nil {
slog.Error("failed to create http router", "err", err)
continue
}
}
for k, v := range dynamic.TCP.Routers {
if _, err := q.CreateTcpRouter(ctx, db.CreateTcpRouterParams{
ProfileID: profileID,
Name: k,
Config: schema.WrapTCPRouter(v),
}); err != nil {
slog.Error("failed to create tcp router", "err", err)
continue
}
}
for k, v := range dynamic.UDP.Routers {
if _, err := q.CreateUdpRouter(ctx, db.CreateUdpRouterParams{
ProfileID: profileID,
Name: k,
Config: schema.WrapUDPRouter(v),
}); err != nil {
slog.Error("failed to create udp router", "err", err)
continue
}
}
// Services
for k, v := range dynamic.HTTP.Services {
if _, err := q.CreateHttpService(ctx, db.CreateHttpServiceParams{
ProfileID: profileID,
Name: k,
Config: schema.WrapService(v),
}); err != nil {
slog.Error("failed to create http service", "err", err)
continue
}
}
for k, v := range dynamic.TCP.Services {
if _, err := q.CreateTcpService(ctx, db.CreateTcpServiceParams{
ProfileID: profileID,
Name: k,
Config: schema.WrapTCPService(v),
}); err != nil {
slog.Error("failed to create tcp service", "err", err)
continue
}
}
for k, v := range dynamic.UDP.Services {
if _, err := q.CreateUdpService(ctx, db.CreateUdpServiceParams{
ProfileID: profileID,
Name: k,
Config: schema.WrapUDPService(v),
}); err != nil {
slog.Error("failed to create udp service", "err", err)
continue
}
}
// Middlewares
for k, v := range dynamic.HTTP.Middlewares {
if _, err := q.CreateHttpMiddleware(ctx, db.CreateHttpMiddlewareParams{
ProfileID: profileID,
Name: k,
Config: schema.WrapMiddleware(v),
}); err != nil {
slog.Error("failed to create http middleware", "err", err)
continue
}
}
for k, v := range dynamic.TCP.Middlewares {
if _, err := q.CreateTcpMiddleware(ctx, db.CreateTcpMiddlewareParams{
ProfileID: profileID,
Name: k,
Config: schema.WrapTCPMiddleware(v),
}); err != nil {
slog.Error("failed to create tcp middleware", "err", err)
continue
}
}
return nil
}

View File

@@ -36,6 +36,11 @@ func HashPassword(password string) (string, error) {
return string(hash), nil
}
func VerifyPassword(password, hash string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
return err == nil
}
// IsHtpasswdFormat checks if a string is already in htpasswd format
func IsHtpasswdFormat(s string) bool {
// HTPasswd formats we support:

View File

@@ -661,10 +661,9 @@ const file_mantrae_v1_entry_point_proto_rawDesc = "" +
"is_default\x18\x04 \x01(\bR\tisDefault\"S\n" +
"\x18UpdateEntryPointResponse\x127\n" +
"\ventry_point\x18\x01 \x01(\v2\x16.mantrae.v1.EntryPointR\n" +
"entryPoint\"5\n" +
"\x17DeleteEntryPointRequest\x12\x1a\n" +
"\x02id\x18\x01 \x01(\x03B\n" +
"\xbaH\a\xc8\x01\x01\"\x02 \x00R\x02id\"\x1a\n" +
"entryPoint\"2\n" +
"\x17DeleteEntryPointRequest\x12\x17\n" +
"\x02id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\x02id\"\x1a\n" +
"\x18DeleteEntryPointResponse\"\xee\x01\n" +
"\x16ListEntryPointsRequest\x12&\n" +
"\n" +

View File

@@ -1,787 +0,0 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.36.6
// protoc (unknown)
// source: mantrae/v1/event.proto
package mantraev1
import (
_ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
timestamppb "google.golang.org/protobuf/types/known/timestamppb"
reflect "reflect"
sync "sync"
unsafe "unsafe"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
type EventType int32
const (
EventType_EVENT_TYPE_UNSPECIFIED EventType = 0
EventType_EVENT_TYPE_CREATED EventType = 1
EventType_EVENT_TYPE_UPDATED EventType = 2
EventType_EVENT_TYPE_DELETED EventType = 3
)
// Enum value maps for EventType.
var (
EventType_name = map[int32]string{
0: "EVENT_TYPE_UNSPECIFIED",
1: "EVENT_TYPE_CREATED",
2: "EVENT_TYPE_UPDATED",
3: "EVENT_TYPE_DELETED",
}
EventType_value = map[string]int32{
"EVENT_TYPE_UNSPECIFIED": 0,
"EVENT_TYPE_CREATED": 1,
"EVENT_TYPE_UPDATED": 2,
"EVENT_TYPE_DELETED": 3,
}
)
func (x EventType) Enum() *EventType {
p := new(EventType)
*p = x
return p
}
func (x EventType) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (EventType) Descriptor() protoreflect.EnumDescriptor {
return file_mantrae_v1_event_proto_enumTypes[0].Descriptor()
}
func (EventType) Type() protoreflect.EnumType {
return &file_mantrae_v1_event_proto_enumTypes[0]
}
func (x EventType) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use EventType.Descriptor instead.
func (EventType) EnumDescriptor() ([]byte, []int) {
return file_mantrae_v1_event_proto_rawDescGZIP(), []int{0}
}
type ResourceType int32
const (
ResourceType_RESOURCE_TYPE_UNSPECIFIED ResourceType = 0
ResourceType_RESOURCE_TYPE_ROUTER ResourceType = 1
ResourceType_RESOURCE_TYPE_SERVICE ResourceType = 2
ResourceType_RESOURCE_TYPE_MIDDLEWARE ResourceType = 3
ResourceType_RESOURCE_TYPE_ENTRY_POINT ResourceType = 4
ResourceType_RESOURCE_TYPE_AUDIT_LOG ResourceType = 5
ResourceType_RESOURCE_TYPE_AGENT ResourceType = 6
ResourceType_RESOURCE_TYPE_USER ResourceType = 7
ResourceType_RESOURCE_TYPE_DNS_PROVIDER ResourceType = 8
)
// Enum value maps for ResourceType.
var (
ResourceType_name = map[int32]string{
0: "RESOURCE_TYPE_UNSPECIFIED",
1: "RESOURCE_TYPE_ROUTER",
2: "RESOURCE_TYPE_SERVICE",
3: "RESOURCE_TYPE_MIDDLEWARE",
4: "RESOURCE_TYPE_ENTRY_POINT",
5: "RESOURCE_TYPE_AUDIT_LOG",
6: "RESOURCE_TYPE_AGENT",
7: "RESOURCE_TYPE_USER",
8: "RESOURCE_TYPE_DNS_PROVIDER",
}
ResourceType_value = map[string]int32{
"RESOURCE_TYPE_UNSPECIFIED": 0,
"RESOURCE_TYPE_ROUTER": 1,
"RESOURCE_TYPE_SERVICE": 2,
"RESOURCE_TYPE_MIDDLEWARE": 3,
"RESOURCE_TYPE_ENTRY_POINT": 4,
"RESOURCE_TYPE_AUDIT_LOG": 5,
"RESOURCE_TYPE_AGENT": 6,
"RESOURCE_TYPE_USER": 7,
"RESOURCE_TYPE_DNS_PROVIDER": 8,
}
)
func (x ResourceType) Enum() *ResourceType {
p := new(ResourceType)
*p = x
return p
}
func (x ResourceType) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (ResourceType) Descriptor() protoreflect.EnumDescriptor {
return file_mantrae_v1_event_proto_enumTypes[1].Descriptor()
}
func (ResourceType) Type() protoreflect.EnumType {
return &file_mantrae_v1_event_proto_enumTypes[1]
}
func (x ResourceType) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use ResourceType.Descriptor instead.
func (ResourceType) EnumDescriptor() ([]byte, []int) {
return file_mantrae_v1_event_proto_rawDescGZIP(), []int{1}
}
type ProfileEvent struct {
state protoimpl.MessageState `protogen:"open.v1"`
EventType EventType `protobuf:"varint,1,opt,name=event_type,json=eventType,proto3,enum=mantrae.v1.EventType" json:"event_type,omitempty"`
ResourceType ResourceType `protobuf:"varint,2,opt,name=resource_type,json=resourceType,proto3,enum=mantrae.v1.ResourceType" json:"resource_type,omitempty"`
ProfileId int64 `protobuf:"varint,3,opt,name=profile_id,json=profileId,proto3" json:"profile_id,omitempty"`
Timestamp *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
// Types that are valid to be assigned to Resource:
//
// *ProfileEvent_Router
// *ProfileEvent_Service
// *ProfileEvent_Middleware
// *ProfileEvent_EntryPoint
// *ProfileEvent_Agent
// *ProfileEvent_AuditLog
Resource isProfileEvent_Resource `protobuf_oneof:"resource"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ProfileEvent) Reset() {
*x = ProfileEvent{}
mi := &file_mantrae_v1_event_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ProfileEvent) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ProfileEvent) ProtoMessage() {}
func (x *ProfileEvent) ProtoReflect() protoreflect.Message {
mi := &file_mantrae_v1_event_proto_msgTypes[0]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ProfileEvent.ProtoReflect.Descriptor instead.
func (*ProfileEvent) Descriptor() ([]byte, []int) {
return file_mantrae_v1_event_proto_rawDescGZIP(), []int{0}
}
func (x *ProfileEvent) GetEventType() EventType {
if x != nil {
return x.EventType
}
return EventType_EVENT_TYPE_UNSPECIFIED
}
func (x *ProfileEvent) GetResourceType() ResourceType {
if x != nil {
return x.ResourceType
}
return ResourceType_RESOURCE_TYPE_UNSPECIFIED
}
func (x *ProfileEvent) GetProfileId() int64 {
if x != nil {
return x.ProfileId
}
return 0
}
func (x *ProfileEvent) GetTimestamp() *timestamppb.Timestamp {
if x != nil {
return x.Timestamp
}
return nil
}
func (x *ProfileEvent) GetResource() isProfileEvent_Resource {
if x != nil {
return x.Resource
}
return nil
}
func (x *ProfileEvent) GetRouter() *Router {
if x != nil {
if x, ok := x.Resource.(*ProfileEvent_Router); ok {
return x.Router
}
}
return nil
}
func (x *ProfileEvent) GetService() *Service {
if x != nil {
if x, ok := x.Resource.(*ProfileEvent_Service); ok {
return x.Service
}
}
return nil
}
func (x *ProfileEvent) GetMiddleware() *Middleware {
if x != nil {
if x, ok := x.Resource.(*ProfileEvent_Middleware); ok {
return x.Middleware
}
}
return nil
}
func (x *ProfileEvent) GetEntryPoint() *EntryPoint {
if x != nil {
if x, ok := x.Resource.(*ProfileEvent_EntryPoint); ok {
return x.EntryPoint
}
}
return nil
}
func (x *ProfileEvent) GetAgent() *Agent {
if x != nil {
if x, ok := x.Resource.(*ProfileEvent_Agent); ok {
return x.Agent
}
}
return nil
}
func (x *ProfileEvent) GetAuditLog() *AuditLog {
if x != nil {
if x, ok := x.Resource.(*ProfileEvent_AuditLog); ok {
return x.AuditLog
}
}
return nil
}
type isProfileEvent_Resource interface {
isProfileEvent_Resource()
}
type ProfileEvent_Router struct {
Router *Router `protobuf:"bytes,10,opt,name=router,proto3,oneof"`
}
type ProfileEvent_Service struct {
Service *Service `protobuf:"bytes,11,opt,name=service,proto3,oneof"`
}
type ProfileEvent_Middleware struct {
Middleware *Middleware `protobuf:"bytes,12,opt,name=middleware,proto3,oneof"`
}
type ProfileEvent_EntryPoint struct {
EntryPoint *EntryPoint `protobuf:"bytes,13,opt,name=entry_point,json=entryPoint,proto3,oneof"`
}
type ProfileEvent_Agent struct {
Agent *Agent `protobuf:"bytes,14,opt,name=agent,proto3,oneof"`
}
type ProfileEvent_AuditLog struct {
AuditLog *AuditLog `protobuf:"bytes,15,opt,name=audit_log,json=auditLog,proto3,oneof"`
}
func (*ProfileEvent_Router) isProfileEvent_Resource() {}
func (*ProfileEvent_Service) isProfileEvent_Resource() {}
func (*ProfileEvent_Middleware) isProfileEvent_Resource() {}
func (*ProfileEvent_EntryPoint) isProfileEvent_Resource() {}
func (*ProfileEvent_Agent) isProfileEvent_Resource() {}
func (*ProfileEvent_AuditLog) isProfileEvent_Resource() {}
type GlobalEvent struct {
state protoimpl.MessageState `protogen:"open.v1"`
EventType EventType `protobuf:"varint,1,opt,name=event_type,json=eventType,proto3,enum=mantrae.v1.EventType" json:"event_type,omitempty"`
ResourceType ResourceType `protobuf:"varint,2,opt,name=resource_type,json=resourceType,proto3,enum=mantrae.v1.ResourceType" json:"resource_type,omitempty"`
Timestamp *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
// Types that are valid to be assigned to Resource:
//
// *GlobalEvent_User
// *GlobalEvent_DnsProvider
Resource isGlobalEvent_Resource `protobuf_oneof:"resource"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *GlobalEvent) Reset() {
*x = GlobalEvent{}
mi := &file_mantrae_v1_event_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *GlobalEvent) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*GlobalEvent) ProtoMessage() {}
func (x *GlobalEvent) ProtoReflect() protoreflect.Message {
mi := &file_mantrae_v1_event_proto_msgTypes[1]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use GlobalEvent.ProtoReflect.Descriptor instead.
func (*GlobalEvent) Descriptor() ([]byte, []int) {
return file_mantrae_v1_event_proto_rawDescGZIP(), []int{1}
}
func (x *GlobalEvent) GetEventType() EventType {
if x != nil {
return x.EventType
}
return EventType_EVENT_TYPE_UNSPECIFIED
}
func (x *GlobalEvent) GetResourceType() ResourceType {
if x != nil {
return x.ResourceType
}
return ResourceType_RESOURCE_TYPE_UNSPECIFIED
}
func (x *GlobalEvent) GetTimestamp() *timestamppb.Timestamp {
if x != nil {
return x.Timestamp
}
return nil
}
func (x *GlobalEvent) GetResource() isGlobalEvent_Resource {
if x != nil {
return x.Resource
}
return nil
}
func (x *GlobalEvent) GetUser() *User {
if x != nil {
if x, ok := x.Resource.(*GlobalEvent_User); ok {
return x.User
}
}
return nil
}
func (x *GlobalEvent) GetDnsProvider() *DnsProvider {
if x != nil {
if x, ok := x.Resource.(*GlobalEvent_DnsProvider); ok {
return x.DnsProvider
}
}
return nil
}
type isGlobalEvent_Resource interface {
isGlobalEvent_Resource()
}
type GlobalEvent_User struct {
User *User `protobuf:"bytes,10,opt,name=user,proto3,oneof"`
}
type GlobalEvent_DnsProvider struct {
DnsProvider *DnsProvider `protobuf:"bytes,11,opt,name=dns_provider,json=dnsProvider,proto3,oneof"`
}
func (*GlobalEvent_User) isGlobalEvent_Resource() {}
func (*GlobalEvent_DnsProvider) isGlobalEvent_Resource() {}
type ProfileEventsRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
ProfileId int64 `protobuf:"varint,1,opt,name=profile_id,json=profileId,proto3" json:"profile_id,omitempty"`
ResourceTypes []ResourceType `protobuf:"varint,2,rep,packed,name=resource_types,json=resourceTypes,proto3,enum=mantrae.v1.ResourceType" json:"resource_types,omitempty"` // Filter by specific resource types
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ProfileEventsRequest) Reset() {
*x = ProfileEventsRequest{}
mi := &file_mantrae_v1_event_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ProfileEventsRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ProfileEventsRequest) ProtoMessage() {}
func (x *ProfileEventsRequest) ProtoReflect() protoreflect.Message {
mi := &file_mantrae_v1_event_proto_msgTypes[2]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ProfileEventsRequest.ProtoReflect.Descriptor instead.
func (*ProfileEventsRequest) Descriptor() ([]byte, []int) {
return file_mantrae_v1_event_proto_rawDescGZIP(), []int{2}
}
func (x *ProfileEventsRequest) GetProfileId() int64 {
if x != nil {
return x.ProfileId
}
return 0
}
func (x *ProfileEventsRequest) GetResourceTypes() []ResourceType {
if x != nil {
return x.ResourceTypes
}
return nil
}
type ProfileEventsResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Event *ProfileEvent `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ProfileEventsResponse) Reset() {
*x = ProfileEventsResponse{}
mi := &file_mantrae_v1_event_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ProfileEventsResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ProfileEventsResponse) ProtoMessage() {}
func (x *ProfileEventsResponse) ProtoReflect() protoreflect.Message {
mi := &file_mantrae_v1_event_proto_msgTypes[3]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ProfileEventsResponse.ProtoReflect.Descriptor instead.
func (*ProfileEventsResponse) Descriptor() ([]byte, []int) {
return file_mantrae_v1_event_proto_rawDescGZIP(), []int{3}
}
func (x *ProfileEventsResponse) GetEvent() *ProfileEvent {
if x != nil {
return x.Event
}
return nil
}
type GlobalEventsRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
ResourceTypes []ResourceType `protobuf:"varint,1,rep,packed,name=resource_types,json=resourceTypes,proto3,enum=mantrae.v1.ResourceType" json:"resource_types,omitempty"` // Filter by specific resource types
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *GlobalEventsRequest) Reset() {
*x = GlobalEventsRequest{}
mi := &file_mantrae_v1_event_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *GlobalEventsRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*GlobalEventsRequest) ProtoMessage() {}
func (x *GlobalEventsRequest) ProtoReflect() protoreflect.Message {
mi := &file_mantrae_v1_event_proto_msgTypes[4]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use GlobalEventsRequest.ProtoReflect.Descriptor instead.
func (*GlobalEventsRequest) Descriptor() ([]byte, []int) {
return file_mantrae_v1_event_proto_rawDescGZIP(), []int{4}
}
func (x *GlobalEventsRequest) GetResourceTypes() []ResourceType {
if x != nil {
return x.ResourceTypes
}
return nil
}
type GlobalEventsResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Event *GlobalEvent `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *GlobalEventsResponse) Reset() {
*x = GlobalEventsResponse{}
mi := &file_mantrae_v1_event_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *GlobalEventsResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*GlobalEventsResponse) ProtoMessage() {}
func (x *GlobalEventsResponse) ProtoReflect() protoreflect.Message {
mi := &file_mantrae_v1_event_proto_msgTypes[5]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use GlobalEventsResponse.ProtoReflect.Descriptor instead.
func (*GlobalEventsResponse) Descriptor() ([]byte, []int) {
return file_mantrae_v1_event_proto_rawDescGZIP(), []int{5}
}
func (x *GlobalEventsResponse) GetEvent() *GlobalEvent {
if x != nil {
return x.Event
}
return nil
}
var File_mantrae_v1_event_proto protoreflect.FileDescriptor
const file_mantrae_v1_event_proto_rawDesc = "" +
"\n" +
"\x16mantrae/v1/event.proto\x12\n" +
"mantrae.v1\x1a\x1bbuf/validate/validate.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x16mantrae/v1/agent.proto\x1a\x19mantrae/v1/auditlog.proto\x1a\x1dmantrae/v1/dns_provider.proto\x1a\x1cmantrae/v1/entry_point.proto\x1a\x1bmantrae/v1/middleware.proto\x1a\x17mantrae/v1/router.proto\x1a\x18mantrae/v1/service.proto\x1a\x15mantrae/v1/user.proto\"\x9c\x04\n" +
"\fProfileEvent\x124\n" +
"\n" +
"event_type\x18\x01 \x01(\x0e2\x15.mantrae.v1.EventTypeR\teventType\x12=\n" +
"\rresource_type\x18\x02 \x01(\x0e2\x18.mantrae.v1.ResourceTypeR\fresourceType\x12\x1d\n" +
"\n" +
"profile_id\x18\x03 \x01(\x03R\tprofileId\x128\n" +
"\ttimestamp\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\ttimestamp\x12,\n" +
"\x06router\x18\n" +
" \x01(\v2\x12.mantrae.v1.RouterH\x00R\x06router\x12/\n" +
"\aservice\x18\v \x01(\v2\x13.mantrae.v1.ServiceH\x00R\aservice\x128\n" +
"\n" +
"middleware\x18\f \x01(\v2\x16.mantrae.v1.MiddlewareH\x00R\n" +
"middleware\x129\n" +
"\ventry_point\x18\r \x01(\v2\x16.mantrae.v1.EntryPointH\x00R\n" +
"entryPoint\x12)\n" +
"\x05agent\x18\x0e \x01(\v2\x11.mantrae.v1.AgentH\x00R\x05agent\x123\n" +
"\taudit_log\x18\x0f \x01(\v2\x14.mantrae.v1.AuditLogH\x00R\bauditLogB\n" +
"\n" +
"\bresource\"\xae\x02\n" +
"\vGlobalEvent\x124\n" +
"\n" +
"event_type\x18\x01 \x01(\x0e2\x15.mantrae.v1.EventTypeR\teventType\x12=\n" +
"\rresource_type\x18\x02 \x01(\x0e2\x18.mantrae.v1.ResourceTypeR\fresourceType\x128\n" +
"\ttimestamp\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\ttimestamp\x12&\n" +
"\x04user\x18\n" +
" \x01(\v2\x10.mantrae.v1.UserH\x00R\x04user\x12<\n" +
"\fdns_provider\x18\v \x01(\v2\x17.mantrae.v1.DnsProviderH\x00R\vdnsProviderB\n" +
"\n" +
"\bresource\"\x7f\n" +
"\x14ProfileEventsRequest\x12&\n" +
"\n" +
"profile_id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\tprofileId\x12?\n" +
"\x0eresource_types\x18\x02 \x03(\x0e2\x18.mantrae.v1.ResourceTypeR\rresourceTypes\"G\n" +
"\x15ProfileEventsResponse\x12.\n" +
"\x05event\x18\x01 \x01(\v2\x18.mantrae.v1.ProfileEventR\x05event\"V\n" +
"\x13GlobalEventsRequest\x12?\n" +
"\x0eresource_types\x18\x01 \x03(\x0e2\x18.mantrae.v1.ResourceTypeR\rresourceTypes\"E\n" +
"\x14GlobalEventsResponse\x12-\n" +
"\x05event\x18\x01 \x01(\v2\x17.mantrae.v1.GlobalEventR\x05event*o\n" +
"\tEventType\x12\x1a\n" +
"\x16EVENT_TYPE_UNSPECIFIED\x10\x00\x12\x16\n" +
"\x12EVENT_TYPE_CREATED\x10\x01\x12\x16\n" +
"\x12EVENT_TYPE_UPDATED\x10\x02\x12\x16\n" +
"\x12EVENT_TYPE_DELETED\x10\x03*\x8d\x02\n" +
"\fResourceType\x12\x1d\n" +
"\x19RESOURCE_TYPE_UNSPECIFIED\x10\x00\x12\x18\n" +
"\x14RESOURCE_TYPE_ROUTER\x10\x01\x12\x19\n" +
"\x15RESOURCE_TYPE_SERVICE\x10\x02\x12\x1c\n" +
"\x18RESOURCE_TYPE_MIDDLEWARE\x10\x03\x12\x1d\n" +
"\x19RESOURCE_TYPE_ENTRY_POINT\x10\x04\x12\x1b\n" +
"\x17RESOURCE_TYPE_AUDIT_LOG\x10\x05\x12\x17\n" +
"\x13RESOURCE_TYPE_AGENT\x10\x06\x12\x16\n" +
"\x12RESOURCE_TYPE_USER\x10\a\x12\x1e\n" +
"\x1aRESOURCE_TYPE_DNS_PROVIDER\x10\b2\xbb\x01\n" +
"\fEventService\x12V\n" +
"\rProfileEvents\x12 .mantrae.v1.ProfileEventsRequest\x1a!.mantrae.v1.ProfileEventsResponse0\x01\x12S\n" +
"\fGlobalEvents\x12\x1f.mantrae.v1.GlobalEventsRequest\x1a .mantrae.v1.GlobalEventsResponse0\x01B\xa4\x01\n" +
"\x0ecom.mantrae.v1B\n" +
"EventProtoP\x01Z=github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1;mantraev1\xa2\x02\x03MXX\xaa\x02\n" +
"Mantrae.V1\xca\x02\n" +
"Mantrae\\V1\xe2\x02\x16Mantrae\\V1\\GPBMetadata\xea\x02\vMantrae::V1b\x06proto3"
var (
file_mantrae_v1_event_proto_rawDescOnce sync.Once
file_mantrae_v1_event_proto_rawDescData []byte
)
func file_mantrae_v1_event_proto_rawDescGZIP() []byte {
file_mantrae_v1_event_proto_rawDescOnce.Do(func() {
file_mantrae_v1_event_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_mantrae_v1_event_proto_rawDesc), len(file_mantrae_v1_event_proto_rawDesc)))
})
return file_mantrae_v1_event_proto_rawDescData
}
var file_mantrae_v1_event_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_mantrae_v1_event_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
var file_mantrae_v1_event_proto_goTypes = []any{
(EventType)(0), // 0: mantrae.v1.EventType
(ResourceType)(0), // 1: mantrae.v1.ResourceType
(*ProfileEvent)(nil), // 2: mantrae.v1.ProfileEvent
(*GlobalEvent)(nil), // 3: mantrae.v1.GlobalEvent
(*ProfileEventsRequest)(nil), // 4: mantrae.v1.ProfileEventsRequest
(*ProfileEventsResponse)(nil), // 5: mantrae.v1.ProfileEventsResponse
(*GlobalEventsRequest)(nil), // 6: mantrae.v1.GlobalEventsRequest
(*GlobalEventsResponse)(nil), // 7: mantrae.v1.GlobalEventsResponse
(*timestamppb.Timestamp)(nil), // 8: google.protobuf.Timestamp
(*Router)(nil), // 9: mantrae.v1.Router
(*Service)(nil), // 10: mantrae.v1.Service
(*Middleware)(nil), // 11: mantrae.v1.Middleware
(*EntryPoint)(nil), // 12: mantrae.v1.EntryPoint
(*Agent)(nil), // 13: mantrae.v1.Agent
(*AuditLog)(nil), // 14: mantrae.v1.AuditLog
(*User)(nil), // 15: mantrae.v1.User
(*DnsProvider)(nil), // 16: mantrae.v1.DnsProvider
}
var file_mantrae_v1_event_proto_depIdxs = []int32{
0, // 0: mantrae.v1.ProfileEvent.event_type:type_name -> mantrae.v1.EventType
1, // 1: mantrae.v1.ProfileEvent.resource_type:type_name -> mantrae.v1.ResourceType
8, // 2: mantrae.v1.ProfileEvent.timestamp:type_name -> google.protobuf.Timestamp
9, // 3: mantrae.v1.ProfileEvent.router:type_name -> mantrae.v1.Router
10, // 4: mantrae.v1.ProfileEvent.service:type_name -> mantrae.v1.Service
11, // 5: mantrae.v1.ProfileEvent.middleware:type_name -> mantrae.v1.Middleware
12, // 6: mantrae.v1.ProfileEvent.entry_point:type_name -> mantrae.v1.EntryPoint
13, // 7: mantrae.v1.ProfileEvent.agent:type_name -> mantrae.v1.Agent
14, // 8: mantrae.v1.ProfileEvent.audit_log:type_name -> mantrae.v1.AuditLog
0, // 9: mantrae.v1.GlobalEvent.event_type:type_name -> mantrae.v1.EventType
1, // 10: mantrae.v1.GlobalEvent.resource_type:type_name -> mantrae.v1.ResourceType
8, // 11: mantrae.v1.GlobalEvent.timestamp:type_name -> google.protobuf.Timestamp
15, // 12: mantrae.v1.GlobalEvent.user:type_name -> mantrae.v1.User
16, // 13: mantrae.v1.GlobalEvent.dns_provider:type_name -> mantrae.v1.DnsProvider
1, // 14: mantrae.v1.ProfileEventsRequest.resource_types:type_name -> mantrae.v1.ResourceType
2, // 15: mantrae.v1.ProfileEventsResponse.event:type_name -> mantrae.v1.ProfileEvent
1, // 16: mantrae.v1.GlobalEventsRequest.resource_types:type_name -> mantrae.v1.ResourceType
3, // 17: mantrae.v1.GlobalEventsResponse.event:type_name -> mantrae.v1.GlobalEvent
4, // 18: mantrae.v1.EventService.ProfileEvents:input_type -> mantrae.v1.ProfileEventsRequest
6, // 19: mantrae.v1.EventService.GlobalEvents:input_type -> mantrae.v1.GlobalEventsRequest
5, // 20: mantrae.v1.EventService.ProfileEvents:output_type -> mantrae.v1.ProfileEventsResponse
7, // 21: mantrae.v1.EventService.GlobalEvents:output_type -> mantrae.v1.GlobalEventsResponse
20, // [20:22] is the sub-list for method output_type
18, // [18:20] is the sub-list for method input_type
18, // [18:18] is the sub-list for extension type_name
18, // [18:18] is the sub-list for extension extendee
0, // [0:18] is the sub-list for field type_name
}
func init() { file_mantrae_v1_event_proto_init() }
func file_mantrae_v1_event_proto_init() {
if File_mantrae_v1_event_proto != nil {
return
}
file_mantrae_v1_agent_proto_init()
file_mantrae_v1_auditlog_proto_init()
file_mantrae_v1_dns_provider_proto_init()
file_mantrae_v1_entry_point_proto_init()
file_mantrae_v1_middleware_proto_init()
file_mantrae_v1_router_proto_init()
file_mantrae_v1_service_proto_init()
file_mantrae_v1_user_proto_init()
file_mantrae_v1_event_proto_msgTypes[0].OneofWrappers = []any{
(*ProfileEvent_Router)(nil),
(*ProfileEvent_Service)(nil),
(*ProfileEvent_Middleware)(nil),
(*ProfileEvent_EntryPoint)(nil),
(*ProfileEvent_Agent)(nil),
(*ProfileEvent_AuditLog)(nil),
}
file_mantrae_v1_event_proto_msgTypes[1].OneofWrappers = []any{
(*GlobalEvent_User)(nil),
(*GlobalEvent_DnsProvider)(nil),
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_mantrae_v1_event_proto_rawDesc), len(file_mantrae_v1_event_proto_rawDesc)),
NumEnums: 2,
NumMessages: 6,
NumExtensions: 0,
NumServices: 1,
},
GoTypes: file_mantrae_v1_event_proto_goTypes,
DependencyIndexes: file_mantrae_v1_event_proto_depIdxs,
EnumInfos: file_mantrae_v1_event_proto_enumTypes,
MessageInfos: file_mantrae_v1_event_proto_msgTypes,
}.Build()
File_mantrae_v1_event_proto = out.File
file_mantrae_v1_event_proto_goTypes = nil
file_mantrae_v1_event_proto_depIdxs = nil
}

View File

@@ -1,142 +0,0 @@
// Code generated by protoc-gen-connect-go. DO NOT EDIT.
//
// Source: mantrae/v1/event.proto
package mantraev1connect
import (
connect "connectrpc.com/connect"
context "context"
errors "errors"
v1 "github.com/mizuchilabs/mantrae/proto/gen/mantrae/v1"
http "net/http"
strings "strings"
)
// This is a compile-time assertion to ensure that this generated file and the connect package are
// compatible. If you get a compiler error that this constant is not defined, this code was
// generated with a version of connect newer than the one compiled into your binary. You can fix the
// problem by either regenerating this code with an older version of connect or updating the connect
// version compiled into your binary.
const _ = connect.IsAtLeastVersion1_13_0
const (
// EventServiceName is the fully-qualified name of the EventService service.
EventServiceName = "mantrae.v1.EventService"
)
// These constants are the fully-qualified names of the RPCs defined in this package. They're
// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route.
//
// Note that these are different from the fully-qualified method names used by
// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to
// reflection-formatted method names, remove the leading slash and convert the remaining slash to a
// period.
const (
// EventServiceProfileEventsProcedure is the fully-qualified name of the EventService's
// ProfileEvents RPC.
EventServiceProfileEventsProcedure = "/mantrae.v1.EventService/ProfileEvents"
// EventServiceGlobalEventsProcedure is the fully-qualified name of the EventService's GlobalEvents
// RPC.
EventServiceGlobalEventsProcedure = "/mantrae.v1.EventService/GlobalEvents"
)
// EventServiceClient is a client for the mantrae.v1.EventService service.
type EventServiceClient interface {
// Profile-scoped events (routers, services, middlewares, entrypoints)
ProfileEvents(context.Context, *connect.Request[v1.ProfileEventsRequest]) (*connect.ServerStreamForClient[v1.ProfileEventsResponse], error)
// Global events (users, dns)
GlobalEvents(context.Context, *connect.Request[v1.GlobalEventsRequest]) (*connect.ServerStreamForClient[v1.GlobalEventsResponse], error)
}
// NewEventServiceClient constructs a client for the mantrae.v1.EventService service. By default, it
// uses the Connect protocol with the binary Protobuf Codec, asks for gzipped responses, and sends
// uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or
// connect.WithGRPCWeb() options.
//
// The URL supplied here should be the base URL for the Connect or gRPC server (for example,
// http://api.acme.com or https://acme.com/grpc).
func NewEventServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) EventServiceClient {
baseURL = strings.TrimRight(baseURL, "/")
eventServiceMethods := v1.File_mantrae_v1_event_proto.Services().ByName("EventService").Methods()
return &eventServiceClient{
profileEvents: connect.NewClient[v1.ProfileEventsRequest, v1.ProfileEventsResponse](
httpClient,
baseURL+EventServiceProfileEventsProcedure,
connect.WithSchema(eventServiceMethods.ByName("ProfileEvents")),
connect.WithClientOptions(opts...),
),
globalEvents: connect.NewClient[v1.GlobalEventsRequest, v1.GlobalEventsResponse](
httpClient,
baseURL+EventServiceGlobalEventsProcedure,
connect.WithSchema(eventServiceMethods.ByName("GlobalEvents")),
connect.WithClientOptions(opts...),
),
}
}
// eventServiceClient implements EventServiceClient.
type eventServiceClient struct {
profileEvents *connect.Client[v1.ProfileEventsRequest, v1.ProfileEventsResponse]
globalEvents *connect.Client[v1.GlobalEventsRequest, v1.GlobalEventsResponse]
}
// ProfileEvents calls mantrae.v1.EventService.ProfileEvents.
func (c *eventServiceClient) ProfileEvents(ctx context.Context, req *connect.Request[v1.ProfileEventsRequest]) (*connect.ServerStreamForClient[v1.ProfileEventsResponse], error) {
return c.profileEvents.CallServerStream(ctx, req)
}
// GlobalEvents calls mantrae.v1.EventService.GlobalEvents.
func (c *eventServiceClient) GlobalEvents(ctx context.Context, req *connect.Request[v1.GlobalEventsRequest]) (*connect.ServerStreamForClient[v1.GlobalEventsResponse], error) {
return c.globalEvents.CallServerStream(ctx, req)
}
// EventServiceHandler is an implementation of the mantrae.v1.EventService service.
type EventServiceHandler interface {
// Profile-scoped events (routers, services, middlewares, entrypoints)
ProfileEvents(context.Context, *connect.Request[v1.ProfileEventsRequest], *connect.ServerStream[v1.ProfileEventsResponse]) error
// Global events (users, dns)
GlobalEvents(context.Context, *connect.Request[v1.GlobalEventsRequest], *connect.ServerStream[v1.GlobalEventsResponse]) error
}
// NewEventServiceHandler builds an HTTP handler from the service implementation. It returns the
// path on which to mount the handler and the handler itself.
//
// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf
// and JSON codecs. They also support gzip compression.
func NewEventServiceHandler(svc EventServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) {
eventServiceMethods := v1.File_mantrae_v1_event_proto.Services().ByName("EventService").Methods()
eventServiceProfileEventsHandler := connect.NewServerStreamHandler(
EventServiceProfileEventsProcedure,
svc.ProfileEvents,
connect.WithSchema(eventServiceMethods.ByName("ProfileEvents")),
connect.WithHandlerOptions(opts...),
)
eventServiceGlobalEventsHandler := connect.NewServerStreamHandler(
EventServiceGlobalEventsProcedure,
svc.GlobalEvents,
connect.WithSchema(eventServiceMethods.ByName("GlobalEvents")),
connect.WithHandlerOptions(opts...),
)
return "/mantrae.v1.EventService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch r.URL.Path {
case EventServiceProfileEventsProcedure:
eventServiceProfileEventsHandler.ServeHTTP(w, r)
case EventServiceGlobalEventsProcedure:
eventServiceGlobalEventsHandler.ServeHTTP(w, r)
default:
http.NotFound(w, r)
}
})
}
// UnimplementedEventServiceHandler returns CodeUnimplemented from all methods.
type UnimplementedEventServiceHandler struct{}
func (UnimplementedEventServiceHandler) ProfileEvents(context.Context, *connect.Request[v1.ProfileEventsRequest], *connect.ServerStream[v1.ProfileEventsResponse]) error {
return connect.NewError(connect.CodeUnimplemented, errors.New("mantrae.v1.EventService.ProfileEvents is not implemented"))
}
func (UnimplementedEventServiceHandler) GlobalEvents(context.Context, *connect.Request[v1.GlobalEventsRequest], *connect.ServerStream[v1.GlobalEventsResponse]) error {
return connect.NewError(connect.CodeUnimplemented, errors.New("mantrae.v1.EventService.GlobalEvents is not implemented"))
}

View File

@@ -504,7 +504,7 @@ func (x *GetMiddlewareResponse) GetMiddleware() *Middleware {
type CreateMiddlewareRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
ProfileId int64 `protobuf:"varint,1,opt,name=profile_id,json=profileId,proto3" json:"profile_id,omitempty"`
AgentId string `protobuf:"bytes,2,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"`
AgentId *string `protobuf:"bytes,2,opt,name=agent_id,json=agentId,proto3,oneof" json:"agent_id,omitempty"`
Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
Type MiddlewareType `protobuf:"varint,4,opt,name=type,proto3,enum=mantrae.v1.MiddlewareType" json:"type,omitempty"`
IsDefault bool `protobuf:"varint,5,opt,name=is_default,json=isDefault,proto3" json:"is_default,omitempty"`
@@ -551,8 +551,8 @@ func (x *CreateMiddlewareRequest) GetProfileId() int64 {
}
func (x *CreateMiddlewareRequest) GetAgentId() string {
if x != nil {
return x.AgentId
if x != nil && x.AgentId != nil {
return *x.AgentId
}
return ""
}
@@ -1105,16 +1105,17 @@ const file_mantrae_v1_middleware_proto_rawDesc = "" +
"\x15GetMiddlewareResponse\x126\n" +
"\n" +
"middleware\x18\x01 \x01(\v2\x16.mantrae.v1.MiddlewareR\n" +
"middleware\"\x83\x02\n" +
"middleware\"\x95\x02\n" +
"\x17CreateMiddlewareRequest\x12&\n" +
"\n" +
"profile_id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\tprofileId\x12\x19\n" +
"\bagent_id\x18\x02 \x01(\tR\aagentId\x12\x1b\n" +
"profile_id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\tprofileId\x12\x1e\n" +
"\bagent_id\x18\x02 \x01(\tH\x00R\aagentId\x88\x01\x01\x12\x1b\n" +
"\x04name\x18\x03 \x01(\tB\a\xbaH\x04r\x02\x10\x01R\x04name\x128\n" +
"\x04type\x18\x04 \x01(\x0e2\x1a.mantrae.v1.MiddlewareTypeB\b\xbaH\x05\x82\x01\x02\x10\x01R\x04type\x12\x1d\n" +
"\n" +
"is_default\x18\x05 \x01(\bR\tisDefault\x12/\n" +
"\x06config\x18\x06 \x01(\v2\x17.google.protobuf.StructR\x06config\"R\n" +
"\x06config\x18\x06 \x01(\v2\x17.google.protobuf.StructR\x06configB\v\n" +
"\t_agent_id\"R\n" +
"\x18CreateMiddlewareResponse\x126\n" +
"\n" +
"middleware\x18\x01 \x01(\v2\x16.mantrae.v1.MiddlewareR\n" +
@@ -1134,12 +1135,12 @@ const file_mantrae_v1_middleware_proto_rawDesc = "" +
"\x17DeleteMiddlewareRequest\x12\x17\n" +
"\x02id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\x02id\x128\n" +
"\x04type\x18\x02 \x01(\x0e2\x1a.mantrae.v1.MiddlewareTypeB\b\xbaH\x05\x82\x01\x02\x10\x01R\x04type\"\x1a\n" +
"\x18DeleteMiddlewareResponse\"\xec\x02\n" +
"\x18DeleteMiddlewareResponse\"\xe2\x02\n" +
"\x16ListMiddlewaresRequest\x12&\n" +
"\n" +
"profile_id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\tprofileId\x12'\n" +
"\bagent_id\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\x01H\x00R\aagentId\x88\x01\x01\x12=\n" +
"\x04type\x18\x03 \x01(\x0e2\x1a.mantrae.v1.MiddlewareTypeB\b\xbaH\x05\x82\x01\x02\x10\x01H\x01R\x04type\x88\x01\x01\x12q\n" +
"\bagent_id\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\x01H\x00R\aagentId\x88\x01\x01\x123\n" +
"\x04type\x18\x03 \x01(\x0e2\x1a.mantrae.v1.MiddlewareTypeH\x01R\x04type\x88\x01\x01\x12q\n" +
"\x05limit\x18\x04 \x01(\x03BV\xbaHS\xba\x01P\n" +
"\vlimit.valid\x12)limit must be either -1 or greater than 0\x1a\x16this == -1 || this > 0H\x02R\x05limit\x88\x01\x01\x12$\n" +
"\x06offset\x18\x05 \x01(\x03B\a\xbaH\x04\"\x02(\x00H\x03R\x06offset\x88\x01\x01B\v\n" +
@@ -1245,6 +1246,7 @@ func file_mantrae_v1_middleware_proto_init() {
if File_mantrae_v1_middleware_proto != nil {
return
}
file_mantrae_v1_middleware_proto_msgTypes[5].OneofWrappers = []any{}
file_mantrae_v1_middleware_proto_msgTypes[11].OneofWrappers = []any{}
type x struct{}
out := protoimpl.TypeBuilder{

View File

@@ -291,7 +291,7 @@ func (x *GetRouterResponse) GetRouter() *Router {
type CreateRouterRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
ProfileId int64 `protobuf:"varint,1,opt,name=profile_id,json=profileId,proto3" json:"profile_id,omitempty"`
AgentId string `protobuf:"bytes,2,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"`
AgentId *string `protobuf:"bytes,2,opt,name=agent_id,json=agentId,proto3,oneof" json:"agent_id,omitempty"`
Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
Config *structpb.Struct `protobuf:"bytes,4,opt,name=config,proto3" json:"config,omitempty"`
Enabled bool `protobuf:"varint,5,opt,name=enabled,proto3" json:"enabled,omitempty"`
@@ -338,8 +338,8 @@ func (x *CreateRouterRequest) GetProfileId() int64 {
}
func (x *CreateRouterRequest) GetAgentId() string {
if x != nil {
return x.AgentId
if x != nil && x.AgentId != nil {
return *x.AgentId
}
return ""
}
@@ -785,15 +785,16 @@ const file_mantrae_v1_router_proto_rawDesc = "" +
"\x02id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\x02id\x124\n" +
"\x04type\x18\x02 \x01(\x0e2\x16.mantrae.v1.RouterTypeB\b\xbaH\x05\x82\x01\x02\x10\x01R\x04type\"?\n" +
"\x11GetRouterResponse\x12*\n" +
"\x06router\x18\x01 \x01(\v2\x12.mantrae.v1.RouterR\x06router\"\xf6\x01\n" +
"\x06router\x18\x01 \x01(\v2\x12.mantrae.v1.RouterR\x06router\"\x88\x02\n" +
"\x13CreateRouterRequest\x12&\n" +
"\n" +
"profile_id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\tprofileId\x12\x19\n" +
"\bagent_id\x18\x02 \x01(\tR\aagentId\x12\x1b\n" +
"profile_id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\tprofileId\x12\x1e\n" +
"\bagent_id\x18\x02 \x01(\tH\x00R\aagentId\x88\x01\x01\x12\x1b\n" +
"\x04name\x18\x03 \x01(\tB\a\xbaH\x04r\x02\x10\x01R\x04name\x12/\n" +
"\x06config\x18\x04 \x01(\v2\x17.google.protobuf.StructR\x06config\x12\x18\n" +
"\aenabled\x18\x05 \x01(\bR\aenabled\x124\n" +
"\x04type\x18\x06 \x01(\x0e2\x16.mantrae.v1.RouterTypeB\b\xbaH\x05\x82\x01\x02\x10\x01R\x04type\"B\n" +
"\x04type\x18\x06 \x01(\x0e2\x16.mantrae.v1.RouterTypeB\b\xbaH\x05\x82\x01\x02\x10\x01R\x04typeB\v\n" +
"\t_agent_id\"B\n" +
"\x14CreateRouterResponse\x12*\n" +
"\x06router\x18\x01 \x01(\v2\x12.mantrae.v1.RouterR\x06router\"\x8a\x02\n" +
"\x13UpdateRouterRequest\x12\x17\n" +
@@ -808,12 +809,12 @@ const file_mantrae_v1_router_proto_rawDesc = "" +
"\x13DeleteRouterRequest\x12\x17\n" +
"\x02id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\x02id\x124\n" +
"\x04type\x18\x02 \x01(\x0e2\x16.mantrae.v1.RouterTypeB\b\xbaH\x05\x82\x01\x02\x10\x01R\x04type\"\x16\n" +
"\x14DeleteRouterResponse\"\xe4\x02\n" +
"\x14DeleteRouterResponse\"\xda\x02\n" +
"\x12ListRoutersRequest\x12&\n" +
"\n" +
"profile_id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\tprofileId\x12'\n" +
"\bagent_id\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\x01H\x00R\aagentId\x88\x01\x01\x129\n" +
"\x04type\x18\x03 \x01(\x0e2\x16.mantrae.v1.RouterTypeB\b\xbaH\x05\x82\x01\x02\x10\x01H\x01R\x04type\x88\x01\x01\x12q\n" +
"\bagent_id\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\x01H\x00R\aagentId\x88\x01\x01\x12/\n" +
"\x04type\x18\x03 \x01(\x0e2\x16.mantrae.v1.RouterTypeH\x01R\x04type\x88\x01\x01\x12q\n" +
"\x05limit\x18\x04 \x01(\x03BV\xbaHS\xba\x01P\n" +
"\vlimit.valid\x12)limit must be either -1 or greater than 0\x1a\x16this == -1 || this > 0H\x02R\x05limit\x88\x01\x01\x12$\n" +
"\x06offset\x18\x05 \x01(\x03B\a\xbaH\x04\"\x02(\x00H\x03R\x06offset\x88\x01\x01B\v\n" +
@@ -913,6 +914,7 @@ func file_mantrae_v1_router_proto_init() {
return
}
file_mantrae_v1_dns_provider_proto_init()
file_mantrae_v1_router_proto_msgTypes[3].OneofWrappers = []any{}
file_mantrae_v1_router_proto_msgTypes[9].OneofWrappers = []any{}
type x struct{}
out := protoimpl.TypeBuilder{

View File

@@ -280,7 +280,7 @@ func (x *GetServersTransportResponse) GetServersTransport() *ServersTransport {
type CreateServersTransportRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
ProfileId int64 `protobuf:"varint,1,opt,name=profile_id,json=profileId,proto3" json:"profile_id,omitempty"`
AgentId string `protobuf:"bytes,2,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"`
AgentId *string `protobuf:"bytes,2,opt,name=agent_id,json=agentId,proto3,oneof" json:"agent_id,omitempty"`
Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
Config *structpb.Struct `protobuf:"bytes,4,opt,name=config,proto3" json:"config,omitempty"`
Enabled bool `protobuf:"varint,5,opt,name=enabled,proto3" json:"enabled,omitempty"`
@@ -327,8 +327,8 @@ func (x *CreateServersTransportRequest) GetProfileId() int64 {
}
func (x *CreateServersTransportRequest) GetAgentId() string {
if x != nil {
return x.AgentId
if x != nil && x.AgentId != nil {
return *x.AgentId
}
return ""
}
@@ -764,15 +764,16 @@ const file_mantrae_v1_servers_transport_proto_rawDesc = "" +
"\x02id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\x02id\x12>\n" +
"\x04type\x18\x02 \x01(\x0e2 .mantrae.v1.ServersTransportTypeB\b\xbaH\x05\x82\x01\x02\x10\x01R\x04type\"h\n" +
"\x1bGetServersTransportResponse\x12I\n" +
"\x11servers_transport\x18\x01 \x01(\v2\x1c.mantrae.v1.ServersTransportR\x10serversTransport\"\x8a\x02\n" +
"\x11servers_transport\x18\x01 \x01(\v2\x1c.mantrae.v1.ServersTransportR\x10serversTransport\"\x9c\x02\n" +
"\x1dCreateServersTransportRequest\x12&\n" +
"\n" +
"profile_id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\tprofileId\x12\x19\n" +
"\bagent_id\x18\x02 \x01(\tR\aagentId\x12\x1b\n" +
"profile_id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\tprofileId\x12\x1e\n" +
"\bagent_id\x18\x02 \x01(\tH\x00R\aagentId\x88\x01\x01\x12\x1b\n" +
"\x04name\x18\x03 \x01(\tB\a\xbaH\x04r\x02\x10\x01R\x04name\x12/\n" +
"\x06config\x18\x04 \x01(\v2\x17.google.protobuf.StructR\x06config\x12\x18\n" +
"\aenabled\x18\x05 \x01(\bR\aenabled\x12>\n" +
"\x04type\x18\x06 \x01(\x0e2 .mantrae.v1.ServersTransportTypeB\b\xbaH\x05\x82\x01\x02\x10\x01R\x04type\"k\n" +
"\x04type\x18\x06 \x01(\x0e2 .mantrae.v1.ServersTransportTypeB\b\xbaH\x05\x82\x01\x02\x10\x01R\x04typeB\v\n" +
"\t_agent_id\"k\n" +
"\x1eCreateServersTransportResponse\x12I\n" +
"\x11servers_transport\x18\x01 \x01(\v2\x1c.mantrae.v1.ServersTransportR\x10serversTransport\"\xe0\x01\n" +
"\x1dUpdateServersTransportRequest\x12\x17\n" +
@@ -786,12 +787,12 @@ const file_mantrae_v1_servers_transport_proto_rawDesc = "" +
"\x1dDeleteServersTransportRequest\x12\x17\n" +
"\x02id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\x02id\x12>\n" +
"\x04type\x18\x02 \x01(\x0e2 .mantrae.v1.ServersTransportTypeB\b\xbaH\x05\x82\x01\x02\x10\x01R\x04type\" \n" +
"\x1eDeleteServersTransportResponse\"\xf8\x02\n" +
"\x1eDeleteServersTransportResponse\"\xee\x02\n" +
"\x1cListServersTransportsRequest\x12&\n" +
"\n" +
"profile_id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\tprofileId\x12'\n" +
"\bagent_id\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\x01H\x00R\aagentId\x88\x01\x01\x12C\n" +
"\x04type\x18\x03 \x01(\x0e2 .mantrae.v1.ServersTransportTypeB\b\xbaH\x05\x82\x01\x02\x10\x01H\x01R\x04type\x88\x01\x01\x12q\n" +
"\bagent_id\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\x01H\x00R\aagentId\x88\x01\x01\x129\n" +
"\x04type\x18\x03 \x01(\x0e2 .mantrae.v1.ServersTransportTypeH\x01R\x04type\x88\x01\x01\x12q\n" +
"\x05limit\x18\x04 \x01(\x03BV\xbaHS\xba\x01P\n" +
"\vlimit.valid\x12)limit must be either -1 or greater than 0\x1a\x16this == -1 || this > 0H\x02R\x05limit\x88\x01\x01\x12$\n" +
"\x06offset\x18\x05 \x01(\x03B\a\xbaH\x04\"\x02(\x00H\x03R\x06offset\x88\x01\x01B\v\n" +
@@ -885,6 +886,7 @@ func file_mantrae_v1_servers_transport_proto_init() {
if File_mantrae_v1_servers_transport_proto != nil {
return
}
file_mantrae_v1_servers_transport_proto_msgTypes[3].OneofWrappers = []any{}
file_mantrae_v1_servers_transport_proto_msgTypes[9].OneofWrappers = []any{}
type x struct{}
out := protoimpl.TypeBuilder{

View File

@@ -283,7 +283,7 @@ func (x *GetServiceResponse) GetService() *Service {
type CreateServiceRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
ProfileId int64 `protobuf:"varint,1,opt,name=profile_id,json=profileId,proto3" json:"profile_id,omitempty"`
AgentId string `protobuf:"bytes,2,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"`
AgentId *string `protobuf:"bytes,2,opt,name=agent_id,json=agentId,proto3,oneof" json:"agent_id,omitempty"`
Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
Config *structpb.Struct `protobuf:"bytes,4,opt,name=config,proto3" json:"config,omitempty"`
Enabled bool `protobuf:"varint,5,opt,name=enabled,proto3" json:"enabled,omitempty"`
@@ -330,8 +330,8 @@ func (x *CreateServiceRequest) GetProfileId() int64 {
}
func (x *CreateServiceRequest) GetAgentId() string {
if x != nil {
return x.AgentId
if x != nil && x.AgentId != nil {
return *x.AgentId
}
return ""
}
@@ -747,7 +747,7 @@ func (x *ListServicesResponse) GetTotalCount() int64 {
type GetServiceByRouterRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
Type RouterType `protobuf:"varint,2,opt,name=type,proto3,enum=mantrae.v1.RouterType" json:"type,omitempty"`
Type ServiceType `protobuf:"varint,2,opt,name=type,proto3,enum=mantrae.v1.ServiceType" json:"type,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@@ -789,11 +789,11 @@ func (x *GetServiceByRouterRequest) GetName() string {
return ""
}
func (x *GetServiceByRouterRequest) GetType() RouterType {
func (x *GetServiceByRouterRequest) GetType() ServiceType {
if x != nil {
return x.Type
}
return RouterType_ROUTER_TYPE_UNSPECIFIED
return ServiceType_SERVICE_TYPE_UNSPECIFIED
}
type GetServiceByRouterResponse struct {
@@ -845,7 +845,7 @@ var File_mantrae_v1_service_proto protoreflect.FileDescriptor
const file_mantrae_v1_service_proto_rawDesc = "" +
"\n" +
"\x18mantrae/v1/service.proto\x12\n" +
"mantrae.v1\x1a\x1bbuf/validate/validate.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x17mantrae/v1/router.proto\"\xd5\x02\n" +
"mantrae.v1\x1a\x1bbuf/validate/validate.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xd5\x02\n" +
"\aService\x12\x0e\n" +
"\x02id\x18\x01 \x01(\x03R\x02id\x12\x1d\n" +
"\n" +
@@ -863,15 +863,16 @@ const file_mantrae_v1_service_proto_rawDesc = "" +
"\x02id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\x02id\x125\n" +
"\x04type\x18\x02 \x01(\x0e2\x17.mantrae.v1.ServiceTypeB\b\xbaH\x05\x82\x01\x02\x10\x01R\x04type\"C\n" +
"\x12GetServiceResponse\x12-\n" +
"\aservice\x18\x01 \x01(\v2\x13.mantrae.v1.ServiceR\aservice\"\xf8\x01\n" +
"\aservice\x18\x01 \x01(\v2\x13.mantrae.v1.ServiceR\aservice\"\x8a\x02\n" +
"\x14CreateServiceRequest\x12&\n" +
"\n" +
"profile_id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\tprofileId\x12\x19\n" +
"\bagent_id\x18\x02 \x01(\tR\aagentId\x12\x1b\n" +
"profile_id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\tprofileId\x12\x1e\n" +
"\bagent_id\x18\x02 \x01(\tH\x00R\aagentId\x88\x01\x01\x12\x1b\n" +
"\x04name\x18\x03 \x01(\tB\a\xbaH\x04r\x02\x10\x01R\x04name\x12/\n" +
"\x06config\x18\x04 \x01(\v2\x17.google.protobuf.StructR\x06config\x12\x18\n" +
"\aenabled\x18\x05 \x01(\bR\aenabled\x125\n" +
"\x04type\x18\x06 \x01(\x0e2\x17.mantrae.v1.ServiceTypeB\b\xbaH\x05\x82\x01\x02\x10\x01R\x04type\"F\n" +
"\x04type\x18\x06 \x01(\x0e2\x17.mantrae.v1.ServiceTypeB\b\xbaH\x05\x82\x01\x02\x10\x01R\x04typeB\v\n" +
"\t_agent_id\"F\n" +
"\x15CreateServiceResponse\x12-\n" +
"\aservice\x18\x01 \x01(\v2\x13.mantrae.v1.ServiceR\aservice\"\xce\x01\n" +
"\x14UpdateServiceRequest\x12\x17\n" +
@@ -885,12 +886,12 @@ const file_mantrae_v1_service_proto_rawDesc = "" +
"\x14DeleteServiceRequest\x12\x17\n" +
"\x02id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\x02id\x125\n" +
"\x04type\x18\x02 \x01(\x0e2\x17.mantrae.v1.ServiceTypeB\b\xbaH\x05\x82\x01\x02\x10\x01R\x04type\"\x17\n" +
"\x15DeleteServiceResponse\"\xe6\x02\n" +
"\x15DeleteServiceResponse\"\xdc\x02\n" +
"\x13ListServicesRequest\x12&\n" +
"\n" +
"profile_id\x18\x01 \x01(\x03B\a\xbaH\x04\"\x02 \x00R\tprofileId\x12'\n" +
"\bagent_id\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\x01H\x00R\aagentId\x88\x01\x01\x12:\n" +
"\x04type\x18\x03 \x01(\x0e2\x17.mantrae.v1.ServiceTypeB\b\xbaH\x05\x82\x01\x02\x10\x01H\x01R\x04type\x88\x01\x01\x12q\n" +
"\bagent_id\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\x01H\x00R\aagentId\x88\x01\x01\x120\n" +
"\x04type\x18\x03 \x01(\x0e2\x17.mantrae.v1.ServiceTypeH\x01R\x04type\x88\x01\x01\x12q\n" +
"\x05limit\x18\x04 \x01(\x03BV\xbaHS\xba\x01P\n" +
"\vlimit.valid\x12)limit must be either -1 or greater than 0\x1a\x16this == -1 || this > 0H\x02R\x05limit\x88\x01\x01\x12$\n" +
"\x06offset\x18\x05 \x01(\x03B\a\xbaH\x04\"\x02(\x00H\x03R\x06offset\x88\x01\x01B\v\n" +
@@ -901,11 +902,10 @@ const file_mantrae_v1_service_proto_rawDesc = "" +
"\x14ListServicesResponse\x12/\n" +
"\bservices\x18\x01 \x03(\v2\x13.mantrae.v1.ServiceR\bservices\x12\x1f\n" +
"\vtotal_count\x18\x02 \x01(\x03R\n" +
"totalCount\"t\n" +
"\x19GetServiceByRouterRequest\x12\x1e\n" +
"\x04name\x18\x01 \x01(\tB\n" +
"\xbaH\a\xc8\x01\x01r\x02\x10\x01R\x04name\x127\n" +
"\x04type\x18\x02 \x01(\x0e2\x16.mantrae.v1.RouterTypeB\v\xbaH\b\xc8\x01\x01\x82\x01\x02\x10\x01R\x04type\"K\n" +
"totalCount\"o\n" +
"\x19GetServiceByRouterRequest\x12\x1b\n" +
"\x04name\x18\x01 \x01(\tB\a\xbaH\x04r\x02\x10\x01R\x04name\x125\n" +
"\x04type\x18\x02 \x01(\x0e2\x17.mantrae.v1.ServiceTypeB\b\xbaH\x05\x82\x01\x02\x10\x01R\x04type\"K\n" +
"\x1aGetServiceByRouterResponse\x12-\n" +
"\aservice\x18\x01 \x01(\v2\x13.mantrae.v1.ServiceR\aservice*n\n" +
"\vServiceType\x12\x1c\n" +
@@ -956,7 +956,6 @@ var file_mantrae_v1_service_proto_goTypes = []any{
(*GetServiceByRouterResponse)(nil), // 13: mantrae.v1.GetServiceByRouterResponse
(*structpb.Struct)(nil), // 14: google.protobuf.Struct
(*timestamppb.Timestamp)(nil), // 15: google.protobuf.Timestamp
(RouterType)(0), // 16: mantrae.v1.RouterType
}
var file_mantrae_v1_service_proto_depIdxs = []int32{
14, // 0: mantrae.v1.Service.config:type_name -> google.protobuf.Struct
@@ -974,7 +973,7 @@ var file_mantrae_v1_service_proto_depIdxs = []int32{
0, // 12: mantrae.v1.DeleteServiceRequest.type:type_name -> mantrae.v1.ServiceType
0, // 13: mantrae.v1.ListServicesRequest.type:type_name -> mantrae.v1.ServiceType
1, // 14: mantrae.v1.ListServicesResponse.services:type_name -> mantrae.v1.Service
16, // 15: mantrae.v1.GetServiceByRouterRequest.type:type_name -> mantrae.v1.RouterType
0, // 15: mantrae.v1.GetServiceByRouterRequest.type:type_name -> mantrae.v1.ServiceType
1, // 16: mantrae.v1.GetServiceByRouterResponse.service:type_name -> mantrae.v1.Service
2, // 17: mantrae.v1.ServiceService.GetService:input_type -> mantrae.v1.GetServiceRequest
4, // 18: mantrae.v1.ServiceService.CreateService:input_type -> mantrae.v1.CreateServiceRequest
@@ -1000,7 +999,7 @@ func file_mantrae_v1_service_proto_init() {
if File_mantrae_v1_service_proto != nil {
return
}
file_mantrae_v1_router_proto_init()
file_mantrae_v1_service_proto_msgTypes[3].OneofWrappers = []any{}
file_mantrae_v1_service_proto_msgTypes[9].OneofWrappers = []any{}
type x struct{}
out := protoimpl.TypeBuilder{

View File

@@ -735,7 +735,7 @@ type CreateUserRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"`
Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"`
Email *string `protobuf:"bytes,3,opt,name=email,proto3,oneof" json:"email,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@@ -785,8 +785,8 @@ func (x *CreateUserRequest) GetPassword() string {
}
func (x *CreateUserRequest) GetEmail() string {
if x != nil {
return x.Email
if x != nil && x.Email != nil {
return *x.Email
}
return ""
}
@@ -839,8 +839,8 @@ type UpdateUserRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"`
Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"`
Password *string `protobuf:"bytes,5,opt,name=password,proto3,oneof" json:"password,omitempty"`
Email *string `protobuf:"bytes,3,opt,name=email,proto3,oneof" json:"email,omitempty"`
Password *string `protobuf:"bytes,4,opt,name=password,proto3,oneof" json:"password,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@@ -890,8 +890,8 @@ func (x *UpdateUserRequest) GetUsername() string {
}
func (x *UpdateUserRequest) GetEmail() string {
if x != nil {
return x.Email
if x != nil && x.Email != nil {
return *x.Email
}
return ""
}
@@ -1280,19 +1280,23 @@ const file_mantrae_v1_user_proto_rawDesc = "" +
"\n" +
"identifier\"7\n" +
"\x0fGetUserResponse\x12$\n" +
"\x04user\x18\x01 \x01(\v2\x10.mantrae.v1.UserR\x04user\"|\n" +
"\x04user\x18\x01 \x01(\v2\x10.mantrae.v1.UserR\x04user\"\x8e\x01\n" +
"\x11CreateUserRequest\x12#\n" +
"\busername\x18\x01 \x01(\tB\a\xbaH\x04r\x02\x10\x03R\busername\x12#\n" +
"\bpassword\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\bR\bpassword\x12\x1d\n" +
"\x05email\x18\x03 \x01(\tB\a\xbaH\x04r\x02`\x01R\x05email\":\n" +
"\bpassword\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\bR\bpassword\x12%\n" +
"\x05email\x18\x03 \x01(\tB\n" +
"\xbaH\a\xd8\x01\x00r\x02`\x01H\x00R\x05email\x88\x01\x01B\b\n" +
"\x06_email\":\n" +
"\x12CreateUserResponse\x12$\n" +
"\x04user\x18\x01 \x01(\v2\x10.mantrae.v1.UserR\x04user\"\xaa\x01\n" +
"\x04user\x18\x01 \x01(\v2\x10.mantrae.v1.UserR\x04user\"\xbc\x01\n" +
"\x11UpdateUserRequest\x12\x17\n" +
"\x02id\x18\x01 \x01(\tB\a\xbaH\x04r\x02\x10\x01R\x02id\x12#\n" +
"\busername\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\x03R\busername\x12\x1d\n" +
"\x05email\x18\x03 \x01(\tB\a\xbaH\x04r\x02`\x01R\x05email\x12+\n" +
"\bpassword\x18\x05 \x01(\tB\n" +
"\xbaH\a\xd8\x01\x01r\x02\x10\bH\x00R\bpassword\x88\x01\x01B\v\n" +
"\busername\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\x03R\busername\x12%\n" +
"\x05email\x18\x03 \x01(\tB\n" +
"\xbaH\a\xd8\x01\x00r\x02`\x01H\x00R\x05email\x88\x01\x01\x12+\n" +
"\bpassword\x18\x04 \x01(\tB\n" +
"\xbaH\a\xd8\x01\x00r\x02\x10\bH\x01R\bpassword\x88\x01\x01B\b\n" +
"\x06_emailB\v\n" +
"\t_password\":\n" +
"\x12UpdateUserResponse\x12$\n" +
"\x04user\x18\x01 \x01(\v2\x10.mantrae.v1.UserR\x04user\",\n" +
@@ -1430,6 +1434,7 @@ func file_mantrae_v1_user_proto_init() {
(*GetUserRequest_Username)(nil),
(*GetUserRequest_Email)(nil),
}
file_mantrae_v1_user_proto_msgTypes[11].OneofWrappers = []any{}
file_mantrae_v1_user_proto_msgTypes[13].OneofWrappers = []any{}
file_mantrae_v1_user_proto_msgTypes[17].OneofWrappers = []any{}
type x struct{}

File diff suppressed because it is too large Load Diff

View File

@@ -55,10 +55,7 @@ message UpdateEntryPointResponse {
}
message DeleteEntryPointRequest {
int64 id = 1 [
(buf.validate.field).required = true,
(buf.validate.field).int64.gt = 0
];
int64 id = 1 [(buf.validate.field).int64.gt = 0];
}
message DeleteEntryPointResponse {}

View File

@@ -1,83 +0,0 @@
syntax = "proto3";
package mantrae.v1;
import "buf/validate/validate.proto";
import "google/protobuf/timestamp.proto";
import "mantrae/v1/agent.proto";
import "mantrae/v1/auditlog.proto";
import "mantrae/v1/dns_provider.proto";
import "mantrae/v1/entry_point.proto";
import "mantrae/v1/middleware.proto";
import "mantrae/v1/router.proto";
import "mantrae/v1/service.proto";
import "mantrae/v1/user.proto";
service EventService {
// Profile-scoped events (routers, services, middlewares, entrypoints)
rpc ProfileEvents(ProfileEventsRequest) returns (stream ProfileEventsResponse);
// Global events (users, dns)
rpc GlobalEvents(GlobalEventsRequest) returns (stream GlobalEventsResponse);
}
enum EventType {
EVENT_TYPE_UNSPECIFIED = 0;
EVENT_TYPE_CREATED = 1;
EVENT_TYPE_UPDATED = 2;
EVENT_TYPE_DELETED = 3;
}
enum ResourceType {
RESOURCE_TYPE_UNSPECIFIED = 0;
RESOURCE_TYPE_ROUTER = 1;
RESOURCE_TYPE_SERVICE = 2;
RESOURCE_TYPE_MIDDLEWARE = 3;
RESOURCE_TYPE_ENTRY_POINT = 4;
RESOURCE_TYPE_AUDIT_LOG = 5;
RESOURCE_TYPE_AGENT = 6;
RESOURCE_TYPE_USER = 7;
RESOURCE_TYPE_DNS_PROVIDER = 8;
}
message ProfileEvent {
EventType event_type = 1;
ResourceType resource_type = 2;
int64 profile_id = 3;
google.protobuf.Timestamp timestamp = 4;
oneof resource {
Router router = 10;
Service service = 11;
Middleware middleware = 12;
EntryPoint entry_point = 13;
Agent agent = 14;
AuditLog audit_log = 15;
}
}
message GlobalEvent {
EventType event_type = 1;
ResourceType resource_type = 2;
google.protobuf.Timestamp timestamp = 3;
oneof resource {
User user = 10;
DnsProvider dns_provider = 11;
}
}
message ProfileEventsRequest {
int64 profile_id = 1 [(buf.validate.field).int64.gt = 0];
repeated ResourceType resource_types = 2; // Filter by specific resource types
}
message ProfileEventsResponse {
ProfileEvent event = 1;
}
message GlobalEventsRequest {
repeated ResourceType resource_types = 1; // Filter by specific resource types
}
message GlobalEventsResponse {
GlobalEvent event = 1;
}

View File

@@ -74,7 +74,7 @@ message GetMiddlewareResponse {
message CreateMiddlewareRequest {
int64 profile_id = 1 [(buf.validate.field).int64.gt = 0];
string agent_id = 2;
optional string agent_id = 2;
string name = 3 [(buf.validate.field).string.min_len = 1];
MiddlewareType type = 4 [(buf.validate.field).enum.defined_only = true];
bool is_default = 5;
@@ -105,7 +105,7 @@ message DeleteMiddlewareResponse {}
message ListMiddlewaresRequest {
int64 profile_id = 1 [(buf.validate.field).int64.gt = 0];
optional string agent_id = 2 [(buf.validate.field).string.min_len = 1];
optional MiddlewareType type = 3 [(buf.validate.field).enum.defined_only = true];
optional MiddlewareType type = 3;
optional int64 limit = 4 [(buf.validate.field).cel = {
id: "limit.valid"
message: "limit must be either -1 or greater than 0"

View File

@@ -49,7 +49,7 @@ message GetRouterResponse {
message CreateRouterRequest {
int64 profile_id = 1 [(buf.validate.field).int64.gt = 0];
string agent_id = 2;
optional string agent_id = 2;
string name = 3 [(buf.validate.field).string.min_len = 1];
google.protobuf.Struct config = 4;
bool enabled = 5;
@@ -80,7 +80,7 @@ message DeleteRouterResponse {}
message ListRoutersRequest {
int64 profile_id = 1 [(buf.validate.field).int64.gt = 0];
optional string agent_id = 2 [(buf.validate.field).string.min_len = 1];
optional RouterType type = 3 [(buf.validate.field).enum.defined_only = true];
optional RouterType type = 3;
optional int64 limit = 4 [(buf.validate.field).cel = {
id: "limit.valid"
message: "limit must be either -1 or greater than 0"

View File

@@ -46,7 +46,7 @@ message GetServersTransportResponse {
message CreateServersTransportRequest {
int64 profile_id = 1 [(buf.validate.field).int64.gt = 0];
string agent_id = 2;
optional string agent_id = 2;
string name = 3 [(buf.validate.field).string.min_len = 1];
google.protobuf.Struct config = 4;
bool enabled = 5;
@@ -76,7 +76,7 @@ message DeleteServersTransportResponse {}
message ListServersTransportsRequest {
int64 profile_id = 1 [(buf.validate.field).int64.gt = 0];
optional string agent_id = 2 [(buf.validate.field).string.min_len = 1];
optional ServersTransportType type = 3 [(buf.validate.field).enum.defined_only = true];
optional ServersTransportType type = 3;
optional int64 limit = 4 [(buf.validate.field).cel = {
id: "limit.valid"
message: "limit must be either -1 or greater than 0"

View File

@@ -5,7 +5,6 @@ package mantrae.v1;
import "buf/validate/validate.proto";
import "google/protobuf/struct.proto";
import "google/protobuf/timestamp.proto";
import "mantrae/v1/router.proto";
service ServiceService {
rpc GetService(GetServiceRequest) returns (GetServiceResponse) {
@@ -51,7 +50,7 @@ message GetServiceResponse {
message CreateServiceRequest {
int64 profile_id = 1 [(buf.validate.field).int64.gt = 0];
string agent_id = 2;
optional string agent_id = 2;
string name = 3 [(buf.validate.field).string.min_len = 1];
google.protobuf.Struct config = 4;
bool enabled = 5;
@@ -81,7 +80,7 @@ message DeleteServiceResponse {}
message ListServicesRequest {
int64 profile_id = 1 [(buf.validate.field).int64.gt = 0];
optional string agent_id = 2 [(buf.validate.field).string.min_len = 1];
optional ServiceType type = 3 [(buf.validate.field).enum.defined_only = true];
optional ServiceType type = 3;
optional int64 limit = 4 [(buf.validate.field).cel = {
id: "limit.valid"
message: "limit must be either -1 or greater than 0"
@@ -95,14 +94,8 @@ message ListServicesResponse {
}
message GetServiceByRouterRequest {
string name = 1 [
(buf.validate.field).required = true,
(buf.validate.field).string.min_len = 1
];
RouterType type = 2 [
(buf.validate.field).required = true,
(buf.validate.field).enum.defined_only = true
];
string name = 1 [(buf.validate.field).string.min_len = 1];
ServiceType type = 2 [(buf.validate.field).enum.defined_only = true];
}
message GetServiceByRouterResponse {
Service service = 1;

Some files were not shown because too many files have changed in this diff Show More