diff --git a/Makefile b/Makefile index 6796076..cb36a42 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/buf.lock b/buf.lock index bd1c261..6013ba0 100644 --- a/buf.lock +++ b/buf.lock @@ -2,5 +2,5 @@ version: v2 deps: - name: buf.build/bufbuild/protovalidate - commit: 9f2d3c737feb481a83375159c0733275 - digest: b5:19d3b83f7df2d284ff5935f4622d7f27e7464a93c210edb536e92a52bcc69b2a18da1312e96b5461601eba7b3764d5e90321bd62e6966870e7dbc2e4dedd98d6 + commit: 6c6e0d3c608e4549802254a2eee81bc8 + digest: b5:a7ca081f38656fc0f5aaa685cc111d3342876723851b47ca6b80cbb810cbb2380f8c444115c495ada58fa1f85eff44e68dc54a445761c195acdb5e8d9af675b6 diff --git a/buf.yaml b/buf.yaml index a96d631..c638766 100644 --- a/buf.yaml +++ b/buf.yaml @@ -9,4 +9,4 @@ breaking: use: - FILE deps: - - buf.build/bufbuild/protovalidate:v0.13.3 + - buf.build/bufbuild/protovalidate:v0.14.2 diff --git a/go.mod b/go.mod index 9ab3761..99b3425 100644 --- a/go.mod +++ b/go.mod @@ -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 ) diff --git a/go.sum b/go.sum index e100e10..af33064 100644 --- a/go.sum +++ b/go.sum @@ -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= diff --git a/internal/api/handler/upload.go b/internal/api/handler/upload.go index 0f1c273..8416ee6 100644 --- a/internal/api/handler/upload.go +++ b/internal/api/handler/upload.go @@ -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 } diff --git a/internal/api/server/server.go b/internal/api/server/server.go index c88ebe0..0b96c3c 100644 --- a/internal/api/server/server.go +++ b/internal/api/server/server.go @@ -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) diff --git a/internal/api/service/agent.go b/internal/api/service/agent.go index a63803e..e707012 100644 --- a/internal/api/service/agent.go +++ b/internal/api/service/agent.go @@ -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 } diff --git a/internal/api/service/auditlog.go b/internal/api/service/auditlog.go index 3396cd8..4b8eacd 100644 --- a/internal/api/service/auditlog.go +++ b/internal/api/service/auditlog.go @@ -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 } diff --git a/internal/api/service/backup.go b/internal/api/service/backup.go index 0cc1e6e..3aa6c94 100644 --- a/internal/api/service/backup.go +++ b/internal/api/service/backup.go @@ -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 diff --git a/internal/api/service/dns.go b/internal/api/service/dns.go index c3a4989..6456a13 100644 --- a/internal/api/service/dns.go +++ b/internal/api/service/dns.go @@ -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 } diff --git a/internal/api/service/entrypoint.go b/internal/api/service/entrypoint.go index 78bf52b..48beb1e 100644 --- a/internal/api/service/entrypoint.go +++ b/internal/api/service/entrypoint.go @@ -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 } diff --git a/internal/api/service/event.go b/internal/api/service/event.go deleted file mode 100644 index bb92826..0000000 --- a/internal/api/service/event.go +++ /dev/null @@ -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 - } - } - } -} diff --git a/internal/api/service/middleware.go b/internal/api/service/middleware.go index 5ff60f7..d6cfd66 100644 --- a/internal/api/service/middleware.go +++ b/internal/api/service/middleware.go @@ -11,382 +11,143 @@ 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 + 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) - } + ops, ok := s.dispatch[req.Msg.Type] + if !ok { + return nil, connect.NewError( + connect.CodeInvalidArgument, + errors.New("invalid middleware type"), + ) } - return connect.NewResponse(&mantraev1.DeleteMiddlewareResponse{}), nil + 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) { - 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: + 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) } - } - return connect.NewResponse(&mantraev1.ListMiddlewaresResponse{ - Middlewares: middlewares, - TotalCount: totalCount, - }), nil + // 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: allMiddlewares, + TotalCount: totalCount, + }), nil + } } func (s *MiddlewareService) GetMiddlewarePlugins( @@ -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 -} diff --git a/internal/api/service/middleware_ops.go b/internal/api/service/middleware_ops.go new file mode 100644 index 0000000..9b87238 --- /dev/null +++ b/internal/api/service/middleware_ops.go @@ -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 +} diff --git a/internal/api/service/profile.go b/internal/api/service/profile.go index 1e09133..89fc497 100644 --- a/internal/api/service/profile.go +++ b/internal/api/service/profile.go @@ -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 } diff --git a/internal/api/service/router.go b/internal/api/service/router.go index 7f9d26d..b1bc0b4 100644 --- a/internal/api/service/router.go +++ b/internal/api/service/router.go @@ -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 + 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 - - switch req.Msg.Type { - case mantraev1.RouterType_ROUTER_TYPE_HTTP: - resRouter, err := s.app.Conn.GetQuery().GetHttpRouter(ctx, req.Msg.Id) - 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")) + ops, ok := s.dispatch[req.Msg.Type] + if !ok { + return nil, connect.NewError( + connect.CodeInvalidArgument, + errors.New("invalid router type"), + ) } - return connect.NewResponse(&mantraev1.GetRouterResponse{Router: router}), 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 *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 - } - - 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) - 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")) + ops, ok := s.dispatch[req.Msg.Type] + if !ok { + 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 + result, err := ops.Create(ctx, req.Msg) + if err != nil { + return nil, connect.NewError(connect.CodeInternal, err) + } + 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) - } - 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.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")) + ops, ok := s.dispatch[req.Msg.Type] + if !ok { + 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 + result, err := ops.Update(ctx, req.Msg) + if err != nil { + return nil, connect.NewError(connect.CodeInternal, err) + } + 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) - } - } - - case mantraev1.RouterType_ROUTER_TYPE_TCP: - result, err := s.app.Conn.GetQuery().GetTcpRouter(ctx, req.Msg.Id) - 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")) + ops, ok := s.dispatch[req.Msg.Type] + if !ok { + 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 + result, err := ops.Delete(ctx, req.Msg) + if err != nil { + return nil, connect.NewError(connect.CodeInternal, err) + } + 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 - } - - 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, - }) - 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()) - } 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, - }) - 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) - 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) - 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 req.Msg.Type != nil { + ops, ok := s.dispatch[*req.Msg.Type] + if !ok { + return nil, connect.NewError( + connect.CodeInvalidArgument, + errors.New("invalid router 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 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) } - } - return connect.NewResponse(&mantraev1.ListRoutersResponse{ - Routers: routers, - TotalCount: totalCount, - }), nil + // 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) + } + + // 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) + } + + // 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: allRouters, + TotalCount: totalCount, + }), nil + } } diff --git a/internal/api/service/router_ops.go b/internal/api/service/router_ops.go new file mode 100644 index 0000000..dbe3887 --- /dev/null +++ b/internal/api/service/router_ops.go @@ -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 +} diff --git a/internal/api/service/servers_transport.go b/internal/api/service/servers_transport.go index 4352c3c..11e265e 100644 --- a/internal/api/service/servers_transport.go +++ b/internal/api/service/servers_transport.go @@ -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 + 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 - - switch req.Msg.Type { - case mantraev1.ServersTransportType_SERVERS_TRANSPORT_TYPE_HTTP: - result, err := s.app.Conn.GetQuery().GetHttpServersTransport(ctx, req.Msg.Id) - 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") + ops, ok := s.dispatch[req.Msg.Type] + if !ok { + return nil, connect.NewError( + connect.CodeInvalidArgument, + errors.New("invalid servers transport type"), + ) } - return connect.NewResponse( - &mantraev1.GetServersTransportResponse{ServersTransport: serversTransport}, - ), nil + result, err := ops.Get(ctx, req.Msg) + if err != nil { + return nil, err + } + 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 - } - - params.Config, err = convert.UnmarshalStruct[schema.HTTPServersTransport](req.Msg.Config) - 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") + ops, ok := s.dispatch[req.Msg.Type] + if !ok { + return nil, connect.NewError( + connect.CodeInvalidArgument, + errors.New("invalid servers transport type"), + ) } - return connect.NewResponse( - &mantraev1.CreateServersTransportResponse{ServersTransport: serversTransport}, - ), nil + result, err := ops.Create(ctx, req.Msg) + if err != nil { + return nil, err + } + 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 - - 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) - 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") + ops, ok := s.dispatch[req.Msg.Type] + if !ok { + return nil, connect.NewError( + connect.CodeInvalidArgument, + errors.New("invalid servers transport type"), + ) } - return connect.NewResponse( - &mantraev1.UpdateServersTransportResponse{ServersTransport: serversTransport}, - ), nil + result, err := ops.Update(ctx, req.Msg) + if err != nil { + return nil, err + } + 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 { - 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") + ops, ok := s.dispatch[req.Msg.Type] + if !ok { + return nil, connect.NewError( + connect.CodeInvalidArgument, + errors.New("invalid servers transport type"), + ) } - return connect.NewResponse(&mantraev1.DeleteServersTransportResponse{}), nil + result, err := ops.Delete(ctx, req.Msg) + if err != nil { + return nil, err + } + 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) - if err != nil { - return nil, connect.NewError(connect.CodeInternal, 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) - } else { - totalCount, err = s.app.Conn.GetQuery().CountTcpServersTransportsByAgent(ctx, req.Msg.AgentId) - 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) - } - - default: - return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("invalid servers transport type")) } + result, err := ops.List(ctx, req.Msg) if err != nil { - return nil, connect.NewError(connect.CodeInternal, err) + return nil, err + } + return connect.NewResponse(result), nil + } else { + // 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, err } - } - return connect.NewResponse(&mantraev1.ListServersTransportsResponse{ - ServersTransports: serversTransports, - TotalCount: totalCount, - }), nil + // 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 + } + + // Combine results + allServersTransports := append(httpResult.ServersTransports, tcpResult.ServersTransports...) + totalCount := httpResult.TotalCount + tcpResult.TotalCount + + return connect.NewResponse(&mantraev1.ListServersTransportsResponse{ + ServersTransports: allServersTransports, + TotalCount: totalCount, + }), nil + } } diff --git a/internal/api/service/servers_transport_ops.go b/internal/api/service/servers_transport_ops.go new file mode 100644 index 0000000..14d28eb --- /dev/null +++ b/internal/api/service/servers_transport_ops.go @@ -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 +} diff --git a/internal/api/service/service.go b/internal/api/service/service.go index d56f84a..2478f47 100644 --- a/internal/api/service/service.go +++ b/internal/api/service/service.go @@ -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 + 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 - - switch req.Msg.Type { - case mantraev1.ServiceType_SERVICE_TYPE_HTTP: - result, err := s.app.Conn.GetQuery().GetHttpService(ctx, req.Msg.Id) - 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) + ops, ok := s.dispatch[req.Msg.Type] + if !ok { + return nil, connect.NewError( + connect.CodeInvalidArgument, + errors.New("invalid service type"), + ) } - return connect.NewResponse(&mantraev1.GetServiceResponse{Service: service}), 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 *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) - } - - result, err := s.app.Conn.GetQuery().CreateHttpService(ctx, params) - 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) + ops, ok := s.dispatch[req.Msg.Type] + if !ok { + return nil, connect.NewError( + connect.CodeInvalidArgument, + errors.New("invalid service type"), + ) } - return connect.NewResponse(&mantraev1.CreateServiceResponse{Service: service}), 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 *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) - } - - result, err := s.app.Conn.GetQuery().UpdateHttpService(ctx, params) - 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) + ops, ok := s.dispatch[req.Msg.Type] + if !ok { + return nil, connect.NewError( + connect.CodeInvalidArgument, + errors.New("invalid service type"), + ) } - return connect.NewResponse(&mantraev1.UpdateServiceResponse{Service: service}), 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 *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 - } - - 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, - }) - 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) - } 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, - }) - 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) - 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) - 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 req.Msg.Type != nil { + ops, ok := s.dispatch[*req.Msg.Type] + if !ok { + return nil, connect.NewError( + connect.CodeInvalidArgument, + errors.New("invalid service 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 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) } - } - return connect.NewResponse(&mantraev1.ListServicesResponse{ - Services: services, - TotalCount: totalCount, - }), nil + // 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) + } + + // 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) + } + + // 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: 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 } diff --git a/internal/api/service/service_ops.go b/internal/api/service/service_ops.go new file mode 100644 index 0000000..a035b13 --- /dev/null +++ b/internal/api/service/service_ops.go @@ -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 +} diff --git a/internal/api/service/setting.go b/internal/api/service/setting.go index 2e905be..91765f7 100644 --- a/internal/api/service/setting.go +++ b/internal/api/service/setting.go @@ -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 } diff --git a/internal/api/service/user.go b/internal/api/service/user.go index ba4544f..9fcdbe3 100644 --- a/internal/api/service/user.go +++ b/internal/api/service/user.go @@ -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 } diff --git a/internal/api/service/util.go b/internal/api/service/util.go index d8d5ed0..cbf6c42 100644 --- a/internal/api/service/util.go +++ b/internal/api/service/util.go @@ -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, diff --git a/internal/config/flags.go b/internal/config/flags.go index 514602f..fa85f85 100644 --- a/internal/config/flags.go +++ b/internal/config/flags.go @@ -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) } diff --git a/internal/config/flags_dev.go b/internal/config/flags_dev.go new file mode 100644 index 0000000..e5c3392 --- /dev/null +++ b/internal/config/flags_dev.go @@ -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) +} diff --git a/internal/config/setup.go b/internal/config/setup.go index 8092fee..529af55 100644 --- a/internal/config/setup.go +++ b/internal/config/setup.go @@ -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) } diff --git a/internal/config/tasks.go b/internal/config/tasks.go index 39d859a..2476fe8 100644 --- a/internal/config/tasks.go +++ b/internal/config/tasks.go @@ -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 diff --git a/internal/config/zod.go b/internal/config/zod_dev.go similarity index 97% rename from internal/config/zod.go rename to internal/config/zod_dev.go index 8761523..3446ec2 100644 --- a/internal/config/zod.go +++ b/internal/config/zod_dev.go @@ -1,3 +1,6 @@ +//go:build dev +// +build dev + package config import ( diff --git a/internal/convert/agent.go b/internal/convert/agent.go deleted file mode 100644 index bedeac8..0000000 --- a/internal/convert/agent.go +++ /dev/null @@ -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 -} diff --git a/internal/convert/auditlog.go b/internal/convert/auditlog.go deleted file mode 100644 index 3db5efb..0000000 --- a/internal/convert/auditlog.go +++ /dev/null @@ -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 -} diff --git a/internal/convert/common.go b/internal/convert/common.go deleted file mode 100644 index 7255dd8..0000000 --- a/internal/convert/common.go +++ /dev/null @@ -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 -} diff --git a/internal/convert/dns.go b/internal/convert/dns.go deleted file mode 100644 index 7ed6b81..0000000 --- a/internal/convert/dns.go +++ /dev/null @@ -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 -} diff --git a/internal/convert/dynamic.go b/internal/convert/dynamic.go deleted file mode 100644 index 6f1cca4..0000000 --- a/internal/convert/dynamic.go +++ /dev/null @@ -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 -} diff --git a/internal/convert/entrypoint.go b/internal/convert/entrypoint.go deleted file mode 100644 index 82fd0f2..0000000 --- a/internal/convert/entrypoint.go +++ /dev/null @@ -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 -} diff --git a/internal/convert/middleware.go b/internal/convert/middleware.go deleted file mode 100644 index a94df77..0000000 --- a/internal/convert/middleware.go +++ /dev/null @@ -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 -} diff --git a/internal/convert/profile.go b/internal/convert/profile.go deleted file mode 100644 index 76cb085..0000000 --- a/internal/convert/profile.go +++ /dev/null @@ -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 -} diff --git a/internal/convert/router.go b/internal/convert/router.go deleted file mode 100644 index 88b0f04..0000000 --- a/internal/convert/router.go +++ /dev/null @@ -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 -} diff --git a/internal/convert/servers_transport.go b/internal/convert/servers_transport.go deleted file mode 100644 index e1c7cfa..0000000 --- a/internal/convert/servers_transport.go +++ /dev/null @@ -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 -} diff --git a/internal/convert/service.go b/internal/convert/service.go deleted file mode 100644 index a9b201b..0000000 --- a/internal/convert/service.go +++ /dev/null @@ -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 -} diff --git a/internal/convert/user.go b/internal/convert/user.go deleted file mode 100644 index 2435412..0000000 --- a/internal/convert/user.go +++ /dev/null @@ -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 -} diff --git a/internal/events/broadcaster.go b/internal/events/broadcaster.go deleted file mode 100644 index b50feae..0000000 --- a/internal/events/broadcaster.go +++ /dev/null @@ -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 -} diff --git a/internal/store/db/agents.sql.go b/internal/store/db/agents.sql.go index 10bf8c8..5788b0b 100644 --- a/internal/store/db/agents.sql.go +++ b/internal/store/db/agents.sql.go @@ -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"` + ProfileID int64 `json:"profileId"` + 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 } diff --git a/internal/store/db/audit_logs.sql.go b/internal/store/db/audit_logs.sql.go index 0a53ecd..c76da98 100644 --- a/internal/store/db/audit_logs.sql.go +++ b/internal/store/db/audit_logs.sql.go @@ -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 } diff --git a/internal/store/db/conversion.go b/internal/store/db/conversion.go new file mode 100644 index 0000000..2739296 --- /dev/null +++ b/internal/store/db/conversion.go @@ -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 +} diff --git a/internal/store/db/db.go b/internal/store/db/db.go index 4a478e5..08a02ec 100644 --- a/internal/store/db/db.go +++ b/internal/store/db/db.go @@ -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) @@ -1650,409 +1378,341 @@ func (q *Queries) queryRow(ctx context.Context, stmt *sql.Stmt, query string, ar } type Queries struct { - db DBTX - tx *sql.Tx - countAgentsStmt *sql.Stmt - countAuditLogsStmt *sql.Stmt - 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 - countServersTransportsByAgentStmt *sql.Stmt - countServersTransportsByProfileStmt *sql.Stmt - 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 - createDnsProviderStmt *sql.Stmt - createEntryPointStmt *sql.Stmt - createHttpMiddlewareStmt *sql.Stmt - createHttpRouterStmt *sql.Stmt - createHttpRouterDNSProviderStmt *sql.Stmt - createHttpServersTransportStmt *sql.Stmt - createHttpServiceStmt *sql.Stmt - createProfileStmt *sql.Stmt - createTcpMiddlewareStmt *sql.Stmt - createTcpRouterStmt *sql.Stmt - createTcpRouterDNSProviderStmt *sql.Stmt - createTcpServersTransportStmt *sql.Stmt - createTcpServiceStmt *sql.Stmt - createUdpRouterStmt *sql.Stmt - createUdpServiceStmt *sql.Stmt - createUserStmt *sql.Stmt - deleteAgentStmt *sql.Stmt - deleteDnsProviderStmt *sql.Stmt - deleteEntryPointByIDStmt *sql.Stmt - deleteErrorByIdStmt *sql.Stmt - deleteErrorsByProfileStmt *sql.Stmt - deleteErrorsByProfileCategoryStmt *sql.Stmt - deleteHttpMiddlewareStmt *sql.Stmt - deleteHttpRouterStmt *sql.Stmt - deleteHttpRouterDNSProviderStmt *sql.Stmt - deleteHttpServersTransportStmt *sql.Stmt - deleteHttpServiceStmt *sql.Stmt - deleteOldAuditLogsStmt *sql.Stmt - deleteProfileStmt *sql.Stmt - deleteSettingStmt *sql.Stmt - deleteTcpMiddlewareStmt *sql.Stmt - deleteTcpRouterStmt *sql.Stmt - deleteTcpRouterDNSProviderStmt *sql.Stmt - deleteTcpServersTransportStmt *sql.Stmt - deleteTcpServiceStmt *sql.Stmt - deleteTraefikInstanceByIDStmt *sql.Stmt - deleteUdpRouterStmt *sql.Stmt - deleteUdpServiceStmt *sql.Stmt - deleteUserStmt *sql.Stmt - getAgentStmt *sql.Stmt - getDefaultDNSProviderStmt *sql.Stmt - getDefaultEntryPointStmt *sql.Stmt - getDnsProviderStmt *sql.Stmt - getDnsProviderByNameStmt *sql.Stmt - getDnsProvidersByHttpRouterStmt *sql.Stmt - getDnsProvidersByTcpRouterStmt *sql.Stmt - getEntryPointStmt *sql.Stmt - getErrorsByProfileStmt *sql.Stmt - getHttpMiddlewareStmt *sql.Stmt - getHttpRouterStmt *sql.Stmt - getHttpRouterDomainsStmt *sql.Stmt - getHttpRoutersUsingEntryPointStmt *sql.Stmt - getHttpRoutersUsingMiddlewareStmt *sql.Stmt - getHttpServersTransportStmt *sql.Stmt - getHttpServiceStmt *sql.Stmt - getHttpServiceByNameStmt *sql.Stmt - getProfileStmt *sql.Stmt - getProfileByNameStmt *sql.Stmt - getSettingStmt *sql.Stmt - getTcpMiddlewareStmt *sql.Stmt - getTcpRouterStmt *sql.Stmt - getTcpRouterDomainsStmt *sql.Stmt - getTcpRoutersUsingEntryPointStmt *sql.Stmt - getTcpRoutersUsingMiddlewareStmt *sql.Stmt - getTcpServersTransportStmt *sql.Stmt - getTcpServiceStmt *sql.Stmt - getTcpServiceByNameStmt *sql.Stmt - getTraefikInstanceByIDStmt *sql.Stmt - getTraefikInstanceByNameStmt *sql.Stmt - getUdpRouterStmt *sql.Stmt - getUdpRoutersUsingEntryPointStmt *sql.Stmt - getUdpServiceStmt *sql.Stmt - getUdpServiceByNameStmt *sql.Stmt - getUserByEmailStmt *sql.Stmt - getUserByIDStmt *sql.Stmt - getUserByUsernameStmt *sql.Stmt - listAgentsStmt *sql.Stmt - listAuditLogsStmt *sql.Stmt - listDnsProvidersStmt *sql.Stmt - 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 - listServersTransportsByAgentStmt *sql.Stmt - listServersTransportsByProfileStmt *sql.Stmt - listServicesByAgentStmt *sql.Stmt - 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 - purgeTraefikInstancesStmt *sql.Stmt - unsetDefaultDNSProviderStmt *sql.Stmt - unsetDefaultEntryPointStmt *sql.Stmt - unsetDefaultHttpMiddlewareStmt *sql.Stmt - unsetDefaultTcpMiddlewareStmt *sql.Stmt - updateAgentStmt *sql.Stmt - updateAgentIPStmt *sql.Stmt - updateAgentTokenStmt *sql.Stmt - updateDnsProviderStmt *sql.Stmt - updateEntryPointStmt *sql.Stmt - updateHttpMiddlewareStmt *sql.Stmt - updateHttpRouterStmt *sql.Stmt - updateHttpServersTransportStmt *sql.Stmt - updateHttpServiceStmt *sql.Stmt - updateProfileStmt *sql.Stmt - updateTcpMiddlewareStmt *sql.Stmt - updateTcpRouterStmt *sql.Stmt - updateTcpServersTransportStmt *sql.Stmt - updateTcpServiceStmt *sql.Stmt - updateUdpRouterStmt *sql.Stmt - updateUdpServiceStmt *sql.Stmt - updateUserStmt *sql.Stmt - updateUserLastLoginStmt *sql.Stmt - updateUserPasswordStmt *sql.Stmt - updateUserResetTokenStmt *sql.Stmt - upsertSettingStmt *sql.Stmt - upsertTraefikInstanceStmt *sql.Stmt + db DBTX + tx *sql.Tx + countAgentsStmt *sql.Stmt + countAuditLogsStmt *sql.Stmt + countDnsProvidersStmt *sql.Stmt + countEntryPointsStmt *sql.Stmt + countHttpMiddlewaresStmt *sql.Stmt + countHttpRoutersStmt *sql.Stmt + countHttpServersTransportsStmt *sql.Stmt + countHttpServicesStmt *sql.Stmt + countProfilesStmt *sql.Stmt + countRoutersByAgentStmt *sql.Stmt + countRoutersByProfileStmt *sql.Stmt + countServersTransportsByAgentStmt *sql.Stmt + countServersTransportsByProfileStmt *sql.Stmt + countServicesByAgentStmt *sql.Stmt + countServicesByProfileStmt *sql.Stmt + countTcpMiddlewaresStmt *sql.Stmt + countTcpRoutersStmt *sql.Stmt + countTcpServersTransportsStmt *sql.Stmt + countTcpServicesStmt *sql.Stmt + countTraefikInstancesStmt *sql.Stmt + countUdpRoutersStmt *sql.Stmt + countUdpServicesStmt *sql.Stmt + countUsersStmt *sql.Stmt + createAgentStmt *sql.Stmt + createAuditLogStmt *sql.Stmt + createDnsProviderStmt *sql.Stmt + createEntryPointStmt *sql.Stmt + createHttpMiddlewareStmt *sql.Stmt + createHttpRouterStmt *sql.Stmt + createHttpRouterDNSProviderStmt *sql.Stmt + createHttpServersTransportStmt *sql.Stmt + createHttpServiceStmt *sql.Stmt + createProfileStmt *sql.Stmt + createTcpMiddlewareStmt *sql.Stmt + createTcpRouterStmt *sql.Stmt + createTcpRouterDNSProviderStmt *sql.Stmt + createTcpServersTransportStmt *sql.Stmt + createTcpServiceStmt *sql.Stmt + createUdpRouterStmt *sql.Stmt + createUdpServiceStmt *sql.Stmt + createUserStmt *sql.Stmt + deleteAgentStmt *sql.Stmt + deleteDnsProviderStmt *sql.Stmt + deleteEntryPointByIDStmt *sql.Stmt + deleteErrorByIdStmt *sql.Stmt + deleteErrorsByProfileStmt *sql.Stmt + deleteErrorsByProfileCategoryStmt *sql.Stmt + deleteHttpMiddlewareStmt *sql.Stmt + deleteHttpRouterStmt *sql.Stmt + deleteHttpRouterDNSProviderStmt *sql.Stmt + deleteHttpServersTransportStmt *sql.Stmt + deleteHttpServiceStmt *sql.Stmt + deleteOldAuditLogsStmt *sql.Stmt + deleteProfileStmt *sql.Stmt + deleteSettingStmt *sql.Stmt + deleteTcpMiddlewareStmt *sql.Stmt + deleteTcpRouterStmt *sql.Stmt + deleteTcpRouterDNSProviderStmt *sql.Stmt + deleteTcpServersTransportStmt *sql.Stmt + deleteTcpServiceStmt *sql.Stmt + deleteTraefikInstanceByIDStmt *sql.Stmt + deleteUdpRouterStmt *sql.Stmt + deleteUdpServiceStmt *sql.Stmt + deleteUserStmt *sql.Stmt + getAgentStmt *sql.Stmt + getDefaultDNSProviderStmt *sql.Stmt + getDefaultEntryPointStmt *sql.Stmt + getDnsProviderStmt *sql.Stmt + getDnsProviderByNameStmt *sql.Stmt + getDnsProvidersByHttpRouterStmt *sql.Stmt + getDnsProvidersByTcpRouterStmt *sql.Stmt + getEntryPointStmt *sql.Stmt + getErrorsByProfileStmt *sql.Stmt + getHttpMiddlewareStmt *sql.Stmt + getHttpRouterStmt *sql.Stmt + getHttpRouterDomainsStmt *sql.Stmt + getHttpRoutersUsingEntryPointStmt *sql.Stmt + getHttpRoutersUsingMiddlewareStmt *sql.Stmt + getHttpServersTransportStmt *sql.Stmt + getHttpServiceStmt *sql.Stmt + getHttpServiceByNameStmt *sql.Stmt + getProfileStmt *sql.Stmt + getProfileByNameStmt *sql.Stmt + getSettingStmt *sql.Stmt + getTcpMiddlewareStmt *sql.Stmt + getTcpRouterStmt *sql.Stmt + getTcpRouterDomainsStmt *sql.Stmt + getTcpRoutersUsingEntryPointStmt *sql.Stmt + getTcpRoutersUsingMiddlewareStmt *sql.Stmt + getTcpServersTransportStmt *sql.Stmt + getTcpServiceStmt *sql.Stmt + getTcpServiceByNameStmt *sql.Stmt + getTraefikInstanceByIDStmt *sql.Stmt + getTraefikInstanceByNameStmt *sql.Stmt + getUdpRouterStmt *sql.Stmt + getUdpRoutersUsingEntryPointStmt *sql.Stmt + getUdpServiceStmt *sql.Stmt + getUdpServiceByNameStmt *sql.Stmt + getUserByEmailStmt *sql.Stmt + getUserByIDStmt *sql.Stmt + getUserByUsernameStmt *sql.Stmt + listAgentsStmt *sql.Stmt + listAuditLogsStmt *sql.Stmt + listDnsProvidersStmt *sql.Stmt + listEntryPointsStmt *sql.Stmt + listErrorsStmt *sql.Stmt + listHttpMiddlewaresStmt *sql.Stmt + listHttpMiddlewaresEnabledStmt *sql.Stmt + listHttpRoutersStmt *sql.Stmt + listHttpRoutersEnabledStmt *sql.Stmt + listHttpServersTransportsStmt *sql.Stmt + listHttpServersTransportsEnabledStmt *sql.Stmt + listHttpServicesStmt *sql.Stmt + listHttpServicesEnabledStmt *sql.Stmt + listProfilesStmt *sql.Stmt + listRoutersByAgentStmt *sql.Stmt + listRoutersByProfileStmt *sql.Stmt + listServersTransportsByAgentStmt *sql.Stmt + listServersTransportsByProfileStmt *sql.Stmt + listServicesByAgentStmt *sql.Stmt + listServicesByProfileStmt *sql.Stmt + listSettingsStmt *sql.Stmt + listTcpMiddlewaresStmt *sql.Stmt + listTcpMiddlewaresEnabledStmt *sql.Stmt + listTcpRoutersStmt *sql.Stmt + listTcpRoutersEnabledStmt *sql.Stmt + listTcpServersTransportsStmt *sql.Stmt + listTcpServersTransportsEnabledStmt *sql.Stmt + listTcpServicesStmt *sql.Stmt + listTcpServicesEnabledStmt *sql.Stmt + listTraefikInstancesStmt *sql.Stmt + listUdpRoutersStmt *sql.Stmt + listUdpRoutersEnabledStmt *sql.Stmt + listUdpServicesStmt *sql.Stmt + listUdpServicesEnabledStmt *sql.Stmt + listUsersStmt *sql.Stmt + logErrorStmt *sql.Stmt + purgeTraefikInstancesStmt *sql.Stmt + unsetDefaultDNSProviderStmt *sql.Stmt + unsetDefaultEntryPointStmt *sql.Stmt + unsetDefaultHttpMiddlewareStmt *sql.Stmt + unsetDefaultTcpMiddlewareStmt *sql.Stmt + updateAgentStmt *sql.Stmt + updateAgentIPStmt *sql.Stmt + updateAgentTokenStmt *sql.Stmt + updateDnsProviderStmt *sql.Stmt + updateEntryPointStmt *sql.Stmt + updateHttpMiddlewareStmt *sql.Stmt + updateHttpRouterStmt *sql.Stmt + updateHttpServersTransportStmt *sql.Stmt + updateHttpServiceStmt *sql.Stmt + updateProfileStmt *sql.Stmt + updateTcpMiddlewareStmt *sql.Stmt + updateTcpRouterStmt *sql.Stmt + updateTcpServersTransportStmt *sql.Stmt + updateTcpServiceStmt *sql.Stmt + updateUdpRouterStmt *sql.Stmt + updateUdpServiceStmt *sql.Stmt + updateUserStmt *sql.Stmt + updateUserLastLoginStmt *sql.Stmt + updateUserPasswordStmt *sql.Stmt + updateUserResetTokenStmt *sql.Stmt + upsertSettingStmt *sql.Stmt + upsertTraefikInstanceStmt *sql.Stmt } func (q *Queries) WithTx(tx *sql.Tx) *Queries { return &Queries{ - db: tx, - tx: tx, - countAgentsStmt: q.countAgentsStmt, - countAuditLogsStmt: q.countAuditLogsStmt, - 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, - countServersTransportsByAgentStmt: q.countServersTransportsByAgentStmt, - countServersTransportsByProfileStmt: q.countServersTransportsByProfileStmt, - 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, - createDnsProviderStmt: q.createDnsProviderStmt, - createEntryPointStmt: q.createEntryPointStmt, - createHttpMiddlewareStmt: q.createHttpMiddlewareStmt, - createHttpRouterStmt: q.createHttpRouterStmt, - createHttpRouterDNSProviderStmt: q.createHttpRouterDNSProviderStmt, - createHttpServersTransportStmt: q.createHttpServersTransportStmt, - createHttpServiceStmt: q.createHttpServiceStmt, - createProfileStmt: q.createProfileStmt, - createTcpMiddlewareStmt: q.createTcpMiddlewareStmt, - createTcpRouterStmt: q.createTcpRouterStmt, - createTcpRouterDNSProviderStmt: q.createTcpRouterDNSProviderStmt, - createTcpServersTransportStmt: q.createTcpServersTransportStmt, - createTcpServiceStmt: q.createTcpServiceStmt, - createUdpRouterStmt: q.createUdpRouterStmt, - createUdpServiceStmt: q.createUdpServiceStmt, - createUserStmt: q.createUserStmt, - deleteAgentStmt: q.deleteAgentStmt, - deleteDnsProviderStmt: q.deleteDnsProviderStmt, - deleteEntryPointByIDStmt: q.deleteEntryPointByIDStmt, - deleteErrorByIdStmt: q.deleteErrorByIdStmt, - deleteErrorsByProfileStmt: q.deleteErrorsByProfileStmt, - deleteErrorsByProfileCategoryStmt: q.deleteErrorsByProfileCategoryStmt, - deleteHttpMiddlewareStmt: q.deleteHttpMiddlewareStmt, - deleteHttpRouterStmt: q.deleteHttpRouterStmt, - deleteHttpRouterDNSProviderStmt: q.deleteHttpRouterDNSProviderStmt, - deleteHttpServersTransportStmt: q.deleteHttpServersTransportStmt, - deleteHttpServiceStmt: q.deleteHttpServiceStmt, - deleteOldAuditLogsStmt: q.deleteOldAuditLogsStmt, - deleteProfileStmt: q.deleteProfileStmt, - deleteSettingStmt: q.deleteSettingStmt, - deleteTcpMiddlewareStmt: q.deleteTcpMiddlewareStmt, - deleteTcpRouterStmt: q.deleteTcpRouterStmt, - deleteTcpRouterDNSProviderStmt: q.deleteTcpRouterDNSProviderStmt, - deleteTcpServersTransportStmt: q.deleteTcpServersTransportStmt, - deleteTcpServiceStmt: q.deleteTcpServiceStmt, - deleteTraefikInstanceByIDStmt: q.deleteTraefikInstanceByIDStmt, - deleteUdpRouterStmt: q.deleteUdpRouterStmt, - deleteUdpServiceStmt: q.deleteUdpServiceStmt, - deleteUserStmt: q.deleteUserStmt, - getAgentStmt: q.getAgentStmt, - getDefaultDNSProviderStmt: q.getDefaultDNSProviderStmt, - getDefaultEntryPointStmt: q.getDefaultEntryPointStmt, - getDnsProviderStmt: q.getDnsProviderStmt, - getDnsProviderByNameStmt: q.getDnsProviderByNameStmt, - getDnsProvidersByHttpRouterStmt: q.getDnsProvidersByHttpRouterStmt, - getDnsProvidersByTcpRouterStmt: q.getDnsProvidersByTcpRouterStmt, - getEntryPointStmt: q.getEntryPointStmt, - getErrorsByProfileStmt: q.getErrorsByProfileStmt, - getHttpMiddlewareStmt: q.getHttpMiddlewareStmt, - getHttpRouterStmt: q.getHttpRouterStmt, - getHttpRouterDomainsStmt: q.getHttpRouterDomainsStmt, - getHttpRoutersUsingEntryPointStmt: q.getHttpRoutersUsingEntryPointStmt, - getHttpRoutersUsingMiddlewareStmt: q.getHttpRoutersUsingMiddlewareStmt, - getHttpServersTransportStmt: q.getHttpServersTransportStmt, - getHttpServiceStmt: q.getHttpServiceStmt, - getHttpServiceByNameStmt: q.getHttpServiceByNameStmt, - getProfileStmt: q.getProfileStmt, - getProfileByNameStmt: q.getProfileByNameStmt, - getSettingStmt: q.getSettingStmt, - getTcpMiddlewareStmt: q.getTcpMiddlewareStmt, - getTcpRouterStmt: q.getTcpRouterStmt, - getTcpRouterDomainsStmt: q.getTcpRouterDomainsStmt, - getTcpRoutersUsingEntryPointStmt: q.getTcpRoutersUsingEntryPointStmt, - getTcpRoutersUsingMiddlewareStmt: q.getTcpRoutersUsingMiddlewareStmt, - getTcpServersTransportStmt: q.getTcpServersTransportStmt, - getTcpServiceStmt: q.getTcpServiceStmt, - getTcpServiceByNameStmt: q.getTcpServiceByNameStmt, - getTraefikInstanceByIDStmt: q.getTraefikInstanceByIDStmt, - getTraefikInstanceByNameStmt: q.getTraefikInstanceByNameStmt, - getUdpRouterStmt: q.getUdpRouterStmt, - getUdpRoutersUsingEntryPointStmt: q.getUdpRoutersUsingEntryPointStmt, - getUdpServiceStmt: q.getUdpServiceStmt, - getUdpServiceByNameStmt: q.getUdpServiceByNameStmt, - getUserByEmailStmt: q.getUserByEmailStmt, - getUserByIDStmt: q.getUserByIDStmt, - getUserByUsernameStmt: q.getUserByUsernameStmt, - listAgentsStmt: q.listAgentsStmt, - listAuditLogsStmt: q.listAuditLogsStmt, - listDnsProvidersStmt: q.listDnsProvidersStmt, - 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, - listServersTransportsByAgentStmt: q.listServersTransportsByAgentStmt, - listServersTransportsByProfileStmt: q.listServersTransportsByProfileStmt, - listServicesByAgentStmt: q.listServicesByAgentStmt, - 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, - purgeTraefikInstancesStmt: q.purgeTraefikInstancesStmt, - unsetDefaultDNSProviderStmt: q.unsetDefaultDNSProviderStmt, - unsetDefaultEntryPointStmt: q.unsetDefaultEntryPointStmt, - unsetDefaultHttpMiddlewareStmt: q.unsetDefaultHttpMiddlewareStmt, - unsetDefaultTcpMiddlewareStmt: q.unsetDefaultTcpMiddlewareStmt, - updateAgentStmt: q.updateAgentStmt, - updateAgentIPStmt: q.updateAgentIPStmt, - updateAgentTokenStmt: q.updateAgentTokenStmt, - updateDnsProviderStmt: q.updateDnsProviderStmt, - updateEntryPointStmt: q.updateEntryPointStmt, - updateHttpMiddlewareStmt: q.updateHttpMiddlewareStmt, - updateHttpRouterStmt: q.updateHttpRouterStmt, - updateHttpServersTransportStmt: q.updateHttpServersTransportStmt, - updateHttpServiceStmt: q.updateHttpServiceStmt, - updateProfileStmt: q.updateProfileStmt, - updateTcpMiddlewareStmt: q.updateTcpMiddlewareStmt, - updateTcpRouterStmt: q.updateTcpRouterStmt, - updateTcpServersTransportStmt: q.updateTcpServersTransportStmt, - updateTcpServiceStmt: q.updateTcpServiceStmt, - updateUdpRouterStmt: q.updateUdpRouterStmt, - updateUdpServiceStmt: q.updateUdpServiceStmt, - updateUserStmt: q.updateUserStmt, - updateUserLastLoginStmt: q.updateUserLastLoginStmt, - updateUserPasswordStmt: q.updateUserPasswordStmt, - updateUserResetTokenStmt: q.updateUserResetTokenStmt, - upsertSettingStmt: q.upsertSettingStmt, - upsertTraefikInstanceStmt: q.upsertTraefikInstanceStmt, + db: tx, + tx: tx, + countAgentsStmt: q.countAgentsStmt, + countAuditLogsStmt: q.countAuditLogsStmt, + countDnsProvidersStmt: q.countDnsProvidersStmt, + countEntryPointsStmt: q.countEntryPointsStmt, + countHttpMiddlewaresStmt: q.countHttpMiddlewaresStmt, + countHttpRoutersStmt: q.countHttpRoutersStmt, + countHttpServersTransportsStmt: q.countHttpServersTransportsStmt, + countHttpServicesStmt: q.countHttpServicesStmt, + countProfilesStmt: q.countProfilesStmt, + countRoutersByAgentStmt: q.countRoutersByAgentStmt, + countRoutersByProfileStmt: q.countRoutersByProfileStmt, + countServersTransportsByAgentStmt: q.countServersTransportsByAgentStmt, + countServersTransportsByProfileStmt: q.countServersTransportsByProfileStmt, + countServicesByAgentStmt: q.countServicesByAgentStmt, + countServicesByProfileStmt: q.countServicesByProfileStmt, + countTcpMiddlewaresStmt: q.countTcpMiddlewaresStmt, + countTcpRoutersStmt: q.countTcpRoutersStmt, + countTcpServersTransportsStmt: q.countTcpServersTransportsStmt, + countTcpServicesStmt: q.countTcpServicesStmt, + countTraefikInstancesStmt: q.countTraefikInstancesStmt, + countUdpRoutersStmt: q.countUdpRoutersStmt, + countUdpServicesStmt: q.countUdpServicesStmt, + countUsersStmt: q.countUsersStmt, + createAgentStmt: q.createAgentStmt, + createAuditLogStmt: q.createAuditLogStmt, + createDnsProviderStmt: q.createDnsProviderStmt, + createEntryPointStmt: q.createEntryPointStmt, + createHttpMiddlewareStmt: q.createHttpMiddlewareStmt, + createHttpRouterStmt: q.createHttpRouterStmt, + createHttpRouterDNSProviderStmt: q.createHttpRouterDNSProviderStmt, + createHttpServersTransportStmt: q.createHttpServersTransportStmt, + createHttpServiceStmt: q.createHttpServiceStmt, + createProfileStmt: q.createProfileStmt, + createTcpMiddlewareStmt: q.createTcpMiddlewareStmt, + createTcpRouterStmt: q.createTcpRouterStmt, + createTcpRouterDNSProviderStmt: q.createTcpRouterDNSProviderStmt, + createTcpServersTransportStmt: q.createTcpServersTransportStmt, + createTcpServiceStmt: q.createTcpServiceStmt, + createUdpRouterStmt: q.createUdpRouterStmt, + createUdpServiceStmt: q.createUdpServiceStmt, + createUserStmt: q.createUserStmt, + deleteAgentStmt: q.deleteAgentStmt, + deleteDnsProviderStmt: q.deleteDnsProviderStmt, + deleteEntryPointByIDStmt: q.deleteEntryPointByIDStmt, + deleteErrorByIdStmt: q.deleteErrorByIdStmt, + deleteErrorsByProfileStmt: q.deleteErrorsByProfileStmt, + deleteErrorsByProfileCategoryStmt: q.deleteErrorsByProfileCategoryStmt, + deleteHttpMiddlewareStmt: q.deleteHttpMiddlewareStmt, + deleteHttpRouterStmt: q.deleteHttpRouterStmt, + deleteHttpRouterDNSProviderStmt: q.deleteHttpRouterDNSProviderStmt, + deleteHttpServersTransportStmt: q.deleteHttpServersTransportStmt, + deleteHttpServiceStmt: q.deleteHttpServiceStmt, + deleteOldAuditLogsStmt: q.deleteOldAuditLogsStmt, + deleteProfileStmt: q.deleteProfileStmt, + deleteSettingStmt: q.deleteSettingStmt, + deleteTcpMiddlewareStmt: q.deleteTcpMiddlewareStmt, + deleteTcpRouterStmt: q.deleteTcpRouterStmt, + deleteTcpRouterDNSProviderStmt: q.deleteTcpRouterDNSProviderStmt, + deleteTcpServersTransportStmt: q.deleteTcpServersTransportStmt, + deleteTcpServiceStmt: q.deleteTcpServiceStmt, + deleteTraefikInstanceByIDStmt: q.deleteTraefikInstanceByIDStmt, + deleteUdpRouterStmt: q.deleteUdpRouterStmt, + deleteUdpServiceStmt: q.deleteUdpServiceStmt, + deleteUserStmt: q.deleteUserStmt, + getAgentStmt: q.getAgentStmt, + getDefaultDNSProviderStmt: q.getDefaultDNSProviderStmt, + getDefaultEntryPointStmt: q.getDefaultEntryPointStmt, + getDnsProviderStmt: q.getDnsProviderStmt, + getDnsProviderByNameStmt: q.getDnsProviderByNameStmt, + getDnsProvidersByHttpRouterStmt: q.getDnsProvidersByHttpRouterStmt, + getDnsProvidersByTcpRouterStmt: q.getDnsProvidersByTcpRouterStmt, + getEntryPointStmt: q.getEntryPointStmt, + getErrorsByProfileStmt: q.getErrorsByProfileStmt, + getHttpMiddlewareStmt: q.getHttpMiddlewareStmt, + getHttpRouterStmt: q.getHttpRouterStmt, + getHttpRouterDomainsStmt: q.getHttpRouterDomainsStmt, + getHttpRoutersUsingEntryPointStmt: q.getHttpRoutersUsingEntryPointStmt, + getHttpRoutersUsingMiddlewareStmt: q.getHttpRoutersUsingMiddlewareStmt, + getHttpServersTransportStmt: q.getHttpServersTransportStmt, + getHttpServiceStmt: q.getHttpServiceStmt, + getHttpServiceByNameStmt: q.getHttpServiceByNameStmt, + getProfileStmt: q.getProfileStmt, + getProfileByNameStmt: q.getProfileByNameStmt, + getSettingStmt: q.getSettingStmt, + getTcpMiddlewareStmt: q.getTcpMiddlewareStmt, + getTcpRouterStmt: q.getTcpRouterStmt, + getTcpRouterDomainsStmt: q.getTcpRouterDomainsStmt, + getTcpRoutersUsingEntryPointStmt: q.getTcpRoutersUsingEntryPointStmt, + getTcpRoutersUsingMiddlewareStmt: q.getTcpRoutersUsingMiddlewareStmt, + getTcpServersTransportStmt: q.getTcpServersTransportStmt, + getTcpServiceStmt: q.getTcpServiceStmt, + getTcpServiceByNameStmt: q.getTcpServiceByNameStmt, + getTraefikInstanceByIDStmt: q.getTraefikInstanceByIDStmt, + getTraefikInstanceByNameStmt: q.getTraefikInstanceByNameStmt, + getUdpRouterStmt: q.getUdpRouterStmt, + getUdpRoutersUsingEntryPointStmt: q.getUdpRoutersUsingEntryPointStmt, + getUdpServiceStmt: q.getUdpServiceStmt, + getUdpServiceByNameStmt: q.getUdpServiceByNameStmt, + getUserByEmailStmt: q.getUserByEmailStmt, + getUserByIDStmt: q.getUserByIDStmt, + getUserByUsernameStmt: q.getUserByUsernameStmt, + listAgentsStmt: q.listAgentsStmt, + listAuditLogsStmt: q.listAuditLogsStmt, + listDnsProvidersStmt: q.listDnsProvidersStmt, + listEntryPointsStmt: q.listEntryPointsStmt, + listErrorsStmt: q.listErrorsStmt, + listHttpMiddlewaresStmt: q.listHttpMiddlewaresStmt, + listHttpMiddlewaresEnabledStmt: q.listHttpMiddlewaresEnabledStmt, + listHttpRoutersStmt: q.listHttpRoutersStmt, + listHttpRoutersEnabledStmt: q.listHttpRoutersEnabledStmt, + listHttpServersTransportsStmt: q.listHttpServersTransportsStmt, + listHttpServersTransportsEnabledStmt: q.listHttpServersTransportsEnabledStmt, + listHttpServicesStmt: q.listHttpServicesStmt, + listHttpServicesEnabledStmt: q.listHttpServicesEnabledStmt, + listProfilesStmt: q.listProfilesStmt, + listRoutersByAgentStmt: q.listRoutersByAgentStmt, + listRoutersByProfileStmt: q.listRoutersByProfileStmt, + listServersTransportsByAgentStmt: q.listServersTransportsByAgentStmt, + listServersTransportsByProfileStmt: q.listServersTransportsByProfileStmt, + listServicesByAgentStmt: q.listServicesByAgentStmt, + listServicesByProfileStmt: q.listServicesByProfileStmt, + listSettingsStmt: q.listSettingsStmt, + listTcpMiddlewaresStmt: q.listTcpMiddlewaresStmt, + listTcpMiddlewaresEnabledStmt: q.listTcpMiddlewaresEnabledStmt, + listTcpRoutersStmt: q.listTcpRoutersStmt, + listTcpRoutersEnabledStmt: q.listTcpRoutersEnabledStmt, + listTcpServersTransportsStmt: q.listTcpServersTransportsStmt, + listTcpServersTransportsEnabledStmt: q.listTcpServersTransportsEnabledStmt, + listTcpServicesStmt: q.listTcpServicesStmt, + listTcpServicesEnabledStmt: q.listTcpServicesEnabledStmt, + listTraefikInstancesStmt: q.listTraefikInstancesStmt, + listUdpRoutersStmt: q.listUdpRoutersStmt, + listUdpRoutersEnabledStmt: q.listUdpRoutersEnabledStmt, + listUdpServicesStmt: q.listUdpServicesStmt, + listUdpServicesEnabledStmt: q.listUdpServicesEnabledStmt, + listUsersStmt: q.listUsersStmt, + logErrorStmt: q.logErrorStmt, + purgeTraefikInstancesStmt: q.purgeTraefikInstancesStmt, + unsetDefaultDNSProviderStmt: q.unsetDefaultDNSProviderStmt, + unsetDefaultEntryPointStmt: q.unsetDefaultEntryPointStmt, + unsetDefaultHttpMiddlewareStmt: q.unsetDefaultHttpMiddlewareStmt, + unsetDefaultTcpMiddlewareStmt: q.unsetDefaultTcpMiddlewareStmt, + updateAgentStmt: q.updateAgentStmt, + updateAgentIPStmt: q.updateAgentIPStmt, + updateAgentTokenStmt: q.updateAgentTokenStmt, + updateDnsProviderStmt: q.updateDnsProviderStmt, + updateEntryPointStmt: q.updateEntryPointStmt, + updateHttpMiddlewareStmt: q.updateHttpMiddlewareStmt, + updateHttpRouterStmt: q.updateHttpRouterStmt, + updateHttpServersTransportStmt: q.updateHttpServersTransportStmt, + updateHttpServiceStmt: q.updateHttpServiceStmt, + updateProfileStmt: q.updateProfileStmt, + updateTcpMiddlewareStmt: q.updateTcpMiddlewareStmt, + updateTcpRouterStmt: q.updateTcpRouterStmt, + updateTcpServersTransportStmt: q.updateTcpServersTransportStmt, + updateTcpServiceStmt: q.updateTcpServiceStmt, + updateUdpRouterStmt: q.updateUdpRouterStmt, + updateUdpServiceStmt: q.updateUdpServiceStmt, + updateUserStmt: q.updateUserStmt, + updateUserLastLoginStmt: q.updateUserLastLoginStmt, + updateUserPasswordStmt: q.updateUserPasswordStmt, + updateUserResetTokenStmt: q.updateUserResetTokenStmt, + upsertSettingStmt: q.upsertSettingStmt, + upsertTraefikInstanceStmt: q.upsertTraefikInstanceStmt, } } diff --git a/internal/store/db/dns_providers.sql.go b/internal/store/db/dns_providers.sql.go index 1912482..1c757aa 100644 --- a/internal/store/db/dns_providers.sql.go +++ b/internal/store/db/dns_providers.sql.go @@ -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 } diff --git a/internal/store/db/entry_points.sql.go b/internal/store/db/entry_points.sql.go index 64e3487..aca6727 100644 --- a/internal/store/db/entry_points.sql.go +++ b/internal/store/db/entry_points.sql.go @@ -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"` + ProfileID int64 `json:"profileId"` + 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 } diff --git a/internal/store/db/http_middlewares.sql.go b/internal/store/db/http_middlewares.sql.go index 7085dd7..5546033 100644 --- a/internal/store/db/http_middlewares.sql.go +++ b/internal/store/db/http_middlewares.sql.go @@ -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"` + ProfileID int64 `json:"profileId"` + 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 } diff --git a/internal/store/db/http_routers.sql.go b/internal/store/db/http_routers.sql.go index f6aaec4..ec86987 100644 --- a/internal/store/db/http_routers.sql.go +++ b/internal/store/db/http_routers.sql.go @@ -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"` + ProfileID int64 `json:"profileId"` + 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 } diff --git a/internal/store/db/http_servers_transports.sql.go b/internal/store/db/http_servers_transports.sql.go index 1d6802b..22f3323 100644 --- a/internal/store/db/http_servers_transports.sql.go +++ b/internal/store/db/http_servers_transports.sql.go @@ -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"` + ProfileID int64 `json:"profileId"` + 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 } diff --git a/internal/store/db/http_services.sql.go b/internal/store/db/http_services.sql.go index 7f71f75..33a8e17 100644 --- a/internal/store/db/http_services.sql.go +++ b/internal/store/db/http_services.sql.go @@ -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"` + ProfileID int64 `json:"profileId"` + 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 } diff --git a/internal/store/db/middlewares.sql.go b/internal/store/db/middlewares.sql.go deleted file mode 100644 index 679a927..0000000 --- a/internal/store/db/middlewares.sql.go +++ /dev/null @@ -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 -} diff --git a/internal/store/db/models.go b/internal/store/db/models.go index 0d2a3ab..480f98e 100644 --- a/internal/store/db/models.go +++ b/internal/store/db/models.go @@ -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 { diff --git a/internal/store/db/profiles.sql.go b/internal/store/db/profiles.sql.go index b08ab4d..576bcfb 100644 --- a/internal/store/db/profiles.sql.go +++ b/internal/store/db/profiles.sql.go @@ -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 } diff --git a/internal/store/db/querier.go b/internal/store/db/querier.go index 28d382d..dd5947d 100644 --- a/internal/store/db/querier.go +++ b/internal/store/db/querier.go @@ -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 diff --git a/internal/store/db/tcp_middlewares.sql.go b/internal/store/db/tcp_middlewares.sql.go index 388a72b..20dd870 100644 --- a/internal/store/db/tcp_middlewares.sql.go +++ b/internal/store/db/tcp_middlewares.sql.go @@ -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"` + ProfileID int64 `json:"profileId"` + 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 } diff --git a/internal/store/db/tcp_routers.sql.go b/internal/store/db/tcp_routers.sql.go index e2e913d..6c0dd3e 100644 --- a/internal/store/db/tcp_routers.sql.go +++ b/internal/store/db/tcp_routers.sql.go @@ -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"` + ProfileID int64 `json:"profileId"` + 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 } diff --git a/internal/store/db/tcp_servers_transport.sql.go b/internal/store/db/tcp_servers_transport.sql.go index 3dc6549..24fd5a8 100644 --- a/internal/store/db/tcp_servers_transport.sql.go +++ b/internal/store/db/tcp_servers_transport.sql.go @@ -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"` + ProfileID int64 `json:"profileId"` + 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 } diff --git a/internal/store/db/tcp_services.sql.go b/internal/store/db/tcp_services.sql.go index d61d65f..e365e35 100644 --- a/internal/store/db/tcp_services.sql.go +++ b/internal/store/db/tcp_services.sql.go @@ -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"` + ProfileID int64 `json:"profileId"` + 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 } diff --git a/internal/store/db/udp_routers.sql.go b/internal/store/db/udp_routers.sql.go index d437b06..85472cd 100644 --- a/internal/store/db/udp_routers.sql.go +++ b/internal/store/db/udp_routers.sql.go @@ -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"` + ProfileID int64 `json:"profileId"` + 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 } diff --git a/internal/store/db/udp_services.sql.go b/internal/store/db/udp_services.sql.go index 6f22c67..7fc9a5f 100644 --- a/internal/store/db/udp_services.sql.go +++ b/internal/store/db/udp_services.sql.go @@ -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"` + ProfileID int64 `json:"profileId"` + 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 } diff --git a/internal/store/db/users.sql.go b/internal/store/db/users.sql.go index f88746d..9a54ae2 100644 --- a/internal/store/db/users.sql.go +++ b/internal/store/db/users.sql.go @@ -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 } diff --git a/internal/store/migrations/00007_v07.sql b/internal/store/migrations/00007_v07.sql index d82a84c..9ca0034 100644 --- a/internal/store/migrations/00007_v07.sql +++ b/internal/store/migrations/00007_v07.sql @@ -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 diff --git a/internal/store/queries/agents.sql b/internal/store/queries/agents.sql index c392f38..c26c2e5 100644 --- a/internal/store/queries/agents.sql +++ b/internal/store/queries/agents.sql @@ -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 diff --git a/internal/store/queries/audit_logs.sql b/internal/store/queries/audit_logs.sql index dd95011..1752ca8 100644 --- a/internal/store/queries/audit_logs.sql +++ b/internal/store/queries/audit_logs.sql @@ -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 diff --git a/internal/store/queries/dns_providers.sql b/internal/store/queries/dns_providers.sql index f0f5ae8..c674afb 100644 --- a/internal/store/queries/dns_providers.sql +++ b/internal/store/queries/dns_providers.sql @@ -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 diff --git a/internal/store/queries/entry_points.sql b/internal/store/queries/entry_points.sql index 0892ca1..e555965 100644 --- a/internal/store/queries/entry_points.sql +++ b/internal/store/queries/entry_points.sql @@ -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 diff --git a/internal/store/queries/http_middlewares.sql b/internal/store/queries/http_middlewares.sql index 9c0a1a8..f3d0d2a 100644 --- a/internal/store/queries/http_middlewares.sql +++ b/internal/store/queries/http_middlewares.sql @@ -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 diff --git a/internal/store/queries/http_routers.sql b/internal/store/queries/http_routers.sql index f3843b5..01cfc62 100644 --- a/internal/store/queries/http_routers.sql +++ b/internal/store/queries/http_routers.sql @@ -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 diff --git a/internal/store/queries/http_servers_transports.sql b/internal/store/queries/http_servers_transports.sql index 15263e8..be28437 100644 --- a/internal/store/queries/http_servers_transports.sql +++ b/internal/store/queries/http_servers_transports.sql @@ -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 diff --git a/internal/store/queries/http_services.sql b/internal/store/queries/http_services.sql index 0f58675..1da2c10 100644 --- a/internal/store/queries/http_services.sql +++ b/internal/store/queries/http_services.sql @@ -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 diff --git a/internal/store/queries/middlewares.sql b/internal/store/queries/middlewares.sql deleted file mode 100644 index 8c53cc1..0000000 --- a/internal/store/queries/middlewares.sql +++ /dev/null @@ -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 = ?; diff --git a/internal/store/queries/profiles.sql b/internal/store/queries/profiles.sql index fad117e..a5365ee 100644 --- a/internal/store/queries/profiles.sql +++ b/internal/store/queries/profiles.sql @@ -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 diff --git a/internal/store/queries/tcp_middlewares.sql b/internal/store/queries/tcp_middlewares.sql index b4323a3..de332c5 100644 --- a/internal/store/queries/tcp_middlewares.sql +++ b/internal/store/queries/tcp_middlewares.sql @@ -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 diff --git a/internal/store/queries/tcp_routers.sql b/internal/store/queries/tcp_routers.sql index 844268e..c42b36c 100644 --- a/internal/store/queries/tcp_routers.sql +++ b/internal/store/queries/tcp_routers.sql @@ -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 diff --git a/internal/store/queries/tcp_servers_transport.sql b/internal/store/queries/tcp_servers_transport.sql index cd9d1cc..67c99a5 100644 --- a/internal/store/queries/tcp_servers_transport.sql +++ b/internal/store/queries/tcp_servers_transport.sql @@ -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 diff --git a/internal/store/queries/tcp_services.sql b/internal/store/queries/tcp_services.sql index 6c997dd..a1617eb 100644 --- a/internal/store/queries/tcp_services.sql +++ b/internal/store/queries/tcp_services.sql @@ -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 diff --git a/internal/store/queries/udp_routers.sql b/internal/store/queries/udp_routers.sql index 86d05fd..2292cc6 100644 --- a/internal/store/queries/udp_routers.sql +++ b/internal/store/queries/udp_routers.sql @@ -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 diff --git a/internal/store/queries/udp_services.sql b/internal/store/queries/udp_services.sql index 50035fa..f7c6248 100644 --- a/internal/store/queries/udp_services.sql +++ b/internal/store/queries/udp_services.sql @@ -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 diff --git a/internal/store/queries/users.sql b/internal/store/queries/users.sql index 508d000..ffb5098 100644 --- a/internal/store/queries/users.sql +++ b/internal/store/queries/users.sql @@ -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 diff --git a/internal/store/squash.go b/internal/store/squash_dev.go similarity index 98% rename from internal/store/squash.go rename to internal/store/squash_dev.go index 7afe5a8..7fb4f8c 100644 --- a/internal/store/squash.go +++ b/internal/store/squash_dev.go @@ -1,3 +1,6 @@ +//go:build dev +// +build dev + package store import ( diff --git a/internal/traefik/config.go b/internal/traefik/config.go index c33428c..8b9ac5f 100644 --- a/internal/traefik/config.go +++ b/internal/traefik/config.go @@ -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 +} diff --git a/pkg/util/crypto.go b/pkg/util/crypto.go index 7f12f35..b677b31 100644 --- a/pkg/util/crypto.go +++ b/pkg/util/crypto.go @@ -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: diff --git a/proto/gen/mantrae/v1/entry_point.pb.go b/proto/gen/mantrae/v1/entry_point.pb.go index c300d9e..9b9fdfc 100644 --- a/proto/gen/mantrae/v1/entry_point.pb.go +++ b/proto/gen/mantrae/v1/entry_point.pb.go @@ -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" + diff --git a/proto/gen/mantrae/v1/event.pb.go b/proto/gen/mantrae/v1/event.pb.go deleted file mode 100644 index e7e8e2c..0000000 --- a/proto/gen/mantrae/v1/event.pb.go +++ /dev/null @@ -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 -} diff --git a/proto/gen/mantrae/v1/mantraev1connect/event.connect.go b/proto/gen/mantrae/v1/mantraev1connect/event.connect.go deleted file mode 100644 index 55390b1..0000000 --- a/proto/gen/mantrae/v1/mantraev1connect/event.connect.go +++ /dev/null @@ -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")) -} diff --git a/proto/gen/mantrae/v1/middleware.pb.go b/proto/gen/mantrae/v1/middleware.pb.go index 52c50fd..0fa643d 100644 --- a/proto/gen/mantrae/v1/middleware.pb.go +++ b/proto/gen/mantrae/v1/middleware.pb.go @@ -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{ diff --git a/proto/gen/mantrae/v1/router.pb.go b/proto/gen/mantrae/v1/router.pb.go index 6b7bd06..913439a 100644 --- a/proto/gen/mantrae/v1/router.pb.go +++ b/proto/gen/mantrae/v1/router.pb.go @@ -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{ diff --git a/proto/gen/mantrae/v1/servers_transport.pb.go b/proto/gen/mantrae/v1/servers_transport.pb.go index 54c040f..49d7fc1 100644 --- a/proto/gen/mantrae/v1/servers_transport.pb.go +++ b/proto/gen/mantrae/v1/servers_transport.pb.go @@ -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{ diff --git a/proto/gen/mantrae/v1/service.pb.go b/proto/gen/mantrae/v1/service.pb.go index 8026893..dbe741b 100644 --- a/proto/gen/mantrae/v1/service.pb.go +++ b/proto/gen/mantrae/v1/service.pb.go @@ -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{ diff --git a/proto/gen/mantrae/v1/user.pb.go b/proto/gen/mantrae/v1/user.pb.go index 64ddca8..ff139c9 100644 --- a/proto/gen/mantrae/v1/user.pb.go +++ b/proto/gen/mantrae/v1/user.pb.go @@ -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{} diff --git a/proto/gen/openapi/openapi.yaml b/proto/gen/openapi/openapi.yaml index 08be50f..d3e4fe7 100644 --- a/proto/gen/openapi/openapi.yaml +++ b/proto/gen/openapi/openapi.yaml @@ -884,8 +884,6 @@ components: title: id format: int64 title: DeleteEntryPointRequest - required: - - id additionalProperties: false mantrae.v1.DeleteEntryPointResponse: type: object @@ -1107,6 +1105,7 @@ components: agentId: type: string title: agent_id + nullable: true name: type: string title: name @@ -1389,6 +1388,162 @@ components: $ref: '#/components/schemas/mantrae.v1.Middleware' title: UpdateMiddlewareResponse additionalProperties: false + mantrae.v1.CreateProfileRequest: + type: object + properties: + name: + type: string + title: name + minLength: 1 + description: + type: string + title: description + nullable: true + title: CreateProfileRequest + additionalProperties: false + mantrae.v1.CreateProfileResponse: + type: object + properties: + profile: + title: profile + $ref: '#/components/schemas/mantrae.v1.Profile' + title: CreateProfileResponse + additionalProperties: false + mantrae.v1.DeleteProfileRequest: + type: object + properties: + id: + exclusiveMinimum: 0 + type: + - integer + - string + title: id + format: int64 + title: DeleteProfileRequest + additionalProperties: false + mantrae.v1.DeleteProfileResponse: + type: object + title: DeleteProfileResponse + additionalProperties: false + mantrae.v1.GetProfileRequest: + type: object + properties: + id: + exclusiveMinimum: 0 + type: + - integer + - string + title: id + format: int64 + title: GetProfileRequest + additionalProperties: false + mantrae.v1.GetProfileResponse: + type: object + properties: + profile: + title: profile + $ref: '#/components/schemas/mantrae.v1.Profile' + title: GetProfileResponse + additionalProperties: false + mantrae.v1.ListProfilesRequest: + type: object + properties: + limit: + type: + - integer + - string + title: limit + format: int64 + description: |+ + limit must be either -1 or greater than 0: + ``` + this == -1 || this > 0 + ``` + + nullable: true + offset: + type: + - integer + - string + title: offset + format: int64 + nullable: true + title: ListProfilesRequest + additionalProperties: false + mantrae.v1.ListProfilesResponse: + type: object + properties: + profiles: + type: array + items: + $ref: '#/components/schemas/mantrae.v1.Profile' + title: profiles + totalCount: + type: + - integer + - string + title: total_count + format: int64 + title: ListProfilesResponse + additionalProperties: false + mantrae.v1.Profile: + type: object + properties: + id: + type: + - integer + - string + title: id + format: int64 + name: + type: string + title: name + description: + type: string + title: description + token: + type: string + title: token + createdAt: + title: created_at + $ref: '#/components/schemas/google.protobuf.Timestamp' + updatedAt: + title: updated_at + $ref: '#/components/schemas/google.protobuf.Timestamp' + title: Profile + additionalProperties: false + mantrae.v1.UpdateProfileRequest: + type: object + properties: + id: + exclusiveMinimum: 0 + type: + - integer + - string + title: id + format: int64 + name: + type: string + title: name + minLength: 1 + description: + type: string + title: description + nullable: true + regenerateToken: + type: boolean + title: regenerate_token + nullable: true + title: UpdateProfileRequest + additionalProperties: false + mantrae.v1.UpdateProfileResponse: + type: object + properties: + profile: + title: profile + $ref: '#/components/schemas/mantrae.v1.Profile' + title: UpdateProfileResponse + additionalProperties: false mantrae.v1.RouterType: type: string title: RouterType @@ -1410,6 +1565,7 @@ components: agentId: type: string title: agent_id + nullable: true name: type: string title: name @@ -1613,6 +1769,220 @@ components: $ref: '#/components/schemas/mantrae.v1.Router' title: UpdateRouterResponse additionalProperties: false + mantrae.v1.ServersTransportType: + type: string + title: ServersTransportType + enum: + - SERVERS_TRANSPORT_TYPE_UNSPECIFIED + - SERVERS_TRANSPORT_TYPE_HTTP + - SERVERS_TRANSPORT_TYPE_TCP + mantrae.v1.CreateServersTransportRequest: + type: object + properties: + profileId: + exclusiveMinimum: 0 + type: + - integer + - string + title: profile_id + format: int64 + agentId: + type: string + title: agent_id + nullable: true + name: + type: string + title: name + minLength: 1 + config: + title: config + $ref: '#/components/schemas/google.protobuf.Struct' + enabled: + type: boolean + title: enabled + type: + title: type + $ref: '#/components/schemas/mantrae.v1.ServersTransportType' + title: CreateServersTransportRequest + additionalProperties: false + mantrae.v1.CreateServersTransportResponse: + type: object + properties: + serversTransport: + title: servers_transport + $ref: '#/components/schemas/mantrae.v1.ServersTransport' + title: CreateServersTransportResponse + additionalProperties: false + mantrae.v1.DeleteServersTransportRequest: + type: object + properties: + id: + exclusiveMinimum: 0 + type: + - integer + - string + title: id + format: int64 + type: + title: type + $ref: '#/components/schemas/mantrae.v1.ServersTransportType' + title: DeleteServersTransportRequest + additionalProperties: false + mantrae.v1.DeleteServersTransportResponse: + type: object + title: DeleteServersTransportResponse + additionalProperties: false + mantrae.v1.GetServersTransportRequest: + type: object + properties: + id: + exclusiveMinimum: 0 + type: + - integer + - string + title: id + format: int64 + type: + title: type + $ref: '#/components/schemas/mantrae.v1.ServersTransportType' + title: GetServersTransportRequest + additionalProperties: false + mantrae.v1.GetServersTransportResponse: + type: object + properties: + serversTransport: + title: servers_transport + $ref: '#/components/schemas/mantrae.v1.ServersTransport' + title: GetServersTransportResponse + additionalProperties: false + mantrae.v1.ListServersTransportsRequest: + type: object + properties: + profileId: + exclusiveMinimum: 0 + type: + - integer + - string + title: profile_id + format: int64 + agentId: + type: string + title: agent_id + minLength: 1 + nullable: true + type: + title: type + nullable: true + $ref: '#/components/schemas/mantrae.v1.ServersTransportType' + limit: + type: + - integer + - string + title: limit + format: int64 + description: |+ + limit must be either -1 or greater than 0: + ``` + this == -1 || this > 0 + ``` + + nullable: true + offset: + type: + - integer + - string + title: offset + format: int64 + nullable: true + title: ListServersTransportsRequest + additionalProperties: false + mantrae.v1.ListServersTransportsResponse: + type: object + properties: + serversTransports: + type: array + items: + $ref: '#/components/schemas/mantrae.v1.ServersTransport' + title: servers_transports + totalCount: + type: + - integer + - string + title: total_count + format: int64 + title: ListServersTransportsResponse + additionalProperties: false + mantrae.v1.ServersTransport: + type: object + properties: + id: + type: + - integer + - string + title: id + format: int64 + profileId: + type: + - integer + - string + title: profile_id + format: int64 + agentId: + type: string + title: agent_id + name: + type: string + title: name + config: + title: config + $ref: '#/components/schemas/google.protobuf.Struct' + enabled: + type: boolean + title: enabled + type: + title: type + $ref: '#/components/schemas/mantrae.v1.ServersTransportType' + createdAt: + title: created_at + $ref: '#/components/schemas/google.protobuf.Timestamp' + updatedAt: + title: updated_at + $ref: '#/components/schemas/google.protobuf.Timestamp' + title: ServersTransport + additionalProperties: false + mantrae.v1.UpdateServersTransportRequest: + type: object + properties: + id: + exclusiveMinimum: 0 + type: + - integer + - string + title: id + format: int64 + name: + type: string + title: name + minLength: 1 + config: + title: config + $ref: '#/components/schemas/google.protobuf.Struct' + enabled: + type: boolean + title: enabled + type: + title: type + $ref: '#/components/schemas/mantrae.v1.ServersTransportType' + title: UpdateServersTransportRequest + additionalProperties: false + mantrae.v1.UpdateServersTransportResponse: + type: object + properties: + serversTransport: + title: servers_transport + $ref: '#/components/schemas/mantrae.v1.ServersTransport' + title: UpdateServersTransportResponse + additionalProperties: false mantrae.v1.ServiceType: type: string title: ServiceType @@ -1634,6 +2004,7 @@ components: agentId: type: string title: agent_id + nullable: true name: type: string title: name @@ -1685,11 +2056,8 @@ components: minLength: 1 type: title: type - $ref: '#/components/schemas/mantrae.v1.RouterType' + $ref: '#/components/schemas/mantrae.v1.ServiceType' title: GetServiceByRouterRequest - required: - - name - - type additionalProperties: false mantrae.v1.GetServiceByRouterResponse: type: object @@ -1850,6 +2218,71 @@ components: $ref: '#/components/schemas/mantrae.v1.Service' title: UpdateServiceResponse additionalProperties: false + mantrae.v1.GetSettingRequest: + type: object + properties: + key: + type: string + title: key + minLength: 1 + title: GetSettingRequest + additionalProperties: false + mantrae.v1.GetSettingResponse: + type: object + properties: + value: + type: string + title: value + title: GetSettingResponse + additionalProperties: false + mantrae.v1.ListSettingsRequest: + type: object + title: ListSettingsRequest + additionalProperties: false + mantrae.v1.ListSettingsResponse: + type: object + properties: + settings: + type: array + items: + $ref: '#/components/schemas/mantrae.v1.Setting' + title: settings + title: ListSettingsResponse + additionalProperties: false + mantrae.v1.Setting: + type: object + properties: + key: + type: string + title: key + value: + type: string + title: value + updatedAt: + title: updated_at + $ref: '#/components/schemas/google.protobuf.Timestamp' + title: Setting + additionalProperties: false + mantrae.v1.UpdateSettingRequest: + type: object + properties: + key: + type: string + title: key + minLength: 1 + value: + type: string + title: value + title: UpdateSettingRequest + additionalProperties: false + mantrae.v1.UpdateSettingResponse: + type: object + properties: + setting: + title: setting + $ref: '#/components/schemas/mantrae.v1.Setting' + title: UpdateSettingResponse + additionalProperties: false mantrae.v1.CreateUserRequest: type: object properties: @@ -1865,6 +2298,7 @@ components: type: string title: email format: email + nullable: true title: CreateUserRequest additionalProperties: false mantrae.v1.CreateUserResponse: @@ -2068,6 +2502,7 @@ components: type: string title: email format: email + nullable: true password: type: string title: password @@ -2150,598 +2585,6 @@ components: $ref: '#/components/schemas/mantrae.v1.User' title: VerifyOTPResponse additionalProperties: false - mantrae.v1.EventType: - type: string - title: EventType - enum: - - EVENT_TYPE_UNSPECIFIED - - EVENT_TYPE_CREATED - - EVENT_TYPE_UPDATED - - EVENT_TYPE_DELETED - mantrae.v1.ResourceType: - type: string - title: ResourceType - enum: - - RESOURCE_TYPE_UNSPECIFIED - - RESOURCE_TYPE_ROUTER - - RESOURCE_TYPE_SERVICE - - RESOURCE_TYPE_MIDDLEWARE - - RESOURCE_TYPE_ENTRY_POINT - - RESOURCE_TYPE_AUDIT_LOG - - RESOURCE_TYPE_AGENT - - RESOURCE_TYPE_USER - - RESOURCE_TYPE_DNS_PROVIDER - mantrae.v1.GlobalEvent: - type: object - oneOf: - - properties: - dnsProvider: - title: dns_provider - $ref: '#/components/schemas/mantrae.v1.DnsProvider' - title: dns_provider - required: - - dnsProvider - - properties: - user: - title: user - $ref: '#/components/schemas/mantrae.v1.User' - title: user - required: - - user - properties: - eventType: - title: event_type - $ref: '#/components/schemas/mantrae.v1.EventType' - resourceType: - title: resource_type - $ref: '#/components/schemas/mantrae.v1.ResourceType' - timestamp: - title: timestamp - $ref: '#/components/schemas/google.protobuf.Timestamp' - title: GlobalEvent - additionalProperties: false - mantrae.v1.GlobalEventsRequest: - type: object - properties: - resourceTypes: - type: array - items: - $ref: '#/components/schemas/mantrae.v1.ResourceType' - title: resource_types - description: Filter by specific resource types - title: GlobalEventsRequest - additionalProperties: false - mantrae.v1.GlobalEventsResponse: - type: object - properties: - event: - title: event - $ref: '#/components/schemas/mantrae.v1.GlobalEvent' - title: GlobalEventsResponse - additionalProperties: false - mantrae.v1.ProfileEvent: - type: object - oneOf: - - properties: - agent: - title: agent - $ref: '#/components/schemas/mantrae.v1.Agent' - title: agent - required: - - agent - - properties: - auditLog: - title: audit_log - $ref: '#/components/schemas/mantrae.v1.AuditLog' - title: audit_log - required: - - auditLog - - properties: - entryPoint: - title: entry_point - $ref: '#/components/schemas/mantrae.v1.EntryPoint' - title: entry_point - required: - - entryPoint - - properties: - middleware: - title: middleware - $ref: '#/components/schemas/mantrae.v1.Middleware' - title: middleware - required: - - middleware - - properties: - router: - title: router - $ref: '#/components/schemas/mantrae.v1.Router' - title: router - required: - - router - - properties: - service: - title: service - $ref: '#/components/schemas/mantrae.v1.Service' - title: service - required: - - service - properties: - eventType: - title: event_type - $ref: '#/components/schemas/mantrae.v1.EventType' - resourceType: - title: resource_type - $ref: '#/components/schemas/mantrae.v1.ResourceType' - profileId: - type: - - integer - - string - title: profile_id - format: int64 - timestamp: - title: timestamp - $ref: '#/components/schemas/google.protobuf.Timestamp' - title: ProfileEvent - additionalProperties: false - mantrae.v1.ProfileEventsRequest: - type: object - properties: - profileId: - exclusiveMinimum: 0 - type: - - integer - - string - title: profile_id - format: int64 - resourceTypes: - type: array - items: - $ref: '#/components/schemas/mantrae.v1.ResourceType' - title: resource_types - description: Filter by specific resource types - title: ProfileEventsRequest - additionalProperties: false - mantrae.v1.ProfileEventsResponse: - type: object - properties: - event: - title: event - $ref: '#/components/schemas/mantrae.v1.ProfileEvent' - title: ProfileEventsResponse - additionalProperties: false - mantrae.v1.CreateProfileRequest: - type: object - properties: - name: - type: string - title: name - minLength: 1 - description: - type: string - title: description - nullable: true - title: CreateProfileRequest - additionalProperties: false - mantrae.v1.CreateProfileResponse: - type: object - properties: - profile: - title: profile - $ref: '#/components/schemas/mantrae.v1.Profile' - title: CreateProfileResponse - additionalProperties: false - mantrae.v1.DeleteProfileRequest: - type: object - properties: - id: - exclusiveMinimum: 0 - type: - - integer - - string - title: id - format: int64 - title: DeleteProfileRequest - additionalProperties: false - mantrae.v1.DeleteProfileResponse: - type: object - title: DeleteProfileResponse - additionalProperties: false - mantrae.v1.GetProfileRequest: - type: object - properties: - id: - exclusiveMinimum: 0 - type: - - integer - - string - title: id - format: int64 - title: GetProfileRequest - additionalProperties: false - mantrae.v1.GetProfileResponse: - type: object - properties: - profile: - title: profile - $ref: '#/components/schemas/mantrae.v1.Profile' - title: GetProfileResponse - additionalProperties: false - mantrae.v1.ListProfilesRequest: - type: object - properties: - limit: - type: - - integer - - string - title: limit - format: int64 - description: |+ - limit must be either -1 or greater than 0: - ``` - this == -1 || this > 0 - ``` - - nullable: true - offset: - type: - - integer - - string - title: offset - format: int64 - nullable: true - title: ListProfilesRequest - additionalProperties: false - mantrae.v1.ListProfilesResponse: - type: object - properties: - profiles: - type: array - items: - $ref: '#/components/schemas/mantrae.v1.Profile' - title: profiles - totalCount: - type: - - integer - - string - title: total_count - format: int64 - title: ListProfilesResponse - additionalProperties: false - mantrae.v1.Profile: - type: object - properties: - id: - type: - - integer - - string - title: id - format: int64 - name: - type: string - title: name - description: - type: string - title: description - token: - type: string - title: token - createdAt: - title: created_at - $ref: '#/components/schemas/google.protobuf.Timestamp' - updatedAt: - title: updated_at - $ref: '#/components/schemas/google.protobuf.Timestamp' - title: Profile - additionalProperties: false - mantrae.v1.UpdateProfileRequest: - type: object - properties: - id: - exclusiveMinimum: 0 - type: - - integer - - string - title: id - format: int64 - name: - type: string - title: name - minLength: 1 - description: - type: string - title: description - nullable: true - regenerateToken: - type: boolean - title: regenerate_token - nullable: true - title: UpdateProfileRequest - additionalProperties: false - mantrae.v1.UpdateProfileResponse: - type: object - properties: - profile: - title: profile - $ref: '#/components/schemas/mantrae.v1.Profile' - title: UpdateProfileResponse - additionalProperties: false - mantrae.v1.ServersTransportType: - type: string - title: ServersTransportType - enum: - - SERVERS_TRANSPORT_TYPE_UNSPECIFIED - - SERVERS_TRANSPORT_TYPE_HTTP - - SERVERS_TRANSPORT_TYPE_TCP - mantrae.v1.CreateServersTransportRequest: - type: object - properties: - profileId: - exclusiveMinimum: 0 - type: - - integer - - string - title: profile_id - format: int64 - agentId: - type: string - title: agent_id - name: - type: string - title: name - minLength: 1 - config: - title: config - $ref: '#/components/schemas/google.protobuf.Struct' - enabled: - type: boolean - title: enabled - type: - title: type - $ref: '#/components/schemas/mantrae.v1.ServersTransportType' - title: CreateServersTransportRequest - additionalProperties: false - mantrae.v1.CreateServersTransportResponse: - type: object - properties: - serversTransport: - title: servers_transport - $ref: '#/components/schemas/mantrae.v1.ServersTransport' - title: CreateServersTransportResponse - additionalProperties: false - mantrae.v1.DeleteServersTransportRequest: - type: object - properties: - id: - exclusiveMinimum: 0 - type: - - integer - - string - title: id - format: int64 - type: - title: type - $ref: '#/components/schemas/mantrae.v1.ServersTransportType' - title: DeleteServersTransportRequest - additionalProperties: false - mantrae.v1.DeleteServersTransportResponse: - type: object - title: DeleteServersTransportResponse - additionalProperties: false - mantrae.v1.GetServersTransportRequest: - type: object - properties: - id: - exclusiveMinimum: 0 - type: - - integer - - string - title: id - format: int64 - type: - title: type - $ref: '#/components/schemas/mantrae.v1.ServersTransportType' - title: GetServersTransportRequest - additionalProperties: false - mantrae.v1.GetServersTransportResponse: - type: object - properties: - serversTransport: - title: servers_transport - $ref: '#/components/schemas/mantrae.v1.ServersTransport' - title: GetServersTransportResponse - additionalProperties: false - mantrae.v1.ListServersTransportsRequest: - type: object - properties: - profileId: - exclusiveMinimum: 0 - type: - - integer - - string - title: profile_id - format: int64 - agentId: - type: string - title: agent_id - minLength: 1 - nullable: true - type: - title: type - nullable: true - $ref: '#/components/schemas/mantrae.v1.ServersTransportType' - limit: - type: - - integer - - string - title: limit - format: int64 - description: |+ - limit must be either -1 or greater than 0: - ``` - this == -1 || this > 0 - ``` - - nullable: true - offset: - type: - - integer - - string - title: offset - format: int64 - nullable: true - title: ListServersTransportsRequest - additionalProperties: false - mantrae.v1.ListServersTransportsResponse: - type: object - properties: - serversTransports: - type: array - items: - $ref: '#/components/schemas/mantrae.v1.ServersTransport' - title: servers_transports - totalCount: - type: - - integer - - string - title: total_count - format: int64 - title: ListServersTransportsResponse - additionalProperties: false - mantrae.v1.ServersTransport: - type: object - properties: - id: - type: - - integer - - string - title: id - format: int64 - profileId: - type: - - integer - - string - title: profile_id - format: int64 - agentId: - type: string - title: agent_id - name: - type: string - title: name - config: - title: config - $ref: '#/components/schemas/google.protobuf.Struct' - enabled: - type: boolean - title: enabled - type: - title: type - $ref: '#/components/schemas/mantrae.v1.ServersTransportType' - createdAt: - title: created_at - $ref: '#/components/schemas/google.protobuf.Timestamp' - updatedAt: - title: updated_at - $ref: '#/components/schemas/google.protobuf.Timestamp' - title: ServersTransport - additionalProperties: false - mantrae.v1.UpdateServersTransportRequest: - type: object - properties: - id: - exclusiveMinimum: 0 - type: - - integer - - string - title: id - format: int64 - name: - type: string - title: name - minLength: 1 - config: - title: config - $ref: '#/components/schemas/google.protobuf.Struct' - enabled: - type: boolean - title: enabled - type: - title: type - $ref: '#/components/schemas/mantrae.v1.ServersTransportType' - title: UpdateServersTransportRequest - additionalProperties: false - mantrae.v1.UpdateServersTransportResponse: - type: object - properties: - serversTransport: - title: servers_transport - $ref: '#/components/schemas/mantrae.v1.ServersTransport' - title: UpdateServersTransportResponse - additionalProperties: false - mantrae.v1.GetSettingRequest: - type: object - properties: - key: - type: string - title: key - minLength: 1 - title: GetSettingRequest - additionalProperties: false - mantrae.v1.GetSettingResponse: - type: object - properties: - value: - type: string - title: value - title: GetSettingResponse - additionalProperties: false - mantrae.v1.ListSettingsRequest: - type: object - title: ListSettingsRequest - additionalProperties: false - mantrae.v1.ListSettingsResponse: - type: object - properties: - settings: - type: array - items: - $ref: '#/components/schemas/mantrae.v1.Setting' - title: settings - title: ListSettingsResponse - additionalProperties: false - mantrae.v1.Setting: - type: object - properties: - key: - type: string - title: key - value: - type: string - title: value - updatedAt: - title: updated_at - $ref: '#/components/schemas/google.protobuf.Timestamp' - title: Setting - additionalProperties: false - mantrae.v1.UpdateSettingRequest: - type: object - properties: - key: - type: string - title: key - minLength: 1 - value: - type: string - title: value - title: UpdateSettingRequest - additionalProperties: false - mantrae.v1.UpdateSettingResponse: - type: object - properties: - setting: - title: setting - $ref: '#/components/schemas/mantrae.v1.Setting' - title: UpdateSettingResponse - additionalProperties: false mantrae.v1.GetPublicIPRequest: type: object title: GetPublicIPRequest @@ -4414,6 +4257,283 @@ paths: application/json: schema: $ref: '#/components/schemas/mantrae.v1.GetMiddlewarePluginsResponse' + /mantrae.v1.ProfileService/GetProfile: + get: + tags: + - mantrae.v1.ProfileService + summary: GetProfile + operationId: mantrae.v1.ProfileService.GetProfile.get + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + - name: message + in: query + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.GetProfileRequest' + - name: encoding + in: query + required: true + schema: + $ref: '#/components/schemas/encoding' + - name: base64 + in: query + schema: + $ref: '#/components/schemas/base64' + - name: compression + in: query + schema: + $ref: '#/components/schemas/compression' + - name: connect + in: query + schema: + $ref: '#/components/schemas/connect' + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.GetProfileResponse' + post: + tags: + - mantrae.v1.ProfileService + summary: GetProfile + operationId: mantrae.v1.ProfileService.GetProfile + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.GetProfileRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.GetProfileResponse' + /mantrae.v1.ProfileService/CreateProfile: + post: + tags: + - mantrae.v1.ProfileService + summary: CreateProfile + operationId: mantrae.v1.ProfileService.CreateProfile + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.CreateProfileRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.CreateProfileResponse' + /mantrae.v1.ProfileService/UpdateProfile: + post: + tags: + - mantrae.v1.ProfileService + summary: UpdateProfile + operationId: mantrae.v1.ProfileService.UpdateProfile + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.UpdateProfileRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.UpdateProfileResponse' + /mantrae.v1.ProfileService/DeleteProfile: + post: + tags: + - mantrae.v1.ProfileService + summary: DeleteProfile + operationId: mantrae.v1.ProfileService.DeleteProfile + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.DeleteProfileRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.DeleteProfileResponse' + /mantrae.v1.ProfileService/ListProfiles: + get: + tags: + - mantrae.v1.ProfileService + summary: ListProfiles + operationId: mantrae.v1.ProfileService.ListProfiles.get + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + - name: message + in: query + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.ListProfilesRequest' + - name: encoding + in: query + required: true + schema: + $ref: '#/components/schemas/encoding' + - name: base64 + in: query + schema: + $ref: '#/components/schemas/base64' + - name: compression + in: query + schema: + $ref: '#/components/schemas/compression' + - name: connect + in: query + schema: + $ref: '#/components/schemas/connect' + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.ListProfilesResponse' + post: + tags: + - mantrae.v1.ProfileService + summary: ListProfiles + operationId: mantrae.v1.ProfileService.ListProfiles + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.ListProfilesRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.ListProfilesResponse' /mantrae.v1.RouterService/GetRouter: get: tags: @@ -4691,6 +4811,283 @@ paths: application/json: schema: $ref: '#/components/schemas/mantrae.v1.ListRoutersResponse' + /mantrae.v1.ServersTransportService/GetServersTransport: + get: + tags: + - mantrae.v1.ServersTransportService + summary: GetServersTransport + operationId: mantrae.v1.ServersTransportService.GetServersTransport.get + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + - name: message + in: query + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.GetServersTransportRequest' + - name: encoding + in: query + required: true + schema: + $ref: '#/components/schemas/encoding' + - name: base64 + in: query + schema: + $ref: '#/components/schemas/base64' + - name: compression + in: query + schema: + $ref: '#/components/schemas/compression' + - name: connect + in: query + schema: + $ref: '#/components/schemas/connect' + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.GetServersTransportResponse' + post: + tags: + - mantrae.v1.ServersTransportService + summary: GetServersTransport + operationId: mantrae.v1.ServersTransportService.GetServersTransport + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.GetServersTransportRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.GetServersTransportResponse' + /mantrae.v1.ServersTransportService/CreateServersTransport: + post: + tags: + - mantrae.v1.ServersTransportService + summary: CreateServersTransport + operationId: mantrae.v1.ServersTransportService.CreateServersTransport + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.CreateServersTransportRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.CreateServersTransportResponse' + /mantrae.v1.ServersTransportService/UpdateServersTransport: + post: + tags: + - mantrae.v1.ServersTransportService + summary: UpdateServersTransport + operationId: mantrae.v1.ServersTransportService.UpdateServersTransport + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.UpdateServersTransportRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.UpdateServersTransportResponse' + /mantrae.v1.ServersTransportService/DeleteServersTransport: + post: + tags: + - mantrae.v1.ServersTransportService + summary: DeleteServersTransport + operationId: mantrae.v1.ServersTransportService.DeleteServersTransport + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.DeleteServersTransportRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.DeleteServersTransportResponse' + /mantrae.v1.ServersTransportService/ListServersTransports: + get: + tags: + - mantrae.v1.ServersTransportService + summary: ListServersTransports + operationId: mantrae.v1.ServersTransportService.ListServersTransports.get + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + - name: message + in: query + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.ListServersTransportsRequest' + - name: encoding + in: query + required: true + schema: + $ref: '#/components/schemas/encoding' + - name: base64 + in: query + schema: + $ref: '#/components/schemas/base64' + - name: compression + in: query + schema: + $ref: '#/components/schemas/compression' + - name: connect + in: query + schema: + $ref: '#/components/schemas/connect' + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.ListServersTransportsResponse' + post: + tags: + - mantrae.v1.ServersTransportService + summary: ListServersTransports + operationId: mantrae.v1.ServersTransportService.ListServersTransports + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.ListServersTransportsRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.ListServersTransportsResponse' /mantrae.v1.ServiceService/GetService: get: tags: @@ -5054,6 +5451,213 @@ paths: application/json: schema: $ref: '#/components/schemas/mantrae.v1.GetServiceByRouterResponse' + /mantrae.v1.SettingService/GetSetting: + get: + tags: + - mantrae.v1.SettingService + summary: GetSetting + operationId: mantrae.v1.SettingService.GetSetting.get + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + - name: message + in: query + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.GetSettingRequest' + - name: encoding + in: query + required: true + schema: + $ref: '#/components/schemas/encoding' + - name: base64 + in: query + schema: + $ref: '#/components/schemas/base64' + - name: compression + in: query + schema: + $ref: '#/components/schemas/compression' + - name: connect + in: query + schema: + $ref: '#/components/schemas/connect' + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.GetSettingResponse' + post: + tags: + - mantrae.v1.SettingService + summary: GetSetting + operationId: mantrae.v1.SettingService.GetSetting + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.GetSettingRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.GetSettingResponse' + /mantrae.v1.SettingService/UpdateSetting: + post: + tags: + - mantrae.v1.SettingService + summary: UpdateSetting + operationId: mantrae.v1.SettingService.UpdateSetting + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.UpdateSettingRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.UpdateSettingResponse' + /mantrae.v1.SettingService/ListSettings: + get: + tags: + - mantrae.v1.SettingService + summary: ListSettings + operationId: mantrae.v1.SettingService.ListSettings.get + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + - name: message + in: query + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.ListSettingsRequest' + - name: encoding + in: query + required: true + schema: + $ref: '#/components/schemas/encoding' + - name: base64 + in: query + schema: + $ref: '#/components/schemas/base64' + - name: compression + in: query + schema: + $ref: '#/components/schemas/compression' + - name: connect + in: query + schema: + $ref: '#/components/schemas/connect' + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.ListSettingsResponse' + post: + tags: + - mantrae.v1.SettingService + summary: ListSettings + operationId: mantrae.v1.SettingService.ListSettings + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.ListSettingsRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/mantrae.v1.ListSettingsResponse' /mantrae.v1.UserService/LoginUser: post: tags: @@ -5506,965 +6110,6 @@ paths: application/json: schema: $ref: '#/components/schemas/mantrae.v1.GetOIDCStatusResponse' - /mantrae.v1.EventService/ProfileEvents: - post: - tags: - - mantrae.v1.EventService - summary: ProfileEvents - description: Profile-scoped events (routers, services, middlewares, entrypoints) - operationId: mantrae.v1.EventService.ProfileEvents - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - requestBody: - content: - application/connect+json: - schema: - $ref: '#/components/schemas/mantrae.v1.ProfileEventsRequest' - application/connect+proto: - schema: - $ref: '#/components/schemas/mantrae.v1.ProfileEventsRequest' - application/grpc: - schema: - $ref: '#/components/schemas/mantrae.v1.ProfileEventsRequest' - application/grpc+proto: - schema: - $ref: '#/components/schemas/mantrae.v1.ProfileEventsRequest' - application/grpc+json: - schema: - $ref: '#/components/schemas/mantrae.v1.ProfileEventsRequest' - application/grpc-web: - schema: - $ref: '#/components/schemas/mantrae.v1.ProfileEventsRequest' - application/grpc-web+proto: - schema: - $ref: '#/components/schemas/mantrae.v1.ProfileEventsRequest' - application/grpc-web+json: - schema: - $ref: '#/components/schemas/mantrae.v1.ProfileEventsRequest' - required: true - responses: - default: - description: Error - content: - application/connect+json: - schema: - $ref: '#/components/schemas/connect.error' - application/connect+proto: - schema: - $ref: '#/components/schemas/connect.error' - application/grpc: - schema: - $ref: '#/components/schemas/connect.error' - application/grpc+proto: - schema: - $ref: '#/components/schemas/connect.error' - application/grpc+json: - schema: - $ref: '#/components/schemas/connect.error' - application/grpc-web: - schema: - $ref: '#/components/schemas/connect.error' - application/grpc-web+proto: - schema: - $ref: '#/components/schemas/connect.error' - application/grpc-web+json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/connect+json: - schema: - $ref: '#/components/schemas/mantrae.v1.ProfileEventsResponse' - application/connect+proto: - schema: - $ref: '#/components/schemas/mantrae.v1.ProfileEventsResponse' - application/grpc: - schema: - $ref: '#/components/schemas/mantrae.v1.ProfileEventsResponse' - application/grpc+proto: - schema: - $ref: '#/components/schemas/mantrae.v1.ProfileEventsResponse' - application/grpc+json: - schema: - $ref: '#/components/schemas/mantrae.v1.ProfileEventsResponse' - application/grpc-web: - schema: - $ref: '#/components/schemas/mantrae.v1.ProfileEventsResponse' - application/grpc-web+proto: - schema: - $ref: '#/components/schemas/mantrae.v1.ProfileEventsResponse' - application/grpc-web+json: - schema: - $ref: '#/components/schemas/mantrae.v1.ProfileEventsResponse' - /mantrae.v1.EventService/GlobalEvents: - post: - tags: - - mantrae.v1.EventService - summary: GlobalEvents - description: Global events (users, dns) - operationId: mantrae.v1.EventService.GlobalEvents - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - requestBody: - content: - application/connect+json: - schema: - $ref: '#/components/schemas/mantrae.v1.GlobalEventsRequest' - application/connect+proto: - schema: - $ref: '#/components/schemas/mantrae.v1.GlobalEventsRequest' - application/grpc: - schema: - $ref: '#/components/schemas/mantrae.v1.GlobalEventsRequest' - application/grpc+proto: - schema: - $ref: '#/components/schemas/mantrae.v1.GlobalEventsRequest' - application/grpc+json: - schema: - $ref: '#/components/schemas/mantrae.v1.GlobalEventsRequest' - application/grpc-web: - schema: - $ref: '#/components/schemas/mantrae.v1.GlobalEventsRequest' - application/grpc-web+proto: - schema: - $ref: '#/components/schemas/mantrae.v1.GlobalEventsRequest' - application/grpc-web+json: - schema: - $ref: '#/components/schemas/mantrae.v1.GlobalEventsRequest' - required: true - responses: - default: - description: Error - content: - application/connect+json: - schema: - $ref: '#/components/schemas/connect.error' - application/connect+proto: - schema: - $ref: '#/components/schemas/connect.error' - application/grpc: - schema: - $ref: '#/components/schemas/connect.error' - application/grpc+proto: - schema: - $ref: '#/components/schemas/connect.error' - application/grpc+json: - schema: - $ref: '#/components/schemas/connect.error' - application/grpc-web: - schema: - $ref: '#/components/schemas/connect.error' - application/grpc-web+proto: - schema: - $ref: '#/components/schemas/connect.error' - application/grpc-web+json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/connect+json: - schema: - $ref: '#/components/schemas/mantrae.v1.GlobalEventsResponse' - application/connect+proto: - schema: - $ref: '#/components/schemas/mantrae.v1.GlobalEventsResponse' - application/grpc: - schema: - $ref: '#/components/schemas/mantrae.v1.GlobalEventsResponse' - application/grpc+proto: - schema: - $ref: '#/components/schemas/mantrae.v1.GlobalEventsResponse' - application/grpc+json: - schema: - $ref: '#/components/schemas/mantrae.v1.GlobalEventsResponse' - application/grpc-web: - schema: - $ref: '#/components/schemas/mantrae.v1.GlobalEventsResponse' - application/grpc-web+proto: - schema: - $ref: '#/components/schemas/mantrae.v1.GlobalEventsResponse' - application/grpc-web+json: - schema: - $ref: '#/components/schemas/mantrae.v1.GlobalEventsResponse' - /mantrae.v1.ProfileService/GetProfile: - get: - tags: - - mantrae.v1.ProfileService - summary: GetProfile - operationId: mantrae.v1.ProfileService.GetProfile.get - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - - name: message - in: query - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.GetProfileRequest' - - name: encoding - in: query - required: true - schema: - $ref: '#/components/schemas/encoding' - - name: base64 - in: query - schema: - $ref: '#/components/schemas/base64' - - name: compression - in: query - schema: - $ref: '#/components/schemas/compression' - - name: connect - in: query - schema: - $ref: '#/components/schemas/connect' - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.GetProfileResponse' - post: - tags: - - mantrae.v1.ProfileService - summary: GetProfile - operationId: mantrae.v1.ProfileService.GetProfile - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.GetProfileRequest' - required: true - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.GetProfileResponse' - /mantrae.v1.ProfileService/CreateProfile: - post: - tags: - - mantrae.v1.ProfileService - summary: CreateProfile - operationId: mantrae.v1.ProfileService.CreateProfile - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.CreateProfileRequest' - required: true - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.CreateProfileResponse' - /mantrae.v1.ProfileService/UpdateProfile: - post: - tags: - - mantrae.v1.ProfileService - summary: UpdateProfile - operationId: mantrae.v1.ProfileService.UpdateProfile - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.UpdateProfileRequest' - required: true - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.UpdateProfileResponse' - /mantrae.v1.ProfileService/DeleteProfile: - post: - tags: - - mantrae.v1.ProfileService - summary: DeleteProfile - operationId: mantrae.v1.ProfileService.DeleteProfile - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.DeleteProfileRequest' - required: true - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.DeleteProfileResponse' - /mantrae.v1.ProfileService/ListProfiles: - get: - tags: - - mantrae.v1.ProfileService - summary: ListProfiles - operationId: mantrae.v1.ProfileService.ListProfiles.get - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - - name: message - in: query - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.ListProfilesRequest' - - name: encoding - in: query - required: true - schema: - $ref: '#/components/schemas/encoding' - - name: base64 - in: query - schema: - $ref: '#/components/schemas/base64' - - name: compression - in: query - schema: - $ref: '#/components/schemas/compression' - - name: connect - in: query - schema: - $ref: '#/components/schemas/connect' - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.ListProfilesResponse' - post: - tags: - - mantrae.v1.ProfileService - summary: ListProfiles - operationId: mantrae.v1.ProfileService.ListProfiles - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.ListProfilesRequest' - required: true - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.ListProfilesResponse' - /mantrae.v1.ServersTransportService/GetServersTransport: - get: - tags: - - mantrae.v1.ServersTransportService - summary: GetServersTransport - operationId: mantrae.v1.ServersTransportService.GetServersTransport.get - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - - name: message - in: query - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.GetServersTransportRequest' - - name: encoding - in: query - required: true - schema: - $ref: '#/components/schemas/encoding' - - name: base64 - in: query - schema: - $ref: '#/components/schemas/base64' - - name: compression - in: query - schema: - $ref: '#/components/schemas/compression' - - name: connect - in: query - schema: - $ref: '#/components/schemas/connect' - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.GetServersTransportResponse' - post: - tags: - - mantrae.v1.ServersTransportService - summary: GetServersTransport - operationId: mantrae.v1.ServersTransportService.GetServersTransport - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.GetServersTransportRequest' - required: true - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.GetServersTransportResponse' - /mantrae.v1.ServersTransportService/CreateServersTransport: - post: - tags: - - mantrae.v1.ServersTransportService - summary: CreateServersTransport - operationId: mantrae.v1.ServersTransportService.CreateServersTransport - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.CreateServersTransportRequest' - required: true - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.CreateServersTransportResponse' - /mantrae.v1.ServersTransportService/UpdateServersTransport: - post: - tags: - - mantrae.v1.ServersTransportService - summary: UpdateServersTransport - operationId: mantrae.v1.ServersTransportService.UpdateServersTransport - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.UpdateServersTransportRequest' - required: true - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.UpdateServersTransportResponse' - /mantrae.v1.ServersTransportService/DeleteServersTransport: - post: - tags: - - mantrae.v1.ServersTransportService - summary: DeleteServersTransport - operationId: mantrae.v1.ServersTransportService.DeleteServersTransport - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.DeleteServersTransportRequest' - required: true - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.DeleteServersTransportResponse' - /mantrae.v1.ServersTransportService/ListServersTransports: - get: - tags: - - mantrae.v1.ServersTransportService - summary: ListServersTransports - operationId: mantrae.v1.ServersTransportService.ListServersTransports.get - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - - name: message - in: query - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.ListServersTransportsRequest' - - name: encoding - in: query - required: true - schema: - $ref: '#/components/schemas/encoding' - - name: base64 - in: query - schema: - $ref: '#/components/schemas/base64' - - name: compression - in: query - schema: - $ref: '#/components/schemas/compression' - - name: connect - in: query - schema: - $ref: '#/components/schemas/connect' - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.ListServersTransportsResponse' - post: - tags: - - mantrae.v1.ServersTransportService - summary: ListServersTransports - operationId: mantrae.v1.ServersTransportService.ListServersTransports - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.ListServersTransportsRequest' - required: true - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.ListServersTransportsResponse' - /mantrae.v1.SettingService/GetSetting: - get: - tags: - - mantrae.v1.SettingService - summary: GetSetting - operationId: mantrae.v1.SettingService.GetSetting.get - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - - name: message - in: query - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.GetSettingRequest' - - name: encoding - in: query - required: true - schema: - $ref: '#/components/schemas/encoding' - - name: base64 - in: query - schema: - $ref: '#/components/schemas/base64' - - name: compression - in: query - schema: - $ref: '#/components/schemas/compression' - - name: connect - in: query - schema: - $ref: '#/components/schemas/connect' - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.GetSettingResponse' - post: - tags: - - mantrae.v1.SettingService - summary: GetSetting - operationId: mantrae.v1.SettingService.GetSetting - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.GetSettingRequest' - required: true - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.GetSettingResponse' - /mantrae.v1.SettingService/UpdateSetting: - post: - tags: - - mantrae.v1.SettingService - summary: UpdateSetting - operationId: mantrae.v1.SettingService.UpdateSetting - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.UpdateSettingRequest' - required: true - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.UpdateSettingResponse' - /mantrae.v1.SettingService/ListSettings: - get: - tags: - - mantrae.v1.SettingService - summary: ListSettings - operationId: mantrae.v1.SettingService.ListSettings.get - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - - name: message - in: query - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.ListSettingsRequest' - - name: encoding - in: query - required: true - schema: - $ref: '#/components/schemas/encoding' - - name: base64 - in: query - schema: - $ref: '#/components/schemas/base64' - - name: compression - in: query - schema: - $ref: '#/components/schemas/compression' - - name: connect - in: query - schema: - $ref: '#/components/schemas/connect' - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.ListSettingsResponse' - post: - tags: - - mantrae.v1.SettingService - summary: ListSettings - operationId: mantrae.v1.SettingService.ListSettings - parameters: - - name: Connect-Protocol-Version - in: header - required: true - schema: - $ref: '#/components/schemas/connect-protocol-version' - - name: Connect-Timeout-Ms - in: header - schema: - $ref: '#/components/schemas/connect-timeout-header' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.ListSettingsRequest' - required: true - responses: - default: - description: Error - content: - application/json: - schema: - $ref: '#/components/schemas/connect.error' - "200": - description: Success - content: - application/json: - schema: - $ref: '#/components/schemas/mantrae.v1.ListSettingsResponse' /mantrae.v1.UtilService/GetVersion: post: tags: @@ -6542,11 +6187,10 @@ tags: - name: mantrae.v1.DnsProviderService - name: mantrae.v1.EntryPointService - name: mantrae.v1.MiddlewareService - - name: mantrae.v1.RouterService - - name: mantrae.v1.ServiceService - - name: mantrae.v1.UserService - - name: mantrae.v1.EventService - name: mantrae.v1.ProfileService + - name: mantrae.v1.RouterService - name: mantrae.v1.ServersTransportService + - name: mantrae.v1.ServiceService - name: mantrae.v1.SettingService + - name: mantrae.v1.UserService - name: mantrae.v1.UtilService diff --git a/proto/mantrae/v1/entry_point.proto b/proto/mantrae/v1/entry_point.proto index c447758..7eaf6ec 100644 --- a/proto/mantrae/v1/entry_point.proto +++ b/proto/mantrae/v1/entry_point.proto @@ -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 {} diff --git a/proto/mantrae/v1/event.proto b/proto/mantrae/v1/event.proto deleted file mode 100644 index e0a8352..0000000 --- a/proto/mantrae/v1/event.proto +++ /dev/null @@ -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; -} diff --git a/proto/mantrae/v1/middleware.proto b/proto/mantrae/v1/middleware.proto index f2eb732..1f530d8 100644 --- a/proto/mantrae/v1/middleware.proto +++ b/proto/mantrae/v1/middleware.proto @@ -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" diff --git a/proto/mantrae/v1/router.proto b/proto/mantrae/v1/router.proto index 928d443..53bff4f 100644 --- a/proto/mantrae/v1/router.proto +++ b/proto/mantrae/v1/router.proto @@ -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" diff --git a/proto/mantrae/v1/servers_transport.proto b/proto/mantrae/v1/servers_transport.proto index 97df3c7..e2dcbf1 100644 --- a/proto/mantrae/v1/servers_transport.proto +++ b/proto/mantrae/v1/servers_transport.proto @@ -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" diff --git a/proto/mantrae/v1/service.proto b/proto/mantrae/v1/service.proto index bb8b7b0..cf2ae73 100644 --- a/proto/mantrae/v1/service.proto +++ b/proto/mantrae/v1/service.proto @@ -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; diff --git a/proto/mantrae/v1/user.proto b/proto/mantrae/v1/user.proto index 353a8d6..4742902 100644 --- a/proto/mantrae/v1/user.proto +++ b/proto/mantrae/v1/user.proto @@ -87,7 +87,10 @@ message GetUserResponse { message CreateUserRequest { string username = 1 [(buf.validate.field).string.min_len = 3]; string password = 2 [(buf.validate.field).string.min_len = 8]; - string email = 3 [(buf.validate.field).string.email = true]; + optional string email = 3 [ + (buf.validate.field).string.email = true, + (buf.validate.field).ignore = IGNORE_UNSPECIFIED + ]; } message CreateUserResponse { User user = 1; @@ -96,10 +99,13 @@ message CreateUserResponse { message UpdateUserRequest { string id = 1 [(buf.validate.field).string.min_len = 1]; string username = 2 [(buf.validate.field).string.min_len = 3]; - string email = 3 [(buf.validate.field).string.email = true]; - optional string password = 5 [ + optional string email = 3 [ + (buf.validate.field).string.email = true, + (buf.validate.field).ignore = IGNORE_UNSPECIFIED + ]; + optional string password = 4 [ (buf.validate.field).string.min_len = 8, - (buf.validate.field).ignore = IGNORE_IF_UNPOPULATED + (buf.validate.field).ignore = IGNORE_UNSPECIFIED ]; } message UpdateUserResponse { diff --git a/sqlc.yml b/sqlc.yml index 515dc5e..7d85149 100644 --- a/sqlc.yml +++ b/sqlc.yml @@ -7,11 +7,11 @@ sql: go: package: "db" out: "internal/store/db" - emit_json_tags: true - emit_prepared_queries: true - emit_interface: true - emit_pointers_for_null_types: true json_tags_case_style: "camel" + emit_json_tags: true # Adds JSON tags to generated structs + emit_interface: true # Output a Querier interface in the generated package + emit_prepared_queries: true + emit_pointers_for_null_types: true # Pointers for null types overrides: - column: "http_routers.config" go_type: diff --git a/taskfile.yaml b/taskfile.yaml new file mode 100644 index 0000000..ae0f74d --- /dev/null +++ b/taskfile.yaml @@ -0,0 +1,78 @@ +version: "3" + +output: prefixed + +env: + IMAGE_SERVER_DEV: ko.local/mantrae + IMAGE_AGENT_DEV: ko.local/mantrae-agent + IMAGE_SERVER_PROD: ghcr.io/mizuchilabs/mantrae + IMAGE_AGENT_PROD: ghcr.io/mizuchilabs/mantrae-agent + +tasks: + dev: + desc: Run Go backend and Vite frontend concurrently + deps: [backend, frontend] + + backend: + desc: Run Go backend + cmds: + - go run main.go + silent: false + + frontend: + desc: Run Vite frontend + cmds: + - pnpm run dev + dir: web + silent: false + + agent: + desc: Run Go agent + cmds: + - go run main.go + dir: cmd/agent + silent: false + + # 󰚰 Update deps + update: + desc: Update dependencies + cmds: + - go get -u ./... + - cd web && pnpm update --latest + + #  Build binary + build: + desc: Build Go binary + deps: [build:frontend] + cmds: + - go build -o bin/server ./cmd/server + sources: + - "**/*.go" + generates: + - bin/server + + # 🏗 Build frontend + build:frontend: + desc: Build Svelte frontend + dir: web + cmds: + - pnpm install + - pnpm build + + # 󱓞 Release + release: + desc: Build and release Go binary + deps: [build:frontend] + cmds: + - goreleaser release --clean --skip=validate + + # 󰡨 Build container + docker:build: + desc: Build local test container with ko + deps: [build:frontend] + dir: cmd/server + cmds: + - KO_DOCKER_REPO=$IMAGE_SERVER_DEV ko build --bare . + - KO_DOCKER_REPO=$IMAGE_AGENT_DEV ko build --bare ./agent/cmd + - grype $IMAGE_SERVER_DEV + - grype $IMAGE_AGENT_DEV diff --git a/web/package.json b/web/package.json index fb849be..aa71611 100644 --- a/web/package.json +++ b/web/package.json @@ -11,22 +11,22 @@ "format": "prettier --write ." }, "devDependencies": { - "@bufbuild/protobuf": "^2.6.1", - "@connectrpc/connect": "^2.0.2", - "@connectrpc/connect-web": "^2.0.2", - "@eslint/js": "^9.31.0", + "@bufbuild/protobuf": "^2.6.2", + "@connectrpc/connect": "^2.0.3", + "@connectrpc/connect-web": "^2.0.3", + "@eslint/js": "^9.32.0", "@internationalized/date": "^3.8.2", - "@lucide/svelte": "^0.525.0", + "@lucide/svelte": "^0.526.0", "@sveltejs/adapter-static": "^3.0.8", - "@sveltejs/kit": "^2.25.0", + "@sveltejs/kit": "^2.26.1", "@sveltejs/vite-plugin-svelte": "^6.1.0", "@tailwindcss/vite": "^4.1.11", "@types/eslint": "^9.6.1", - "@types/node": "^24.0.14", - "bits-ui": "2.8.11", + "@types/node": "^24.1.0", + "bits-ui": "2.8.13", "clsx": "^2.1.1", - "eslint": "^9.31.0", - "eslint-config-prettier": "^10.1.5", + "eslint": "^9.32.0", + "eslint-config-prettier": "^10.1.8", "eslint-plugin-svelte": "^3.11.0", "formsnap": "^2.0.1", "globals": "^16.3.0", @@ -34,8 +34,8 @@ "prettier": "^3.6.2", "prettier-plugin-svelte": "^3.4.0", "prettier-plugin-tailwindcss": "^0.6.14", - "shiki": "^3.8.0", - "svelte": "^5.36.7", + "shiki": "^3.8.1", + "svelte": "^5.36.17", "svelte-check": "^4.3.0", "svelte-highlight": "^7.8.3", "svelte-sonner": "^1.0.5", @@ -43,12 +43,12 @@ "tailwind-merge": "^3.3.1", "tailwind-variants": "^1.0.0", "tailwindcss": "^4.1.11", - "tw-animate-css": "^1.3.5", + "tw-animate-css": "^1.3.6", "typescript": "^5.8.3", - "typescript-eslint": "^8.37.0", - "vite": "^7.0.5", + "typescript-eslint": "^8.38.0", + "vite": "^7.0.6", "yaml": "^2.8.0", - "zod": "^4.0.5" + "zod": "^4.0.10" }, "type": "module", "dependencies": { diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 42d598b..e8b8954 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -16,92 +16,92 @@ importers: version: 8.21.3 devDependencies: '@bufbuild/protobuf': - specifier: ^2.6.1 - version: 2.6.1 + specifier: ^2.6.2 + version: 2.6.2 '@connectrpc/connect': - specifier: ^2.0.2 - version: 2.0.2(@bufbuild/protobuf@2.6.1) + specifier: ^2.0.3 + version: 2.0.3(@bufbuild/protobuf@2.6.2) '@connectrpc/connect-web': - specifier: ^2.0.2 - version: 2.0.2(@bufbuild/protobuf@2.6.1)(@connectrpc/connect@2.0.2(@bufbuild/protobuf@2.6.1)) + specifier: ^2.0.3 + version: 2.0.3(@bufbuild/protobuf@2.6.2)(@connectrpc/connect@2.0.3(@bufbuild/protobuf@2.6.2)) '@eslint/js': - specifier: ^9.31.0 - version: 9.31.0 + specifier: ^9.32.0 + version: 9.32.0 '@internationalized/date': specifier: ^3.8.2 version: 3.8.2 '@lucide/svelte': - specifier: ^0.525.0 - version: 0.525.0(svelte@5.36.7) + specifier: ^0.526.0 + version: 0.526.0(svelte@5.36.17) '@sveltejs/adapter-static': specifier: ^3.0.8 - version: 3.0.8(@sveltejs/kit@2.25.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))) + version: 3.0.8(@sveltejs/kit@2.26.1(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))) '@sveltejs/kit': - specifier: ^2.25.0 - version: 2.25.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + specifier: ^2.26.1 + version: 2.26.1(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)) '@sveltejs/vite-plugin-svelte': specifier: ^6.1.0 - version: 6.1.0(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + version: 6.1.0(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)) '@tailwindcss/vite': specifier: ^4.1.11 - version: 4.1.11(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + version: 4.1.11(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 '@types/node': - specifier: ^24.0.14 - version: 24.0.14 + specifier: ^24.1.0 + version: 24.1.0 bits-ui: - specifier: 2.8.11 - version: 2.8.11(@internationalized/date@3.8.2)(svelte@5.36.7) + specifier: 2.8.13 + version: 2.8.13(@internationalized/date@3.8.2)(svelte@5.36.17) clsx: specifier: ^2.1.1 version: 2.1.1 eslint: - specifier: ^9.31.0 - version: 9.31.0(jiti@2.4.2) + specifier: ^9.32.0 + version: 9.32.0(jiti@2.5.1) eslint-config-prettier: - specifier: ^10.1.5 - version: 10.1.5(eslint@9.31.0(jiti@2.4.2)) + specifier: ^10.1.8 + version: 10.1.8(eslint@9.32.0(jiti@2.5.1)) eslint-plugin-svelte: specifier: ^3.11.0 - version: 3.11.0(eslint@9.31.0(jiti@2.4.2))(svelte@5.36.7) + version: 3.11.0(eslint@9.32.0(jiti@2.5.1))(svelte@5.36.17) formsnap: specifier: ^2.0.1 - version: 2.0.1(svelte@5.36.7)(sveltekit-superforms@2.27.1(@sveltejs/kit@2.25.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(@types/json-schema@7.0.15)(esbuild@0.25.6)(svelte@5.36.7)(typescript@5.8.3)) + version: 2.0.1(svelte@5.36.17)(sveltekit-superforms@2.27.1(@sveltejs/kit@2.26.1(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(@types/json-schema@7.0.15)(esbuild@0.25.8)(svelte@5.36.17)(typescript@5.8.3)) globals: specifier: ^16.3.0 version: 16.3.0 mode-watcher: specifier: ^1.1.0 - version: 1.1.0(svelte@5.36.7) + version: 1.1.0(svelte@5.36.17) prettier: specifier: ^3.6.2 version: 3.6.2 prettier-plugin-svelte: specifier: ^3.4.0 - version: 3.4.0(prettier@3.6.2)(svelte@5.36.7) + version: 3.4.0(prettier@3.6.2)(svelte@5.36.17) prettier-plugin-tailwindcss: specifier: ^0.6.14 - version: 0.6.14(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.36.7))(prettier@3.6.2) + version: 0.6.14(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.36.17))(prettier@3.6.2) shiki: - specifier: ^3.8.0 - version: 3.8.0 + specifier: ^3.8.1 + version: 3.8.1 svelte: - specifier: ^5.36.7 - version: 5.36.7 + specifier: ^5.36.17 + version: 5.36.17 svelte-check: specifier: ^4.3.0 - version: 4.3.0(picomatch@4.0.3)(svelte@5.36.7)(typescript@5.8.3) + version: 4.3.0(picomatch@4.0.3)(svelte@5.36.17)(typescript@5.8.3) svelte-highlight: specifier: ^7.8.3 version: 7.8.3 svelte-sonner: specifier: ^1.0.5 - version: 1.0.5(svelte@5.36.7) + version: 1.0.5(svelte@5.36.17) sveltekit-superforms: specifier: ^2.27.1 - version: 2.27.1(@sveltejs/kit@2.25.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(@types/json-schema@7.0.15)(esbuild@0.25.6)(svelte@5.36.7)(typescript@5.8.3) + version: 2.27.1(@sveltejs/kit@2.26.1(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(@types/json-schema@7.0.15)(esbuild@0.25.8)(svelte@5.36.17)(typescript@5.8.3) tailwind-merge: specifier: ^3.3.1 version: 3.3.1 @@ -112,23 +112,23 @@ importers: specifier: ^4.1.11 version: 4.1.11 tw-animate-css: - specifier: ^1.3.5 - version: 1.3.5 + specifier: ^1.3.6 + version: 1.3.6 typescript: specifier: ^5.8.3 version: 5.8.3 typescript-eslint: - specifier: ^8.37.0 - version: 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + specifier: ^8.38.0 + version: 8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3) vite: - specifier: ^7.0.5 - version: 7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + specifier: ^7.0.6 + version: 7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0) yaml: specifier: ^2.8.0 version: 2.8.0 zod: - specifier: ^4.0.5 - version: 4.0.5 + specifier: ^4.0.10 + version: 4.0.10 packages: @@ -142,176 +142,176 @@ packages: '@ark/util@0.46.0': resolution: {integrity: sha512-JPy/NGWn/lvf1WmGCPw2VGpBg5utZraE84I7wli18EDF3p3zc/e9WolT35tINeZO3l7C77SjqRJeAUoT0CvMRg==} - '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + '@babel/runtime@7.28.2': + resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} engines: {node: '>=6.9.0'} - '@bufbuild/protobuf@2.6.1': - resolution: {integrity: sha512-DaG6XlyKpz08bmHY5SGX2gfIllaqtDJ/KwVoxsmP22COOLYwDBe7yD3DZGwXem/Xq7QOc9cuR7R3MpAv5CFfDw==} + '@bufbuild/protobuf@2.6.2': + resolution: {integrity: sha512-vLu7SRY84CV/Dd+NUdgtidn2hS5hSMUC1vDBY0VcviTdgRYkU43vIz3vIFbmx14cX1r+mM7WjzE5Fl1fGEM0RQ==} - '@connectrpc/connect-web@2.0.2': - resolution: {integrity: sha512-QANMFPiL2o66BdBEctg4TsQLe5ozsBLqcle3dCBp7BwGlNGTY6NnNnqmt+YRnpeMW88GgomJwWNMGCrRD9pRKA==} + '@connectrpc/connect-web@2.0.3': + resolution: {integrity: sha512-w4LZ2Ci+NW/kcMoHnoczJgyGTmxuv/MQ+tTm2UNL40HimXKWYCAna/fV0AbHRnTiteiwEBpeSCaxF34MetzhAw==} peerDependencies: '@bufbuild/protobuf': ^2.2.0 - '@connectrpc/connect': 2.0.2 + '@connectrpc/connect': 2.0.3 - '@connectrpc/connect@2.0.2': - resolution: {integrity: sha512-xZuylIUNvNlH52e/4eQsZvY4QZyDJRtEFEDnn/yBrv5Xi5ZZI/p8X+GAHH35ucVaBvv9u7OzHZo8+tEh1EFTxA==} + '@connectrpc/connect@2.0.3': + resolution: {integrity: sha512-jAbVMHVtDCydGt2P20VpmLjbLtERqSV0RMSyQF3k2zhK8pzQ2QaCAcyVhufClqrOAFZUKL5BqVYtttaxvhmRgg==} peerDependencies: '@bufbuild/protobuf': ^2.2.0 - '@esbuild/aix-ppc64@0.25.6': - resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} + '@esbuild/aix-ppc64@0.25.8': + resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.6': - resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} + '@esbuild/android-arm64@0.25.8': + resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.6': - resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} + '@esbuild/android-arm@0.25.8': + resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.6': - resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} + '@esbuild/android-x64@0.25.8': + resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.6': - resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} + '@esbuild/darwin-arm64@0.25.8': + resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.6': - resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} + '@esbuild/darwin-x64@0.25.8': + resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.6': - resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} + '@esbuild/freebsd-arm64@0.25.8': + resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.6': - resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} + '@esbuild/freebsd-x64@0.25.8': + resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.6': - resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} + '@esbuild/linux-arm64@0.25.8': + resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.6': - resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} + '@esbuild/linux-arm@0.25.8': + resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.6': - resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} + '@esbuild/linux-ia32@0.25.8': + resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.6': - resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} + '@esbuild/linux-loong64@0.25.8': + resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.6': - resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} + '@esbuild/linux-mips64el@0.25.8': + resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.6': - resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} + '@esbuild/linux-ppc64@0.25.8': + resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.6': - resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} + '@esbuild/linux-riscv64@0.25.8': + resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.6': - resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} + '@esbuild/linux-s390x@0.25.8': + resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.6': - resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} + '@esbuild/linux-x64@0.25.8': + resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.6': - resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} + '@esbuild/netbsd-arm64@0.25.8': + resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.6': - resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} + '@esbuild/netbsd-x64@0.25.8': + resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.6': - resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} + '@esbuild/openbsd-arm64@0.25.8': + resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.6': - resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} + '@esbuild/openbsd-x64@0.25.8': + resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.6': - resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} + '@esbuild/openharmony-arm64@0.25.8': + resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.6': - resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} + '@esbuild/sunos-x64@0.25.8': + resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.6': - resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} + '@esbuild/win32-arm64@0.25.8': + resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.6': - resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} + '@esbuild/win32-ia32@0.25.8': + resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.6': - resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} + '@esbuild/win32-x64@0.25.8': + resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -342,16 +342,16 @@ packages: resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.31.0': - resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} + '@eslint/js@9.32.0': + resolution: {integrity: sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.3': - resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} + '@eslint/plugin-kit@0.3.4': + resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@exodus/schemasafe@1.3.0': @@ -416,8 +416,8 @@ packages: '@jridgewell/trace-mapping@0.3.29': resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} - '@lucide/svelte@0.525.0': - resolution: {integrity: sha512-dyUxkXzepagLUzL8jHQNdeH286nC66ClLACsg+Neu/bjkRJWPWMzkT+H0DKlE70QdkicGCfs1ZGmXCc351hmZA==} + '@lucide/svelte@0.526.0': + resolution: {integrity: sha512-D0pRA/tTLajPFok7gr5+bMeGeEsszAJOSx02i/jPuiGiakj1DHj3D+OEjTyYLeSHAYOmRu5AdWZB/Ft01tdAUQ==} peerDependencies: svelte: ^5 @@ -439,123 +439,123 @@ packages: '@poppinss/macroable@1.0.5': resolution: {integrity: sha512-6u61y1HHd090MEk1Av0/1btDmm2Hh/+XoJj+HgFYRh9koUPI822ybJbwLHuqjLNCiY+o1gRykg2igEqOf/VBZw==} - '@rollup/rollup-android-arm-eabi@4.45.1': - resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} + '@rollup/rollup-android-arm-eabi@4.45.3': + resolution: {integrity: sha512-8oQkCTve4H4B4JpmD2FV7fV2ZPTxJHN//bRhCqPUU8v6c5APlxteAXyc7BFaEb4aGpUzrPLU4PoAcGhwmRzZTA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.45.1': - resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} + '@rollup/rollup-android-arm64@4.45.3': + resolution: {integrity: sha512-StOsmdXHU2hx3UFTTs6yYxCSwSIgLsfjUBICXyWj625M32OOjakXlaZuGKL+jA3Nvv35+hMxrm/64eCoT07SYQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.45.1': - resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} + '@rollup/rollup-darwin-arm64@4.45.3': + resolution: {integrity: sha512-6CfLF3eqKhCdhK0GUnR5ZS99OFz+dtOeB/uePznLKxjCsk5QjT/V0eSEBb4vj+o/ri3i35MseSEQHCLLAgClVw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.45.1': - resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} + '@rollup/rollup-darwin-x64@4.45.3': + resolution: {integrity: sha512-QLWyWmAJG9elNTNLdcSXUT/M+J7DhEmvs1XPHYcgYkse3UHf9iWTJ+yTPlKMIetiQnNi+cNp+gY4gvjDpREfKw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.45.1': - resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} + '@rollup/rollup-freebsd-arm64@4.45.3': + resolution: {integrity: sha512-ZOvBq+5nL0yrZIEo1eq6r7MPvkJ8kC1XATS/yHvcq3WbDNKNKBQ1uIF4hicyzDMoJt72G+sn1nKsFXpifZyRDA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.45.1': - resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} + '@rollup/rollup-freebsd-x64@4.45.3': + resolution: {integrity: sha512-AYvGR07wecEnyYSovyJ71pTOulbNvsrpRpK6i/IM1b0UGX1vFx51afYuPYPxnvE9aCl5xPnhQicEvdIMxClRgQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': - resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} + '@rollup/rollup-linux-arm-gnueabihf@4.45.3': + resolution: {integrity: sha512-Yx8Cp38tfRRToVLuIWzBHV25/QPzpUreOPIiUuNV7KahNPurYg2pYQ4l7aYnvpvklO1riX4643bXLvDsYSBIrA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.45.1': - resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} + '@rollup/rollup-linux-arm-musleabihf@4.45.3': + resolution: {integrity: sha512-4dIYRNxlXGDKnO6qgcda6LxnObPO6r1OBU9HG8F9pAnHHLtfbiOqCzDvkeHknx+5mfFVH4tWOl+h+cHylwsPWA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.45.1': - resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} + '@rollup/rollup-linux-arm64-gnu@4.45.3': + resolution: {integrity: sha512-M6uVlWKmhLN7LguLDu6396K1W5IBlAaRonjlHQgc3s4dOGceu0FeBuvbXiUPYvup/6b5Ln7IEX7XNm68DN4vrg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.45.1': - resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} + '@rollup/rollup-linux-arm64-musl@4.45.3': + resolution: {integrity: sha512-emaYiOTQJUd6fC9a6jcw9zIWtzaUiuBC+vomggaM4In2iOra/lA6IMHlqZqQZr08NYXrOPMVigreLMeSAwv3Uw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': - resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} + '@rollup/rollup-linux-loongarch64-gnu@4.45.3': + resolution: {integrity: sha512-3P77T5AQ4UfVRJSrTKLiUZDJ6XsxeP80027bp6mOFh8sevSD038mYuIYFiUtrSJxxgFb+NgRJFF9oIa0rlUsmg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': - resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} + '@rollup/rollup-linux-ppc64-gnu@4.45.3': + resolution: {integrity: sha512-/VPH3ZVeSlmCBPhZdx/+4dMXDjaGMhDsWOBo9EwSkGbw2+OAqaslL53Ao2OqCxR0GgYjmmssJ+OoG+qYGE7IBg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.45.1': - resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} + '@rollup/rollup-linux-riscv64-gnu@4.45.3': + resolution: {integrity: sha512-Hs5if0PjROl1MGMmZX3xMAIfqcGxQE2SJWUr/CpDQsOQn43Wq4IvXXxUMWtiY/BrzdqCCJlRgJ5DKxzS3qWkCw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.45.1': - resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} + '@rollup/rollup-linux-riscv64-musl@4.45.3': + resolution: {integrity: sha512-Qm0WOwh3Lk388+HJFl1ILGbd2iOoQf6yl4fdGqOjBzEA+5JYbLcwd+sGsZjs5pkt8Cr/1G42EiXmlRp9ZeTvFA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.45.1': - resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} + '@rollup/rollup-linux-s390x-gnu@4.45.3': + resolution: {integrity: sha512-VJdknTaYw+TqXzlh9c7vaVMh/fV2sU8Khfk4a9vAdYXJawpjf6z3U1k7vDWx2IQ9ZOPoOPxgVpDfYOYhxD7QUA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.45.1': - resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} + '@rollup/rollup-linux-x64-gnu@4.45.3': + resolution: {integrity: sha512-SUDXU5YabLAMl86FpupSQQEWzVG8X0HM+Q/famnJusbPiUgQnTGuSxtxg4UAYgv1ZmRV1nioYYXsgtSokU/7+Q==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.45.1': - resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} + '@rollup/rollup-linux-x64-musl@4.45.3': + resolution: {integrity: sha512-ezmqknOUFgZMN6wW+Avlo4sXF3Frswd+ncrwMz4duyZ5Eqd+dAYgJ+A1MY+12LNZ7XDhCiijJceueYvtnzdviw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.45.1': - resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} + '@rollup/rollup-win32-arm64-msvc@4.45.3': + resolution: {integrity: sha512-1YfXoUEE++gIW66zNB9Twd0Ua5xCXpfYppFUxVT/Io5ZT3fO6Se+C/Jvmh3usaIHHyi53t3kpfjydO2GAy5eBA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.45.1': - resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} + '@rollup/rollup-win32-ia32-msvc@4.45.3': + resolution: {integrity: sha512-Iok2YA3PvC163rVZf2Zy81A0g88IUcSPeU5pOilcbICXre2EP1mxn1Db/l09Z/SK1vdSLtpJXAnwGuMOyf5O9g==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.45.1': - resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} + '@rollup/rollup-win32-x64-msvc@4.45.3': + resolution: {integrity: sha512-HwHCH5GQTOeGYP5wBEBXFVhfQecwRl24Rugoqhh8YwGarsU09bHhOKuqlyW4ZolZCan3eTUax7UJbGSmKSM51A==} cpu: [x64] os: [win32] - '@shikijs/core@3.8.0': - resolution: {integrity: sha512-gWt8NNZFurL6FMESO4lEsmspDh0H1fyUibhx1NnEH/S3kOXgYiWa6ZFqy+dcjBLhZqCXsepuUaL1QFXk6PrpsQ==} + '@shikijs/core@3.8.1': + resolution: {integrity: sha512-uTSXzUBQ/IgFcUa6gmGShCHr4tMdR3pxUiiWKDm8pd42UKJdYhkAYsAmHX5mTwybQ5VyGDgTjW4qKSsRvGSang==} - '@shikijs/engine-javascript@3.8.0': - resolution: {integrity: sha512-IBULFFpQ1N5Cg/C7jPCGnjIKz72CcRtD0BIbNhSuXPUOxLG0bF1URsP/uLfxQFQ9ORfunCQwL7UuSX1RSRBwUQ==} + '@shikijs/engine-javascript@3.8.1': + resolution: {integrity: sha512-rZRp3BM1llrHkuBPAdYAzjlF7OqlM0rm/7EWASeCcY7cRYZIrOnGIHE9qsLz5TCjGefxBFnwgIECzBs2vmOyKA==} - '@shikijs/engine-oniguruma@3.8.0': - resolution: {integrity: sha512-Tx7kR0oFzqa+rY7t80LjN8ZVtHO3a4+33EUnBVx2qYP3fGxoI9H0bvnln5ySelz9SIUTsS0/Qn+9dg5zcUMsUw==} + '@shikijs/engine-oniguruma@3.8.1': + resolution: {integrity: sha512-KGQJZHlNY7c656qPFEQpIoqOuC4LrxjyNndRdzk5WKB/Ie87+NJCF1xo9KkOUxwxylk7rT6nhlZyTGTC4fCe1g==} - '@shikijs/langs@3.8.0': - resolution: {integrity: sha512-mfGYuUgjQ5GgXinB5spjGlBVhG2crKRpKkfADlp8r9k/XvZhtNXxyOToSnCEnF0QNiZnJjlt5MmU9PmhRdwAbg==} + '@shikijs/langs@3.8.1': + resolution: {integrity: sha512-TjOFg2Wp1w07oKnXjs0AUMb4kJvujML+fJ1C5cmEj45lhjbUXtziT1x2bPQb9Db6kmPhkG5NI2tgYW1/DzhUuQ==} - '@shikijs/themes@3.8.0': - resolution: {integrity: sha512-yaZiLuyO23sXe16JFU76KyUMTZCJi4EMQKIrdQt7okoTzI4yAaJhVXT2Uy4k8yBIEFRiia5dtD7gC1t8m6y3oQ==} + '@shikijs/themes@3.8.1': + resolution: {integrity: sha512-Vu3t3BBLifc0GB0UPg2Pox1naTemrrvyZv2lkiSw3QayVV60me1ujFQwPZGgUTmwXl1yhCPW8Lieesm0CYruLQ==} - '@shikijs/types@3.8.0': - resolution: {integrity: sha512-I/b/aNg0rP+kznVDo7s3UK8jMcqEGTtoPDdQ+JlQ2bcJIyu/e2iRvl42GLIDMK03/W1YOHOuhlhQ7aM+XbKUeg==} + '@shikijs/types@3.8.1': + resolution: {integrity: sha512-5C39Q8/8r1I26suLh+5TPk1DTrbY/kn3IdWA5HdizR0FhlhD05zx5nKCqhzSfDHH3p4S0ZefxWd77DLV+8FhGg==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -585,8 +585,8 @@ packages: peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/kit@2.25.0': - resolution: {integrity: sha512-Yc/WUMqYjYIZp2JsFUajw+cx7hIIqL1Z4uuhVl/yess65bGITbmG1aRIVOrlHg4oxmZqMluUJaVTLMLZZ9sNlg==} + '@sveltejs/kit@2.26.1': + resolution: {integrity: sha512-FwDhHAoXYUGnYndrrEzEYcKdYWpSoRKq4kli29oMe83hLri4/DOGQk3xUgwjDo0LKpSmj5M/Sj29/Ug3wO0Cbg==} engines: {node: '>=18.13'} hasBin: true peerDependencies: @@ -728,8 +728,8 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/node@24.0.14': - resolution: {integrity: sha512-4zXMWD91vBLGRtHK3YbIoFMia+1nqEz72coM42C5ETjnNCa/heoj7NT1G67iAfOqMmcfhuCZ4uNpyz8EjlAejw==} + '@types/node@24.1.0': + resolution: {integrity: sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -753,63 +753,63 @@ packages: '@types/json-schema': optional: true - '@typescript-eslint/eslint-plugin@8.37.0': - resolution: {integrity: sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==} + '@typescript-eslint/eslint-plugin@8.38.0': + resolution: {integrity: sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.37.0 + '@typescript-eslint/parser': ^8.38.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.37.0': - resolution: {integrity: sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==} + '@typescript-eslint/parser@8.38.0': + resolution: {integrity: sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/project-service@8.37.0': - resolution: {integrity: sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==} + '@typescript-eslint/project-service@8.38.0': + resolution: {integrity: sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.37.0': - resolution: {integrity: sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==} + '@typescript-eslint/scope-manager@8.38.0': + resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.37.0': - resolution: {integrity: sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==} + '@typescript-eslint/tsconfig-utils@8.38.0': + resolution: {integrity: sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/type-utils@8.37.0': - resolution: {integrity: sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==} + '@typescript-eslint/type-utils@8.38.0': + resolution: {integrity: sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.37.0': - resolution: {integrity: sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==} + '@typescript-eslint/types@8.38.0': + resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.37.0': - resolution: {integrity: sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==} + '@typescript-eslint/typescript-estree@8.38.0': + resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.37.0': - resolution: {integrity: sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==} + '@typescript-eslint/utils@8.38.0': + resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.37.0': - resolution: {integrity: sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==} + '@typescript-eslint/visitor-keys@8.38.0': + resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -857,8 +857,8 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bits-ui@2.8.11: - resolution: {integrity: sha512-lKN9rAk69my6j7H1D4B87r8LrHuEtfEsf1xCixBj9yViql2BdI3f04HyyyT7T1GOCpgb9+8b0B+nm3LN81Konw==} + bits-ui@2.8.13: + resolution: {integrity: sha512-YC3DiatZzREdbTZR8IuxbQeYg+/MNcyQeuS6Hycl+ufoG7eiV66qICx210plFER9B776FEYSHXSYuQdlvWODpw==} engines: {node: '>=20'} peerDependencies: '@internationalized/date': ^3.8.1 @@ -975,8 +975,8 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - effect@3.16.16: - resolution: {integrity: sha512-q8jsuAJykQJJ9jDkR9VaAR1JeHnEDn49g6+LkveIcfW3nIPUJw6BrC9ZPaVCJWmU23vKoVj9XqJmC/EW8kiI8g==} + effect@3.17.2: + resolution: {integrity: sha512-xYHNOw90nfD9blT+VHgbK2uogu1gWQjfd1f1HIiRjnxIH9/cAmm3qj/muZZXL4VDSwTUZXZNhahUCxCBc4ZaHg==} enhanced-resolve@5.18.2: resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} @@ -988,8 +988,8 @@ packages: peerDependencies: esbuild: '*' - esbuild@0.25.6: - resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} + esbuild@0.25.8: + resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} engines: {node: '>=18'} hasBin: true @@ -997,8 +997,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-prettier@10.1.5: - resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -1025,8 +1025,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.31.0: - resolution: {integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==} + eslint@9.32.0: + resolution: {integrity: sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1196,8 +1196,8 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true joi@17.13.3: @@ -1584,8 +1584,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.45.1: - resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} + rollup@4.45.3: + resolution: {integrity: sha512-STwyHZF3G+CrmZhB+qDiROq9s8B5PrOCYN6dtmOvwz585XBnyeHk1GTEhHJtUVb355/9uZhOazyVclTt5uahzA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1632,8 +1632,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@3.8.0: - resolution: {integrity: sha512-yPqK0y68t20aakv+3aMTpUMJZd6UHaBY2/SBUDowh9M70gVUwqT0bf7Kz5CWG0AXfHtFvXCHhBBHVAzdp0ILoQ==} + shiki@3.8.1: + resolution: {integrity: sha512-+MYIyjwGPCaegbpBeFN9+oOifI8CKiKG3awI/6h3JeT85c//H2wDW/xCJEGuQ5jPqtbboKNqNy+JyX9PYpGwNg==} sirv@3.0.1: resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} @@ -1714,8 +1714,8 @@ packages: peerDependencies: svelte: ^5.30.2 - svelte@5.36.7: - resolution: {integrity: sha512-QsaFAxL1PZvo9hwaN+x7Sq2U8oJARmsEuM8TEZVy98nx5D5IKzRi8FKkPvmOx9NXScSYnItDGLErBBn/ieIn2A==} + svelte@5.36.17: + resolution: {integrity: sha512-yxJVoHo3Km6+BlQLO3MXrhpZ8eeBuy/UOvEKLkmyQ8QmMFIkL0Hxs+DdmHBgAJazkc9o91TkTPgP6CvGenU1Ig==} engines: {node: '>=18'} sveltekit-superforms@2.27.1: @@ -1790,8 +1790,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tw-animate-css@1.3.5: - resolution: {integrity: sha512-t3u+0YNoloIhj1mMXs779P6MO9q3p3mvGn4k1n3nJPqJw/glZcuijG2qTSN4z4mgNRfW5ZC3aXJFLwDtiipZXA==} + tw-animate-css@1.3.6: + resolution: {integrity: sha512-9dy0R9UsYEGmgf26L8UcHiLmSFTHa9+D7+dAt/G/sF5dCnPePZbfgDYinc7/UzAM7g/baVrmS6m9yEpU46d+LA==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -1801,8 +1801,8 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - typescript-eslint@8.37.0: - resolution: {integrity: sha512-TnbEjzkE9EmcO0Q2zM+GE8NQLItNAJpMmED1BdgoBMYNdqMhzlbqfdSwiRlAzEK2pA9UzVW0gzaaIzXWg2BjfA==} + typescript-eslint@8.38.0: + resolution: {integrity: sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1857,14 +1857,14 @@ packages: resolution: {integrity: sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==} engines: {node: '>= 0.10'} - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@7.0.5: - resolution: {integrity: sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==} + vite@7.0.6: + resolution: {integrity: sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1951,8 +1951,8 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.0.5: - resolution: {integrity: sha512-/5UuuRPStvHXu7RS+gmvRf4NXrNxpSllGwDnCBcJZtQsKrviYXm54yDGV2KYNLT5kq0lHGcl7lqWJLgSaG+tgA==} + zod@4.0.10: + resolution: {integrity: sha512-3vB+UU3/VmLL2lvwcY/4RV2i9z/YU0DTV/tDuYjrwmx5WeJ7hwy+rGEEx8glHp6Yxw7ibRbKSaIFBgReRPe5KA==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -1972,101 +1972,101 @@ snapshots: '@ark/util@0.46.0': optional: true - '@babel/runtime@7.27.6': + '@babel/runtime@7.28.2': optional: true - '@bufbuild/protobuf@2.6.1': {} + '@bufbuild/protobuf@2.6.2': {} - '@connectrpc/connect-web@2.0.2(@bufbuild/protobuf@2.6.1)(@connectrpc/connect@2.0.2(@bufbuild/protobuf@2.6.1))': + '@connectrpc/connect-web@2.0.3(@bufbuild/protobuf@2.6.2)(@connectrpc/connect@2.0.3(@bufbuild/protobuf@2.6.2))': dependencies: - '@bufbuild/protobuf': 2.6.1 - '@connectrpc/connect': 2.0.2(@bufbuild/protobuf@2.6.1) + '@bufbuild/protobuf': 2.6.2 + '@connectrpc/connect': 2.0.3(@bufbuild/protobuf@2.6.2) - '@connectrpc/connect@2.0.2(@bufbuild/protobuf@2.6.1)': + '@connectrpc/connect@2.0.3(@bufbuild/protobuf@2.6.2)': dependencies: - '@bufbuild/protobuf': 2.6.1 + '@bufbuild/protobuf': 2.6.2 - '@esbuild/aix-ppc64@0.25.6': + '@esbuild/aix-ppc64@0.25.8': optional: true - '@esbuild/android-arm64@0.25.6': + '@esbuild/android-arm64@0.25.8': optional: true - '@esbuild/android-arm@0.25.6': + '@esbuild/android-arm@0.25.8': optional: true - '@esbuild/android-x64@0.25.6': + '@esbuild/android-x64@0.25.8': optional: true - '@esbuild/darwin-arm64@0.25.6': + '@esbuild/darwin-arm64@0.25.8': optional: true - '@esbuild/darwin-x64@0.25.6': + '@esbuild/darwin-x64@0.25.8': optional: true - '@esbuild/freebsd-arm64@0.25.6': + '@esbuild/freebsd-arm64@0.25.8': optional: true - '@esbuild/freebsd-x64@0.25.6': + '@esbuild/freebsd-x64@0.25.8': optional: true - '@esbuild/linux-arm64@0.25.6': + '@esbuild/linux-arm64@0.25.8': optional: true - '@esbuild/linux-arm@0.25.6': + '@esbuild/linux-arm@0.25.8': optional: true - '@esbuild/linux-ia32@0.25.6': + '@esbuild/linux-ia32@0.25.8': optional: true - '@esbuild/linux-loong64@0.25.6': + '@esbuild/linux-loong64@0.25.8': optional: true - '@esbuild/linux-mips64el@0.25.6': + '@esbuild/linux-mips64el@0.25.8': optional: true - '@esbuild/linux-ppc64@0.25.6': + '@esbuild/linux-ppc64@0.25.8': optional: true - '@esbuild/linux-riscv64@0.25.6': + '@esbuild/linux-riscv64@0.25.8': optional: true - '@esbuild/linux-s390x@0.25.6': + '@esbuild/linux-s390x@0.25.8': optional: true - '@esbuild/linux-x64@0.25.6': + '@esbuild/linux-x64@0.25.8': optional: true - '@esbuild/netbsd-arm64@0.25.6': + '@esbuild/netbsd-arm64@0.25.8': optional: true - '@esbuild/netbsd-x64@0.25.6': + '@esbuild/netbsd-x64@0.25.8': optional: true - '@esbuild/openbsd-arm64@0.25.6': + '@esbuild/openbsd-arm64@0.25.8': optional: true - '@esbuild/openbsd-x64@0.25.6': + '@esbuild/openbsd-x64@0.25.8': optional: true - '@esbuild/openharmony-arm64@0.25.6': + '@esbuild/openharmony-arm64@0.25.8': optional: true - '@esbuild/sunos-x64@0.25.6': + '@esbuild/sunos-x64@0.25.8': optional: true - '@esbuild/win32-arm64@0.25.6': + '@esbuild/win32-arm64@0.25.8': optional: true - '@esbuild/win32-ia32@0.25.6': + '@esbuild/win32-ia32@0.25.8': optional: true - '@esbuild/win32-x64@0.25.6': + '@esbuild/win32-x64@0.25.8': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.31.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.32.0(jiti@2.5.1))': dependencies: - eslint: 9.31.0(jiti@2.4.2) + eslint: 9.32.0(jiti@2.5.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -2099,11 +2099,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.31.0': {} + '@eslint/js@9.32.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.3': + '@eslint/plugin-kit@0.3.4': dependencies: '@eslint/core': 0.15.1 levn: 0.4.1 @@ -2122,12 +2122,12 @@ snapshots: '@floating-ui/utils@0.2.10': {} - '@gcornut/valibot-json-schema@0.42.0(esbuild@0.25.6)(typescript@5.8.3)': + '@gcornut/valibot-json-schema@0.42.0(esbuild@0.25.8)(typescript@5.8.3)': dependencies: valibot: 0.42.1(typescript@5.8.3) optionalDependencies: '@types/json-schema': 7.0.15 - esbuild-runner: 2.2.2(esbuild@0.25.6) + esbuild-runner: 2.2.2(esbuild@0.25.8) transitivePeerDependencies: - esbuild - typescript @@ -2176,9 +2176,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.4 - '@lucide/svelte@0.525.0(svelte@5.36.7)': + '@lucide/svelte@0.526.0(svelte@5.36.17)': dependencies: - svelte: 5.36.7 + svelte: 5.36.17 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -2197,93 +2197,93 @@ snapshots: '@poppinss/macroable@1.0.5': optional: true - '@rollup/rollup-android-arm-eabi@4.45.1': + '@rollup/rollup-android-arm-eabi@4.45.3': optional: true - '@rollup/rollup-android-arm64@4.45.1': + '@rollup/rollup-android-arm64@4.45.3': optional: true - '@rollup/rollup-darwin-arm64@4.45.1': + '@rollup/rollup-darwin-arm64@4.45.3': optional: true - '@rollup/rollup-darwin-x64@4.45.1': + '@rollup/rollup-darwin-x64@4.45.3': optional: true - '@rollup/rollup-freebsd-arm64@4.45.1': + '@rollup/rollup-freebsd-arm64@4.45.3': optional: true - '@rollup/rollup-freebsd-x64@4.45.1': + '@rollup/rollup-freebsd-x64@4.45.3': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + '@rollup/rollup-linux-arm-gnueabihf@4.45.3': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.45.1': + '@rollup/rollup-linux-arm-musleabihf@4.45.3': optional: true - '@rollup/rollup-linux-arm64-gnu@4.45.1': + '@rollup/rollup-linux-arm64-gnu@4.45.3': optional: true - '@rollup/rollup-linux-arm64-musl@4.45.1': + '@rollup/rollup-linux-arm64-musl@4.45.3': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + '@rollup/rollup-linux-loongarch64-gnu@4.45.3': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + '@rollup/rollup-linux-ppc64-gnu@4.45.3': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.45.1': + '@rollup/rollup-linux-riscv64-gnu@4.45.3': optional: true - '@rollup/rollup-linux-riscv64-musl@4.45.1': + '@rollup/rollup-linux-riscv64-musl@4.45.3': optional: true - '@rollup/rollup-linux-s390x-gnu@4.45.1': + '@rollup/rollup-linux-s390x-gnu@4.45.3': optional: true - '@rollup/rollup-linux-x64-gnu@4.45.1': + '@rollup/rollup-linux-x64-gnu@4.45.3': optional: true - '@rollup/rollup-linux-x64-musl@4.45.1': + '@rollup/rollup-linux-x64-musl@4.45.3': optional: true - '@rollup/rollup-win32-arm64-msvc@4.45.1': + '@rollup/rollup-win32-arm64-msvc@4.45.3': optional: true - '@rollup/rollup-win32-ia32-msvc@4.45.1': + '@rollup/rollup-win32-ia32-msvc@4.45.3': optional: true - '@rollup/rollup-win32-x64-msvc@4.45.1': + '@rollup/rollup-win32-x64-msvc@4.45.3': optional: true - '@shikijs/core@3.8.0': + '@shikijs/core@3.8.1': dependencies: - '@shikijs/types': 3.8.0 + '@shikijs/types': 3.8.1 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@3.8.0': + '@shikijs/engine-javascript@3.8.1': dependencies: - '@shikijs/types': 3.8.0 + '@shikijs/types': 3.8.1 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.3.3 - '@shikijs/engine-oniguruma@3.8.0': + '@shikijs/engine-oniguruma@3.8.1': dependencies: - '@shikijs/types': 3.8.0 + '@shikijs/types': 3.8.1 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.8.0': + '@shikijs/langs@3.8.1': dependencies: - '@shikijs/types': 3.8.0 + '@shikijs/types': 3.8.1 - '@shikijs/themes@3.8.0': + '@shikijs/themes@3.8.1': dependencies: - '@shikijs/types': 3.8.0 + '@shikijs/types': 3.8.1 - '@shikijs/types@3.8.0': + '@shikijs/types@3.8.1': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -2311,14 +2311,14 @@ snapshots: dependencies: acorn: 8.15.0 - '@sveltejs/adapter-static@3.0.8(@sveltejs/kit@2.25.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))': + '@sveltejs/adapter-static@3.0.8(@sveltejs/kit@2.26.1(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))': dependencies: - '@sveltejs/kit': 2.25.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + '@sveltejs/kit': 2.26.1(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)) - '@sveltejs/kit@2.25.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))': + '@sveltejs/kit@2.26.1(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))': dependencies: '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) - '@sveltejs/vite-plugin-svelte': 6.1.0(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + '@sveltejs/vite-plugin-svelte': 6.1.0(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)) '@types/cookie': 0.6.0 acorn: 8.15.0 cookie: 0.6.0 @@ -2330,28 +2330,28 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.7.1 sirv: 3.0.1 - svelte: 5.36.7 - vite: 7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + svelte: 5.36.17 + vite: 7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0) - '@sveltejs/vite-plugin-svelte-inspector@5.0.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.1.0(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + '@sveltejs/vite-plugin-svelte': 6.1.0(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)) debug: 4.4.1 - svelte: 5.36.7 - vite: 7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + svelte: 5.36.17 + vite: 7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))': + '@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)) debug: 4.4.1 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 - svelte: 5.36.7 - vite: 7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) - vitefu: 1.1.1(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + svelte: 5.36.17 + vite: 7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0) + vitefu: 1.1.1(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)) transitivePeerDependencies: - supports-color @@ -2363,7 +2363,7 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 enhanced-resolve: 5.18.2 - jiti: 2.4.2 + jiti: 2.5.1 lightningcss: 1.30.1 magic-string: 0.30.17 source-map-js: 1.2.1 @@ -2423,12 +2423,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 - '@tailwindcss/vite@4.1.11(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))': + '@tailwindcss/vite@4.1.11(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))': dependencies: '@tailwindcss/node': 4.1.11 '@tailwindcss/oxide': 4.1.11 tailwindcss: 4.1.11 - vite: 7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0) '@tanstack/match-sorter-utils@8.19.4': dependencies: @@ -2455,7 +2455,7 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/node@24.0.14': + '@types/node@24.1.0': dependencies: undici-types: 7.8.0 @@ -2478,15 +2478,15 @@ snapshots: '@types/json-schema': 7.0.15 optional: true - '@typescript-eslint/eslint-plugin@8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.37.0 - '@typescript-eslint/type-utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.37.0 - eslint: 9.31.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.38.0 + '@typescript-eslint/type-utils': 8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.38.0 + eslint: 9.32.0(jiti@2.5.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -2495,56 +2495,56 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.37.0 - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.37.0 + '@typescript-eslint/scope-manager': 8.38.0 + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.38.0 debug: 4.4.1 - eslint: 9.31.0(jiti@2.4.2) + eslint: 9.32.0(jiti@2.5.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.37.0(typescript@5.8.3)': + '@typescript-eslint/project-service@8.38.0(typescript@5.8.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.8.3) - '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) + '@typescript-eslint/types': 8.38.0 debug: 4.4.1 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.37.0': + '@typescript-eslint/scope-manager@8.38.0': dependencies: - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/visitor-keys': 8.37.0 + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/visitor-keys': 8.38.0 - '@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.8.3)': dependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3) debug: 4.4.1 - eslint: 9.31.0(jiti@2.4.2) + eslint: 9.32.0(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.37.0': {} + '@typescript-eslint/types@8.38.0': {} - '@typescript-eslint/typescript-estree@8.37.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.38.0(typescript@5.8.3)': dependencies: - '@typescript-eslint/project-service': 8.37.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.8.3) - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/visitor-keys': 8.37.0 + '@typescript-eslint/project-service': 8.38.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/visitor-keys': 8.38.0 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -2555,20 +2555,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.37.0 - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) - eslint: 9.31.0(jiti@2.4.2) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.5.1)) + '@typescript-eslint/scope-manager': 8.38.0 + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + eslint: 9.32.0(jiti@2.5.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.37.0': + '@typescript-eslint/visitor-keys@8.38.0': dependencies: - '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/types': 8.38.0 eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.3.0': {} @@ -2619,15 +2619,15 @@ snapshots: balanced-match@1.0.2: {} - bits-ui@2.8.11(@internationalized/date@3.8.2)(svelte@5.36.7): + bits-ui@2.8.13(@internationalized/date@3.8.2)(svelte@5.36.17): dependencies: '@floating-ui/core': 1.7.2 '@floating-ui/dom': 1.7.2 '@internationalized/date': 3.8.2 esm-env: 1.2.2 - runed: 0.29.2(svelte@5.36.7) - svelte: 5.36.7 - svelte-toolbelt: 0.9.3(svelte@5.36.7) + runed: 0.29.2(svelte@5.36.17) + svelte: 5.36.17 + svelte-toolbelt: 0.9.3(svelte@5.36.17) tabbable: 6.2.0 brace-expansion@1.1.12: @@ -2721,7 +2721,7 @@ snapshots: dlv@1.1.3: optional: true - effect@3.16.16: + effect@3.17.2: dependencies: '@standard-schema/spec': 1.0.0 fast-check: 3.23.2 @@ -2732,53 +2732,53 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.2 - esbuild-runner@2.2.2(esbuild@0.25.6): + esbuild-runner@2.2.2(esbuild@0.25.8): dependencies: - esbuild: 0.25.6 + esbuild: 0.25.8 source-map-support: 0.5.21 tslib: 2.4.0 optional: true - esbuild@0.25.6: + esbuild@0.25.8: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.6 - '@esbuild/android-arm': 0.25.6 - '@esbuild/android-arm64': 0.25.6 - '@esbuild/android-x64': 0.25.6 - '@esbuild/darwin-arm64': 0.25.6 - '@esbuild/darwin-x64': 0.25.6 - '@esbuild/freebsd-arm64': 0.25.6 - '@esbuild/freebsd-x64': 0.25.6 - '@esbuild/linux-arm': 0.25.6 - '@esbuild/linux-arm64': 0.25.6 - '@esbuild/linux-ia32': 0.25.6 - '@esbuild/linux-loong64': 0.25.6 - '@esbuild/linux-mips64el': 0.25.6 - '@esbuild/linux-ppc64': 0.25.6 - '@esbuild/linux-riscv64': 0.25.6 - '@esbuild/linux-s390x': 0.25.6 - '@esbuild/linux-x64': 0.25.6 - '@esbuild/netbsd-arm64': 0.25.6 - '@esbuild/netbsd-x64': 0.25.6 - '@esbuild/openbsd-arm64': 0.25.6 - '@esbuild/openbsd-x64': 0.25.6 - '@esbuild/openharmony-arm64': 0.25.6 - '@esbuild/sunos-x64': 0.25.6 - '@esbuild/win32-arm64': 0.25.6 - '@esbuild/win32-ia32': 0.25.6 - '@esbuild/win32-x64': 0.25.6 + '@esbuild/aix-ppc64': 0.25.8 + '@esbuild/android-arm': 0.25.8 + '@esbuild/android-arm64': 0.25.8 + '@esbuild/android-x64': 0.25.8 + '@esbuild/darwin-arm64': 0.25.8 + '@esbuild/darwin-x64': 0.25.8 + '@esbuild/freebsd-arm64': 0.25.8 + '@esbuild/freebsd-x64': 0.25.8 + '@esbuild/linux-arm': 0.25.8 + '@esbuild/linux-arm64': 0.25.8 + '@esbuild/linux-ia32': 0.25.8 + '@esbuild/linux-loong64': 0.25.8 + '@esbuild/linux-mips64el': 0.25.8 + '@esbuild/linux-ppc64': 0.25.8 + '@esbuild/linux-riscv64': 0.25.8 + '@esbuild/linux-s390x': 0.25.8 + '@esbuild/linux-x64': 0.25.8 + '@esbuild/netbsd-arm64': 0.25.8 + '@esbuild/netbsd-x64': 0.25.8 + '@esbuild/openbsd-arm64': 0.25.8 + '@esbuild/openbsd-x64': 0.25.8 + '@esbuild/openharmony-arm64': 0.25.8 + '@esbuild/sunos-x64': 0.25.8 + '@esbuild/win32-arm64': 0.25.8 + '@esbuild/win32-ia32': 0.25.8 + '@esbuild/win32-x64': 0.25.8 escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.5(eslint@9.31.0(jiti@2.4.2)): + eslint-config-prettier@10.1.8(eslint@9.32.0(jiti@2.5.1)): dependencies: - eslint: 9.31.0(jiti@2.4.2) + eslint: 9.32.0(jiti@2.5.1) - eslint-plugin-svelte@3.11.0(eslint@9.31.0(jiti@2.4.2))(svelte@5.36.7): + eslint-plugin-svelte@3.11.0(eslint@9.32.0(jiti@2.5.1))(svelte@5.36.17): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.5.1)) '@jridgewell/sourcemap-codec': 1.5.4 - eslint: 9.31.0(jiti@2.4.2) + eslint: 9.32.0(jiti@2.5.1) esutils: 2.0.3 globals: 16.3.0 known-css-properties: 0.37.0 @@ -2786,9 +2786,9 @@ snapshots: postcss-load-config: 3.1.4(postcss@8.5.6) postcss-safe-parser: 7.0.1(postcss@8.5.6) semver: 7.7.2 - svelte-eslint-parser: 1.3.0(svelte@5.36.7) + svelte-eslint-parser: 1.3.0(svelte@5.36.17) optionalDependencies: - svelte: 5.36.7 + svelte: 5.36.17 transitivePeerDependencies: - ts-node @@ -2801,16 +2801,16 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.31.0(jiti@2.4.2): + eslint@9.32.0(jiti@2.5.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.0 '@eslint/core': 0.15.1 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.31.0 - '@eslint/plugin-kit': 0.3.3 + '@eslint/js': 9.32.0 + '@eslint/plugin-kit': 0.3.4 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -2839,7 +2839,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.4.2 + jiti: 2.5.1 transitivePeerDependencies: - supports-color @@ -2914,11 +2914,11 @@ snapshots: flatted@3.3.3: {} - formsnap@2.0.1(svelte@5.36.7)(sveltekit-superforms@2.27.1(@sveltejs/kit@2.25.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(@types/json-schema@7.0.15)(esbuild@0.25.6)(svelte@5.36.7)(typescript@5.8.3)): + formsnap@2.0.1(svelte@5.36.17)(sveltekit-superforms@2.27.1(@sveltejs/kit@2.26.1(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(@types/json-schema@7.0.15)(esbuild@0.25.8)(svelte@5.36.17)(typescript@5.8.3)): dependencies: - svelte: 5.36.7 - svelte-toolbelt: 0.5.0(svelte@5.36.7) - sveltekit-superforms: 2.27.1(@sveltejs/kit@2.25.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(@types/json-schema@7.0.15)(esbuild@0.25.6)(svelte@5.36.7)(typescript@5.8.3) + svelte: 5.36.17 + svelte-toolbelt: 0.5.0(svelte@5.36.17) + sveltekit-superforms: 2.27.1(@sveltejs/kit@2.26.1(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(@types/json-schema@7.0.15)(esbuild@0.25.8)(svelte@5.36.17)(typescript@5.8.3) fsevents@2.3.3: optional: true @@ -2990,7 +2990,7 @@ snapshots: isexe@2.0.0: {} - jiti@2.4.2: {} + jiti@2.5.1: {} joi@17.13.3: dependencies: @@ -3009,7 +3009,7 @@ snapshots: json-schema-to-ts@3.1.1: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 ts-algebra: 2.0.0 optional: true @@ -3146,11 +3146,11 @@ snapshots: mkdirp@3.0.1: {} - mode-watcher@1.1.0(svelte@5.36.7): + mode-watcher@1.1.0(svelte@5.36.17): dependencies: - runed: 0.25.0(svelte@5.36.7) - svelte: 5.36.7 - svelte-toolbelt: 0.7.1(svelte@5.36.7) + runed: 0.25.0(svelte@5.36.17) + svelte: 5.36.17 + svelte-toolbelt: 0.7.1(svelte@5.36.17) mri@1.2.0: {} @@ -3232,16 +3232,16 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.36.7): + prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.36.17): dependencies: prettier: 3.6.2 - svelte: 5.36.7 + svelte: 5.36.17 - prettier-plugin-tailwindcss@0.6.14(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.36.7))(prettier@3.6.2): + prettier-plugin-tailwindcss@0.6.14(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.36.17))(prettier@3.6.2): dependencies: prettier: 3.6.2 optionalDependencies: - prettier-plugin-svelte: 3.4.0(prettier@3.6.2)(svelte@5.36.7) + prettier-plugin-svelte: 3.4.0(prettier@3.6.2)(svelte@5.36.17) prettier@3.6.2: {} @@ -3275,55 +3275,55 @@ snapshots: reusify@1.1.0: {} - rollup@4.45.1: + rollup@4.45.3: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.45.1 - '@rollup/rollup-android-arm64': 4.45.1 - '@rollup/rollup-darwin-arm64': 4.45.1 - '@rollup/rollup-darwin-x64': 4.45.1 - '@rollup/rollup-freebsd-arm64': 4.45.1 - '@rollup/rollup-freebsd-x64': 4.45.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 - '@rollup/rollup-linux-arm-musleabihf': 4.45.1 - '@rollup/rollup-linux-arm64-gnu': 4.45.1 - '@rollup/rollup-linux-arm64-musl': 4.45.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-musl': 4.45.1 - '@rollup/rollup-linux-s390x-gnu': 4.45.1 - '@rollup/rollup-linux-x64-gnu': 4.45.1 - '@rollup/rollup-linux-x64-musl': 4.45.1 - '@rollup/rollup-win32-arm64-msvc': 4.45.1 - '@rollup/rollup-win32-ia32-msvc': 4.45.1 - '@rollup/rollup-win32-x64-msvc': 4.45.1 + '@rollup/rollup-android-arm-eabi': 4.45.3 + '@rollup/rollup-android-arm64': 4.45.3 + '@rollup/rollup-darwin-arm64': 4.45.3 + '@rollup/rollup-darwin-x64': 4.45.3 + '@rollup/rollup-freebsd-arm64': 4.45.3 + '@rollup/rollup-freebsd-x64': 4.45.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.45.3 + '@rollup/rollup-linux-arm-musleabihf': 4.45.3 + '@rollup/rollup-linux-arm64-gnu': 4.45.3 + '@rollup/rollup-linux-arm64-musl': 4.45.3 + '@rollup/rollup-linux-loongarch64-gnu': 4.45.3 + '@rollup/rollup-linux-ppc64-gnu': 4.45.3 + '@rollup/rollup-linux-riscv64-gnu': 4.45.3 + '@rollup/rollup-linux-riscv64-musl': 4.45.3 + '@rollup/rollup-linux-s390x-gnu': 4.45.3 + '@rollup/rollup-linux-x64-gnu': 4.45.3 + '@rollup/rollup-linux-x64-musl': 4.45.3 + '@rollup/rollup-win32-arm64-msvc': 4.45.3 + '@rollup/rollup-win32-ia32-msvc': 4.45.3 + '@rollup/rollup-win32-x64-msvc': 4.45.3 fsevents: 2.3.3 run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - runed@0.23.4(svelte@5.36.7): + runed@0.23.4(svelte@5.36.17): dependencies: esm-env: 1.2.2 - svelte: 5.36.7 + svelte: 5.36.17 - runed@0.25.0(svelte@5.36.7): + runed@0.25.0(svelte@5.36.17): dependencies: esm-env: 1.2.2 - svelte: 5.36.7 + svelte: 5.36.17 - runed@0.28.0(svelte@5.36.7): + runed@0.28.0(svelte@5.36.17): dependencies: esm-env: 1.2.2 - svelte: 5.36.7 + svelte: 5.36.17 - runed@0.29.2(svelte@5.36.7): + runed@0.29.2(svelte@5.36.17): dependencies: esm-env: 1.2.2 - svelte: 5.36.7 + svelte: 5.36.17 sade@1.8.1: dependencies: @@ -3339,14 +3339,14 @@ snapshots: shebang-regex@3.0.0: {} - shiki@3.8.0: + shiki@3.8.1: dependencies: - '@shikijs/core': 3.8.0 - '@shikijs/engine-javascript': 3.8.0 - '@shikijs/engine-oniguruma': 3.8.0 - '@shikijs/langs': 3.8.0 - '@shikijs/themes': 3.8.0 - '@shikijs/types': 3.8.0 + '@shikijs/core': 3.8.1 + '@shikijs/engine-javascript': 3.8.1 + '@shikijs/engine-oniguruma': 3.8.1 + '@shikijs/langs': 3.8.1 + '@shikijs/themes': 3.8.1 + '@shikijs/types': 3.8.1 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -3387,19 +3387,19 @@ snapshots: dependencies: has-flag: 4.0.0 - svelte-check@4.3.0(picomatch@4.0.3)(svelte@5.36.7)(typescript@5.8.3): + svelte-check@4.3.0(picomatch@4.0.3)(svelte@5.36.17)(typescript@5.8.3): dependencies: '@jridgewell/trace-mapping': 0.3.29 chokidar: 4.0.3 fdir: 6.4.6(picomatch@4.0.3) picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.36.7 + svelte: 5.36.17 typescript: 5.8.3 transitivePeerDependencies: - picomatch - svelte-eslint-parser@1.3.0(svelte@5.36.7): + svelte-eslint-parser@1.3.0(svelte@5.36.17): dependencies: eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -3408,38 +3408,38 @@ snapshots: postcss-scss: 4.0.9(postcss@8.5.6) postcss-selector-parser: 7.1.0 optionalDependencies: - svelte: 5.36.7 + svelte: 5.36.17 svelte-highlight@7.8.3: dependencies: highlight.js: 11.11.1 - svelte-sonner@1.0.5(svelte@5.36.7): + svelte-sonner@1.0.5(svelte@5.36.17): dependencies: - runed: 0.28.0(svelte@5.36.7) - svelte: 5.36.7 + runed: 0.28.0(svelte@5.36.17) + svelte: 5.36.17 - svelte-toolbelt@0.5.0(svelte@5.36.7): + svelte-toolbelt@0.5.0(svelte@5.36.17): dependencies: clsx: 2.1.1 style-to-object: 1.0.9 - svelte: 5.36.7 + svelte: 5.36.17 - svelte-toolbelt@0.7.1(svelte@5.36.7): + svelte-toolbelt@0.7.1(svelte@5.36.17): dependencies: clsx: 2.1.1 - runed: 0.23.4(svelte@5.36.7) + runed: 0.23.4(svelte@5.36.17) style-to-object: 1.0.9 - svelte: 5.36.7 + svelte: 5.36.17 - svelte-toolbelt@0.9.3(svelte@5.36.7): + svelte-toolbelt@0.9.3(svelte@5.36.17): dependencies: clsx: 2.1.1 - runed: 0.29.2(svelte@5.36.7) + runed: 0.29.2(svelte@5.36.17) style-to-object: 1.0.9 - svelte: 5.36.7 + svelte: 5.36.17 - svelte@5.36.7: + svelte@5.36.17: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.4 @@ -3456,22 +3456,22 @@ snapshots: magic-string: 0.30.17 zimmerframe: 1.1.2 - sveltekit-superforms@2.27.1(@sveltejs/kit@2.25.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(@types/json-schema@7.0.15)(esbuild@0.25.6)(svelte@5.36.7)(typescript@5.8.3): + sveltekit-superforms@2.27.1(@sveltejs/kit@2.26.1(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(@types/json-schema@7.0.15)(esbuild@0.25.8)(svelte@5.36.17)(typescript@5.8.3): dependencies: - '@sveltejs/kit': 2.25.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.7)(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + '@sveltejs/kit': 2.26.1(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.36.17)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)) devalue: 5.1.1 memoize-weak: 1.0.2 - svelte: 5.36.7 + svelte: 5.36.17 ts-deepmerge: 7.0.3 optionalDependencies: '@exodus/schemasafe': 1.3.0 - '@gcornut/valibot-json-schema': 0.42.0(esbuild@0.25.6)(typescript@5.8.3) + '@gcornut/valibot-json-schema': 0.42.0(esbuild@0.25.8)(typescript@5.8.3) '@sinclair/typebox': 0.34.38 '@typeschema/class-validator': 0.3.0(@types/json-schema@7.0.15)(class-validator@0.14.2) '@vinejs/vine': 3.0.1 arktype: 2.1.20 class-validator: 0.14.2 - effect: 3.16.16 + effect: 3.17.2 joi: 17.13.3 json-schema-to-ts: 3.1.1 superstruct: 2.0.2 @@ -3541,7 +3541,7 @@ snapshots: tslib@2.8.1: {} - tw-animate-css@1.3.5: {} + tw-animate-css@1.3.6: {} type-check@0.4.0: dependencies: @@ -3550,13 +3550,13 @@ snapshots: type-fest@2.19.0: optional: true - typescript-eslint@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3): + typescript-eslint@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.31.0(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3) + eslint: 9.32.0(jiti@2.5.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -3607,7 +3607,7 @@ snapshots: validator@13.15.15: optional: true - vfile-message@4.0.2: + vfile-message@4.0.3: dependencies: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 @@ -3615,26 +3615,26 @@ snapshots: vfile@6.0.3: dependencies: '@types/unist': 3.0.3 - vfile-message: 4.0.2 + vfile-message: 4.0.3 - vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0): + vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0): dependencies: - esbuild: 0.25.6 + esbuild: 0.25.8 fdir: 6.4.6(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.45.1 + rollup: 4.45.3 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 24.0.14 + '@types/node': 24.1.0 fsevents: 2.3.3 - jiti: 2.4.2 + jiti: 2.5.1 lightningcss: 1.30.1 yaml: 2.8.0 - vitefu@1.1.1(vite@7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)): + vitefu@1.1.1(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0)): optionalDependencies: - vite: 7.0.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0) which@2.0.2: dependencies: @@ -3668,6 +3668,6 @@ snapshots: zod@3.25.76: optional: true - zod@4.0.5: {} + zod@4.0.10: {} zwitch@2.0.4: {} diff --git a/web/src/lib/components/forms/DynamicForm.svelte b/web/src/lib/components/forms/DynamicForm.svelte index bc80a00..594b81d 100644 --- a/web/src/lib/components/forms/DynamicForm.svelte +++ b/web/src/lib/components/forms/DynamicForm.svelte @@ -1,295 +1,358 @@ -
- {#each Object.entries(fields) as [key, field] (key)} -
- -
- - {#if field.description && showDescription(field)} -

{field.description}

+{#if protocol && schema} +
+ {#if middlewareType === 'plugin'} +
+