Compare commits

...

343 Commits

Author SHA1 Message Date
argoyle af045687ae Merge branch 'next-release' into 'main'
chore(release): prepare for v0.7.0

See merge request unboundsoftware/schemas!598
2025-11-19 12:01:31 +01:00
Unbound Release c90ee3c9b1 chore(release): prepare for v0.7.0 2025-11-19 12:01:31 +01:00
argoyle 83e99e7d0a Merge branch 'feat/add-cosmo-router-config-pubsub' into 'main'
feat: add Cosmo Router config generation and PubSub support

See merge request unboundsoftware/schemas!621
2025-11-19 11:42:36 +01:00
argoyle 80daed081d feat: add Cosmo Router config generation and PubSub support
Creates a new `GenerateCosmoRouterConfig` function to build and 
serialize a Cosmo Router configuration from subgraphs. Implements 
PubSub mechanism for managing schema updates, allowing 
subscription to updates. Adds Subscription resolver and updates 
existing structures to accommodate new functionalities. This 
enhances the system's capabilities for dynamic updates and 
configuration management.
2025-11-19 11:29:30 +01:00
argoyle f6e4458efa Merge branch 'renovate/golang-1.25.4' into 'main'
chore(deps): update golang:1.25.4 docker digest to efe81fa

See merge request unboundsoftware/schemas!620
2025-11-18 21:29:05 +01:00
Renovate 11b9a46802 chore(deps): update golang:1.25.4 docker digest to efe81fa 2025-11-18 11:58:47 +00:00
argoyle d2324d27df Merge branch 'renovate/github.com-wundergraph-graphql-go-tools-v2-2.x' into 'main'
fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.238

See merge request unboundsoftware/schemas!619
2025-11-17 10:25:53 +01:00
Renovate c496ed025e fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.238 2025-11-17 08:58:02 +00:00
argoyle 4773ada816 Merge branch 'renovate/golangci-golangci-lint-2.x' into 'main'
chore(deps): update pre-commit hook golangci/golangci-lint to v2.6.2

See merge request unboundsoftware/schemas!618
2025-11-14 16:22:16 +01:00
Renovate 6447a299b3 chore(deps): update pre-commit hook golangci/golangci-lint to v2.6.2 2025-11-14 13:58:47 +00:00
argoyle b8e9e0d632 Merge branch 'renovate/github.com-alecthomas-kong-1.x' into 'main'
fix(deps): update module github.com/alecthomas/kong to v1.13.0

See merge request unboundsoftware/schemas!617
2025-11-14 12:57:15 +01:00
Renovate 3179bb7ae3 fix(deps): update module github.com/alecthomas/kong to v1.13.0 2025-11-13 22:59:09 +00:00
argoyle 73f6fe31d9 Merge branch 'renovate/github.com-99designs-gqlgen-0.x' into 'main'
fix(deps): update module github.com/99designs/gqlgen to v0.17.83

See merge request unboundsoftware/schemas!616
2025-11-11 10:50:15 +01:00
Renovate 87eab3a04e fix(deps): update module github.com/99designs/gqlgen to v0.17.83 2025-11-10 23:10:38 +00:00
argoyle e751d35e38 Merge branch 'renovate/github.com-wundergraph-graphql-go-tools-v2-2.x' into 'main'
fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.237

See merge request unboundsoftware/schemas!615
2025-11-10 17:54:01 +01:00
Renovate 84e30c0771 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.237 2025-11-10 13:58:40 +00:00
argoyle bdb3b80f4a Merge branch 'renovate/github.com-99designs-gqlgen-0.x' into 'main'
fix(deps): update module github.com/99designs/gqlgen to v0.17.82

See merge request unboundsoftware/schemas!614
2025-11-07 08:36:04 +01:00
Renovate d08c9663fe fix(deps): update module github.com/99designs/gqlgen to v0.17.82 2025-11-07 01:59:53 +00:00
argoyle a17b8dd122 Merge branch 'renovate/golang-1.x' into 'main'
chore(deps): update golang docker tag to v1.25.4

See merge request unboundsoftware/schemas!613
2025-11-06 07:03:06 +01:00
Renovate ae8cf15b0a chore(deps): update golang docker tag to v1.25.4 2025-11-05 22:11:22 +00:00
argoyle 8fd2c1790b Merge branch 'renovate/gitleaks-gitleaks-8.x' into 'main'
chore(deps): update pre-commit hook gitleaks/gitleaks to v8.29.0

See merge request unboundsoftware/schemas!612
2025-11-05 06:52:56 +01:00
Renovate fe4efa7b97 chore(deps): update pre-commit hook gitleaks/gitleaks to v8.29.0 2025-11-05 01:59:15 +00:00
argoyle 78599baa5b Merge branch 'renovate/golangci-golangci-lint-2.x' into 'main'
chore(deps): update pre-commit hook golangci/golangci-lint to v2.6.1

See merge request unboundsoftware/schemas!611
2025-11-04 13:43:40 +01:00
argoyle 8ad47c2e54 Merge branch 'renovate/golang-1.25.3' into 'main'
chore(deps): update golang:1.25.3 docker digest to 9ac0edc

See merge request unboundsoftware/schemas!610
2025-11-04 13:43:05 +01:00
Renovate ecce66b579 chore(deps): update pre-commit hook golangci/golangci-lint to v2.6.1 2025-11-04 11:59:20 +00:00
Renovate a26e66649a chore(deps): update golang:1.25.3 docker digest to 9ac0edc 2025-11-04 11:59:17 +00:00
argoyle b8b5951883 Merge branch 'renovate/github.com-wundergraph-graphql-go-tools-v2-2.x' into 'main'
fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.236

See merge request unboundsoftware/schemas!609
2025-10-31 02:14:34 +01:00
Renovate f860d80a81 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.236 2025-10-31 00:57:50 +00:00
argoyle d27331cef0 Merge branch 'renovate/golangci-golangci-lint-2.x' into 'main'
chore(deps): update pre-commit hook golangci/golangci-lint to v2.6.0

See merge request unboundsoftware/schemas!607
2025-10-30 11:43:43 +01:00
Renovate e343ff7538 chore(deps): update pre-commit hook golangci/golangci-lint to v2.6.0 2025-10-30 11:19:43 +01:00
argoyle 4fe45bf125 Merge branch 'renovate/github.com-vektah-gqlparser-v2-2.x' into 'main'
fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.31

See merge request unboundsoftware/schemas!608
2025-10-30 07:56:05 +01:00
Renovate 89e35c4ee7 fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.31 2025-10-30 01:59:20 +00:00
argoyle 0f077a53bb Merge branch 'renovate/github.com-wundergraph-graphql-go-tools-v2-2.x' into 'main'
fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.235

See merge request unboundsoftware/schemas!606
2025-10-29 15:03:09 +01:00
Renovate 51fd889f6a fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.235 2025-10-29 12:58:02 +00:00
argoyle e13c9b1a28 Merge branch 'renovate/goreleaser-goreleaser-2.x' into 'main'
chore(deps): update goreleaser/goreleaser docker tag to v2.12.7

See merge request unboundsoftware/schemas!605
2025-10-25 09:55:26 +02:00
argoyle 576a530886 Merge branch 'renovate/github.com-wundergraph-graphql-go-tools-v2-2.x' into 'main'
fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.234

See merge request unboundsoftware/schemas!604
2025-10-25 09:54:52 +02:00
Renovate aa9fea580f chore(deps): update goreleaser/goreleaser docker tag to v2.12.7 2025-10-24 18:57:11 +00:00
Renovate ccb8a10f92 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.234 2025-10-24 17:57:43 +00:00
argoyle d86beb8308 Merge branch 'renovate/github.com-wundergraph-graphql-go-tools-v2-2.x' into 'main'
fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.233

See merge request unboundsoftware/schemas!603
2025-10-23 20:50:39 +02:00
Renovate 429cf6e66d fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.233 2025-10-23 15:58:14 +00:00
argoyle 2dd0ac9392 Merge branch 'renovate/goreleaser-goreleaser-2.x' into 'main'
chore(deps): update goreleaser/goreleaser docker tag to v2.12.6

See merge request unboundsoftware/schemas!601
2025-10-22 11:47:28 +02:00
argoyle 780244b165 Merge branch 'renovate/github.com-wundergraph-graphql-go-tools-v2-2.x' into 'main'
fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.232

See merge request unboundsoftware/schemas!602
2025-10-22 11:21:04 +02:00
Renovate 540e90a577 chore(deps): update goreleaser/goreleaser docker tag to v2.12.6 2025-10-22 11:19:22 +02:00
Renovate 1b527bab74 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.232 2025-10-22 08:57:48 +00:00
argoyle 5b64cd0165 Merge branch 'renovate/golang-1.25.3' into 'main'
chore(deps): update golang:1.25.3 docker digest to 69d1009

See merge request unboundsoftware/schemas!600
2025-10-21 14:19:45 +02:00
Renovate e2fb56f505 chore(deps): update golang:1.25.3 docker digest to 69d1009 2025-10-21 09:58:16 +00:00
argoyle 6bdbe36c7f Merge branch 'renovate/github.com-wundergraph-graphql-go-tools-v2-2.x' into 'main'
fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.231

See merge request unboundsoftware/schemas!599
2025-10-20 17:17:03 +02:00
Renovate 2a1415bc35 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.231 2025-10-20 14:58:41 +00:00
argoyle 8e53b1fbf4 Merge branch 'ci-add-git-cliff-changelog-config' into 'main'
ci: add git-cliff configuration for changelog generation

See merge request unboundsoftware/schemas!597
2025-10-14 11:37:20 +02:00
argoyle 2cf992c948 ci: add git-cliff configuration for changelog generation
This commit introduces a new configuration file for git-cliff to 
automate changelog generation. It defines templates for the header, 
body, and footer of the changelog, ensuring that all notable changes 
are documented effectively. The configuration enables parsing of 
conventional commit messages, allowing for better organization of 
changes by type. This enhancement streamlines the release process and 
improves project maintainability.
2025-10-14 11:28:16 +02:00
argoyle ca9e7c3aa0 Merge branch 'next-release' into 'main'
chore(release): prepare for v0.6.6

See merge request unboundsoftware/schemas!584
2025-10-14 11:17:51 +02:00
Unbound Release db762cb496 chore(release): prepare for v0.6.6 2025-10-14 11:17:50 +02:00
argoyle c33885a0ab Merge branch 'renovate/golang-1.x' into 'main'
chore(deps): update golang docker tag to v1.25.3

See merge request unboundsoftware/schemas!596
2025-10-14 08:59:55 +02:00
Renovate 1135d77c35 chore(deps): update golang docker tag to v1.25.3 2025-10-13 23:58:57 +00:00
argoyle d1d14c1097 Merge branch 'renovate/github.com-wundergraph-graphql-go-tools-v2-2.x' into 'main'
fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.230

See merge request unboundsoftware/schemas!595
2025-10-10 10:32:46 +02:00
Renovate 41075e06a3 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.230 2025-10-09 15:02:02 +00:00
argoyle a7d4c01089 Merge branch 'renovate/golang-1.x' into 'main'
chore(deps): update golang docker tag to v1.25.2

See merge request unboundsoftware/schemas!594
2025-10-08 09:19:12 +02:00
Renovate 7c30a66144 chore(deps): update golang docker tag to v1.25.2 2025-10-07 22:08:51 +00:00
argoyle 98c17196c8 Merge branch 'renovate/github.com-pressly-goose-v3-3.x' into 'main'
fix(deps): update module github.com/pressly/goose/v3 to v3.26.0

See merge request unboundsoftware/schemas!593
2025-10-05 11:04:54 +02:00
Renovate 6635019035 fix(deps): update module github.com/pressly/goose/v3 to v3.26.0 2025-10-03 13:59:47 +00:00
argoyle 1ae73e7203 Merge branch 'renovate/alessandrojcm-commitlint-pre-commit-hook-9.x' into 'main'
chore(deps): update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.23.0

See merge request unboundsoftware/schemas!592
2025-10-02 17:06:07 +02:00
Renovate 91c02eb499 chore(deps): update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.23.0 2025-10-02 10:00:25 +00:00
argoyle 32fc6b2641 Merge branch 'renovate/golang-1.25.1' into 'main'
chore(deps): update golang:1.25.1 docker digest to 12640a4

See merge request unboundsoftware/schemas!591
2025-10-01 19:19:11 +02:00
Renovate ce86af4486 chore(deps): update golang:1.25.1 docker digest to 12640a4 2025-10-01 13:58:52 +00:00
argoyle 5258a68682 Merge branch 'renovate/goreleaser-goreleaser-2.x' into 'main'
chore(deps): update goreleaser/goreleaser docker tag to v2.12.5

See merge request unboundsoftware/schemas!590
2025-10-01 15:16:26 +02:00
Renovate 1d69be641c chore(deps): update goreleaser/goreleaser docker tag to v2.12.5 2025-10-01 12:57:39 +00:00
argoyle 3c571a1dc3 Merge branch 'renovate/goreleaser-goreleaser-2.x' into 'main'
chore(deps): update goreleaser/goreleaser docker tag to v2.12.4

See merge request unboundsoftware/schemas!589
2025-10-01 07:35:32 +02:00
Renovate 4c16e293c0 chore(deps): update goreleaser/goreleaser docker tag to v2.12.4 2025-10-01 02:56:55 +00:00
argoyle 18fb8da472 Merge branch 'renovate/github.com-99designs-gqlgen-0.x' into 'main'
fix(deps): update module github.com/99designs/gqlgen to v0.17.81

See merge request unboundsoftware/schemas!588
2025-09-26 11:24:45 +02:00
Renovate c9fa0ecc2c fix(deps): update module github.com/99designs/gqlgen to v0.17.81 2025-09-25 22:58:35 +00:00
argoyle 35db2fc74e Merge branch 'renovate/github.com-wundergraph-graphql-go-tools-v2-2.x' into 'main'
fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.229

See merge request unboundsoftware/schemas!587
2025-09-25 16:16:31 +02:00
Renovate e10ab9d75f fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.229 2025-09-25 13:57:58 +00:00
argoyle d6100bcb76 Merge branch 'renovate/goreleaser-goreleaser-2.x' into 'main'
chore(deps): update goreleaser/goreleaser docker tag to v2.12.3

See merge request unboundsoftware/schemas!586
2025-09-25 07:59:03 +02:00
argoyle 47d122aa8d Merge branch 'renovate/github.com-wundergraph-graphql-go-tools-v2-2.x' into 'main'
fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.228

See merge request unboundsoftware/schemas!585
2025-09-25 07:58:22 +02:00
Renovate b089801216 chore(deps): update goreleaser/goreleaser docker tag to v2.12.3 2025-09-25 03:56:44 +00:00
Renovate 3c071cb300 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.228 2025-09-24 15:57:59 +00:00
argoyle 8fe56f6ce0 Merge branch 'renovate/github.com-wundergraph-graphql-go-tools-v2-2.x' into 'main'
fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.227

See merge request unboundsoftware/schemas!583
2025-09-23 16:11:22 +02:00
Renovate c9aa447a9f fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.227 2025-09-23 13:59:32 +00:00
argoyle 575f97e8d1 Merge branch 'renovate/golangci-golangci-lint-2.x' into 'main'
chore(deps): update pre-commit hook golangci/golangci-lint to v2.5.0

See merge request unboundsoftware/schemas!582
2025-09-22 11:22:53 +02:00
Renovate dde2a965ec chore(deps): update pre-commit hook golangci/golangci-lint to v2.5.0 2025-09-21 19:57:48 +00:00
argoyle b6ae9826b2 Merge branch 'next-release' into 'main'
chore(release): prepare for v0.6.5

See merge request unboundsoftware/schemas!575
2025-09-18 13:57:02 +02:00
Unbound Release 787f388168 chore(release): prepare for v0.6.5 2025-09-18 13:57:02 +02:00
argoyle c4b01dbe07 Merge branch 'renovate/eventsourced' into 'main'
fix(deps): update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.19.3

See merge request unboundsoftware/schemas!581
2025-09-18 12:14:01 +02:00
Renovate 992a95ff8d fix(deps): update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.19.3 2025-09-18 09:58:42 +00:00
argoyle 0c31b8c2b9 Merge branch 'renovate/goreleaser-goreleaser-2.x' into 'main'
chore(deps): update goreleaser/goreleaser docker tag to v2.12.2

See merge request unboundsoftware/schemas!580
2025-09-18 09:36:58 +02:00
Renovate b75b61f724 chore(deps): update goreleaser/goreleaser docker tag to v2.12.2 2025-09-18 02:57:23 +00:00
argoyle 0e76377865 Merge branch 'renovate/github.com-99designs-gqlgen-0.x' into 'main'
fix(deps): update module github.com/99designs/gqlgen to v0.17.80

See merge request unboundsoftware/schemas!579
2025-09-17 22:08:20 +02:00
Renovate 52e58f8df8 fix(deps): update module github.com/99designs/gqlgen to v0.17.80 2025-09-17 21:19:09 +02:00
argoyle 35ba7679c9 Merge branch 'renovate/goreleaser-goreleaser-2.x' into 'main'
chore(deps): update goreleaser/goreleaser docker tag to v2.12.1

See merge request unboundsoftware/schemas!578
2025-09-16 16:44:34 +02:00
Renovate 9d5dc75c2b chore(deps): update goreleaser/goreleaser docker tag to v2.12.1 2025-09-16 02:56:58 +00:00
argoyle 83cb25a2bb Merge branch 'renovate/github.com-99designs-gqlgen-0.x' into 'main'
fix(deps): update module github.com/99designs/gqlgen to v0.17.79

See merge request unboundsoftware/schemas!577
2025-09-15 07:53:07 +02:00
Renovate e7a09e8322 fix(deps): update module github.com/99designs/gqlgen to v0.17.79 2025-09-15 07:19:10 +02:00
argoyle 2eae446669 Merge branch 'renovate/lietu-go-pre-commit-1.x' into 'main'
chore(deps): update pre-commit hook lietu/go-pre-commit to v1

See merge request unboundsoftware/schemas!576
2025-09-13 17:23:59 +02:00
Renovate 2e86f80727 chore(deps): update pre-commit hook lietu/go-pre-commit to v1 2025-09-13 09:12:24 +00:00
argoyle 1311a07dcb Merge branch 'renovate/github.com-wundergraph-graphql-go-tools-v2-2.x' into 'main'
fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.226

See merge request unboundsoftware/schemas!574
2025-09-12 14:17:49 +02:00
Renovate cd080189a9 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.226 2025-09-12 11:57:31 +00:00
argoyle 2d86c77c39 Merge branch 'next-release' into 'main'
chore(release): prepare for v0.6.4

See merge request unboundsoftware/schemas!573
2025-09-11 13:23:32 +02:00
Unbound Release eea7f86bbe chore(release): prepare for v0.6.4 2025-09-11 13:23:32 +02:00
argoyle baccd12e63 Merge branch 'renovate/eventsourced' into 'main'
fix(deps): update module gitlab.com/unboundsoftware/eventsourced/amqp to v1.9.0

See merge request unboundsoftware/schemas!572
2025-09-11 12:09:50 +02:00
Renovate 7fe90ee9af fix(deps): update module gitlab.com/unboundsoftware/eventsourced/amqp to v1.9.0 2025-09-11 09:58:15 +00:00
argoyle a3b9cae8eb Merge branch 'next-release' into 'main'
chore(release): prepare for v0.6.3

See merge request unboundsoftware/schemas!561
2025-09-11 10:42:36 +02:00
Unbound Release 769cbd3f14 chore(release): prepare for v0.6.3 2025-09-11 10:42:35 +02:00
Renovate ecc4da28ff fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.225 2025-09-09 14:59:00 +00:00
Renovate 4a14f41324 chore(deps): update golang:1.25.1 docker digest to 53f7808 2025-09-08 23:23:22 +00:00
Renovate 3f8fdce292 chore(deps): update golang docker tag to v1.25.1 2025-09-03 19:58:22 +00:00
Renovate 335c419a44 chore(deps): update goreleaser/goreleaser docker tag to v2.12.0 2025-09-03 03:57:02 +00:00
Renovate 82d2aa1812 fix(deps): update module go.opentelemetry.io/contrib/bridges/otelslog to v0.13.0 2025-09-01 11:25:33 +02:00
Renovate 24bbb39c3d fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.224 2025-09-01 08:57:51 +00:00
Renovate d98a20afff fix(deps): update opentelemetry-go monorepo 2025-08-29 20:07:41 +00:00
Renovate 737b133b8b fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.223 2025-08-28 09:57:27 +00:00
Renovate 177f923fc2 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.222 2025-08-28 08:52:22 +02:00
Renovate fd0c89dce9 fix(deps): update module github.com/stretchr/testify to v1.11.1 2025-08-27 12:00:45 +00:00
Renovate 1e58f8e0d5 fix(deps): update module github.com/pressly/goose/v3 to v3.25.0 2025-08-25 08:34:02 +02:00
Renovate 53349071aa fix(deps): update module github.com/stretchr/testify to v1.11.0 2025-08-24 16:59:02 +00:00
Renovate efe9e0a5a0 chore(deps): update golang:1.25.0 docker digest to f6b9e1a 2025-08-22 18:58:38 +00:00
Unbound Release 406cb8e4d0 chore(release): prepare for v0.6.2 2025-08-22 13:47:28 +00:00
argoyle 6e7ee0110b chore: remove conflicts entry from homebrew-taps config
Remove the conflicts entry for the unbound-schemas formula in the 
homebrew-taps configuration to simplify the integration process. This 
change enhances compatibility and streamlines the build setup.
2025-08-22 15:32:55 +02:00
Unbound Release 6eac3a7796 chore(release): prepare for v0.6.1 2025-08-22 14:33:00 +02:00
Renovate 890a6fd50e fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.221 2025-08-22 09:58:39 +00:00
Renovate e1cf0d8cb3 chore(deps): update golang docker tag to v1.25.0 2025-08-14 18:57:49 +00:00
Renovate 63d70d7e35 chore(deps): update golang:1.24.6 docker digest to cd8f653 2025-08-14 13:57:53 +00:00
Renovate 35a454f8b1 fix(deps): update module github.com/sparetimecoders/goamqp to v0.3.3 2025-08-14 13:01:31 +00:00
Renovate 6651553246 chore(deps): update pre-commit hook golangci/golangci-lint to v2.4.0 2025-08-13 20:58:38 +00:00
Renovate 311ef3f530 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.220 2025-08-13 09:58:44 +00:00
Renovate d8cce2fb05 chore(deps): update golang:1.24.6 docker digest to 958bfd1 2025-08-12 22:58:04 +00:00
Renovate 309b9423a4 chore(deps): update pre-commit hook pre-commit/pre-commit-hooks to v6 2025-08-09 19:58:04 +00:00
Renovate 323145a076 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.219 2025-08-08 10:57:11 +00:00
Renovate 28b4dc5572 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.218 2025-08-07 15:57:39 +00:00
Renovate c1173c20ae chore(deps): update golang docker tag to v1.24.6 2025-08-06 20:58:16 +00:00
Renovate 2d12077016 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.217 2025-08-06 12:57:31 +00:00
Renovate c38db83cd1 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.216 2025-08-06 09:58:51 +00:00
Renovate 25bd438d05 chore(deps): update pre-commit hook golangci/golangci-lint to v2.3.1 2025-08-02 21:58:23 +00:00
Renovate f4355d620f fix(deps): update module github.com/golang-jwt/jwt/v5 to v5.3.0 2025-07-31 22:14:05 +02:00
Renovate 887ba69c5e fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.215 2025-07-31 22:12:36 +02:00
Renovate 8e6c7aade7 chore(deps): update goreleaser/goreleaser docker tag to v2.11.2 2025-07-31 14:11:53 +00:00
Renovate 0f0f50111f fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.213 2025-07-29 00:05:28 +00:00
Renovate 81a895e5a6 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.212 2025-07-28 15:57:36 +00:00
Renovate 0fab1d5098 fix(deps): update module github.com/99designs/gqlgen to v0.17.78 2025-07-28 12:21:43 +02:00
Renovate 4fbfc0f42e chore(deps): update goreleaser/goreleaser docker tag to v2.11.1 2025-07-25 02:57:47 +00:00
Renovate 0ba3706c12 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.210 2025-07-22 19:56:58 +00:00
Renovate c44ac87b5e chore(deps): update golang:1.24.5 docker digest to 0a156a4 2025-07-22 04:57:28 +00:00
Renovate deefcd7045 chore(deps): update pre-commit hook golangci/golangci-lint to v2.3.0 2025-07-21 20:04:12 +02:00
Renovate 4933857351 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.208 2025-07-21 14:57:27 +00:00
Renovate 18616e8346 fix(deps): update module github.com/alecthomas/kong to v1.12.1 2025-07-21 07:37:41 +02:00
Renovate dd075afb8d chore(deps): update pre-commit hook gitleaks/gitleaks to v8.28.0 2025-07-20 16:56:45 +00:00
Renovate 003bd3cd50 fix(deps): update module github.com/golang-jwt/jwt/v5 to v5.2.3 2025-07-15 21:09:48 +02:00
Renovate a68fb437dc fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.207 2025-07-15 17:54:08 +00:00
Renovate 8aa57e8f68 chore(deps): update pre-commit hook golangci/golangci-lint to v2.2.2 2025-07-11 12:54:20 +00:00
Renovate 84e8764054 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.204 2025-07-11 06:54:06 +00:00
Renovate c40bbad892 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.203 2025-07-10 09:54:19 +00:00
Renovate c159c6d20e chore(deps): update goreleaser/goreleaser docker tag to v2.11.0 2025-07-09 21:49:06 +02:00
Renovate ae0d796e93 chore(deps): update golang docker tag to v1.24.5 2025-07-09 18:55:13 +00:00
Renovate 1ec0f9a3a7 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.202 2025-07-09 12:54:39 +00:00
Renovate 0dad651959 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.200 2025-07-08 15:54:10 +00:00
Renovate 24fcc4e6a2 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.199 2025-07-07 15:54:28 +00:00
Renovate 4c7406d97b fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.198 2025-07-04 12:54:27 +00:00
Renovate 51affc5a55 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.197 2025-07-03 11:54:02 +00:00
Renovate 10871a9b32 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.196 2025-07-02 17:54:39 +00:00
Renovate 411b51f895 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.195 2025-07-02 02:22:25 +00:00
Renovate 6a478209ea chore(deps): update golang:1.24.4 docker digest to 9f820b6 2025-07-01 05:54:30 +00:00
Renovate 043ca65698 chore(deps): update pre-commit hook golangci/golangci-lint to v2.2.1 2025-06-29 21:53:56 +00:00
Unbound Release 8131042a1c chore(release): prepare for v0.6.0 2025-06-29 13:35:39 +02:00
Renovate 2fb2c1947a fix(deps): update module github.com/99designs/gqlgen to v0.17.76 2025-06-29 10:25:22 +02:00
Renovate 1cf4faa17f fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.30 2025-06-28 23:55:22 +00:00
Renovate 8bb6cb7279 chore(deps): update pre-commit hook golangci/golangci-lint to v2.2.0 2025-06-28 20:54:12 +00:00
Renovate 376ae41b4f fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.194 2025-06-28 09:21:08 +02:00
Renovate dc6e57e815 fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.29 2025-06-27 21:54:30 +00:00
Renovate f8c7de447a fix(deps): update module go.opentelemetry.io/contrib/bridges/otelslog to v0.12.0 2025-06-25 20:02:41 +00:00
Renovate 92050aa31f fix(deps): update opentelemetry-go monorepo 2025-06-25 07:54:48 +00:00
Renovate e20829bb2b fix(deps): update module github.com/alecthomas/kong to v1.12.0 2025-06-25 00:54:50 +00:00
Renovate 1918ec3da4 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.192 2025-06-19 09:03:08 +00:00
Renovate 735c387c58 fix(deps): update module github.com/99designs/gqlgen to v0.17.75 2025-06-16 14:55:10 +00:00
Renovate 98e2f660a6 fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.28 2025-06-15 20:54:42 +00:00
Renovate 7a0159a33f fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.190 2025-06-13 16:54:19 +00:00
argoyle b4447bb15e feat: add build version injection via CI_COMMIT argument
Inject the build version into the binary using the CI_COMMIT 
argument for better traceability of deployments. Update the 
Dockerfile to pass the commit hash to the build process, 
ensuring that each build contains version information tied 
to the specific commit.
2025-06-13 13:26:56 +02:00
argoyle 2948905005 feat(k8s): add OpenTelemetry exporter endpoint to deploy.yaml
Add the OTEL_EXPORTER_OTLP_ENDPOINT environment variable to 
the deployment configuration. This change enables the application 
to send telemetry data to the specified OpenTelemetry collector 
endpoint for better monitoring and observability.
2025-06-13 11:36:19 +02:00
Unbound Release 53141720ca chore(release): prepare for v0.5.3 2025-06-13 11:28:30 +02:00
argoyle e84df1db08 refactor: remove Sentry integration and replace with OpenTelemetry
Remove Sentry dependencies and configuration. Introduce monitoring 
setup for OpenTelemetry. Update logging to include log format 
options, and replace Sentry error handling middleware with 
monitoring handlers for GraphQL playground. Adjust environment 
variable handling to enhance configuration clarity and flexibility.
2025-06-13 11:00:52 +02:00
Renovate 9539e6bb1b fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.189 2025-06-12 19:14:49 +00:00
Renovate 291ef08ad7 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.188 2025-06-11 17:54:30 +00:00
Renovate 98b84772df chore(deps): update golang:1.24.4 docker digest to 3494bbe 2025-06-11 03:01:58 +00:00
Renovate 26278066b8 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.187 2025-06-10 10:53:51 +00:00
Unbound Release 5bdacce71a chore(release): prepare for v0.5.2 2025-06-09 06:33:38 +00:00
argoyle 0b4bbdeef0 fix(goreleaser): specify binary name in configuration
Adds the binary name "schemactl" to the Goreleaser 
configuration file to ensure proper build and release 
process for the Homebrew tap. This improves clarity 
and correctness in the configuration.
2025-06-09 08:22:34 +02:00
Unbound Release 3c3c939447 chore(release): prepare for v0.5.1 2025-06-09 08:00:57 +02:00
Renovate 93a12a2909 chore(deps): update goreleaser/goreleaser docker tag to v2.10.2 2025-06-09 07:10:55 +02:00
Renovate c36802570a chore(deps): update pre-commit hook gitleaks/gitleaks to v8.27.2 2025-06-09 00:54:24 +00:00
Renovate 5d64a3a45c chore(deps): update pre-commit hook gitleaks/gitleaks to v8.27.1 2025-06-08 02:53:51 +00:00
Renovate e55d3400e6 chore(deps): update golang docker tag to v1.24.4 2025-06-05 20:54:48 +00:00
Renovate 7da95e7566 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.186 2025-06-05 14:54:09 +00:00
Renovate b8ea2690fc fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.185 2025-06-04 10:54:07 +00:00
Renovate 3689486fa8 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.184 2025-06-03 22:54:02 +00:00
Renovate 1787815299 fix(deps): update module github.com/99designs/gqlgen to v0.17.74 2025-06-02 17:56:04 +00:00
Renovate 2886835d18 chore(deps): update pre-commit hook gitleaks/gitleaks to v8.27.0 2025-06-01 16:54:04 +00:00
Renovate 097e1274db fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.183 2025-05-28 18:55:37 +00:00
Renovate 640ede7de2 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.182 2025-05-27 10:53:51 +00:00
Renovate 122c87dab4 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.181 2025-05-23 10:53:47 +00:00
Renovate 4647d7ad1e chore(deps): update golang:1.24.3 docker digest to f255a7d 2025-05-22 11:23:04 +02:00
Renovate f2c73e8bf6 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.180 2025-05-21 16:54:04 +00:00
Renovate ba7bbd082a fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.179 2025-05-19 11:54:14 +00:00
Renovate 2466d2a4ab fix(deps): update module github.com/khan/genqlient to v0.8.1 2025-05-18 19:53:47 +00:00
Renovate 86a61a1a64 fix(deps): update module github.com/getsentry/sentry-go to v0.33.0 2025-05-15 12:55:30 +00:00
Renovate 75e85c0339 fix(deps): update module github.com/alecthomas/kong to v1.11.0 2025-05-15 11:04:36 +00:00
Unbound Release d654ef1b81 chore(release): prepare for v0.5.0 2025-05-15 12:57:56 +02:00
argoyle 55114c3d39 fix(k8s): update apiVersion for external secrets
Update apiVersion in the secrets.yaml file from v1beta1 to v1 to 
ensure compatibility with the latest external-secrets API. This 
change maintains the stability and functionality of secrets 
management in Kubernetes deployments.
2025-05-15 10:17:09 +02:00
Renovate 0575c45d66 chore(deps): update pre-commit hook gitleaks/gitleaks to v8.26.0 2025-05-12 21:54:21 +00:00
Renovate d004745244 fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.27 2025-05-07 11:54:54 +00:00
Renovate 36ef6a85c2 fix(deps): update module github.com/pressly/goose/v3 to v3.24.3 2025-05-07 01:55:31 +00:00
Renovate aa8363428f chore(deps): update golang docker tag to v1.24.3 2025-05-06 20:54:50 +00:00
Renovate 36a387040f fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.178 2025-05-06 17:56:47 +00:00
Renovate 5cf10efe15 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.177 2025-05-06 14:54:10 +00:00
Renovate 73624e21d7 chore(deps): update pre-commit hook golangci/golangci-lint to v2.1.6 2025-05-04 15:53:50 +00:00
Renovate f53321368d fix(deps): update module github.com/99designs/gqlgen to v0.17.73 2025-05-03 16:37:30 +02:00
argoyle 59e0f17769 chore(ci): update GitLab CI configuration for templates
Adds a new template file 'Defaults.gitlab-ci.yml' to the CI
configuration and adjusts the include path for clarity. This
ensures better organization and standardization in the CI/CD
processes associated with the project.
2025-05-01 09:23:30 +02:00
Renovate 8661c931a1 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.176 2025-04-30 20:54:01 +00:00
Renovate f484bea8c4 chore(deps): update pre-commit hook gitleaks/gitleaks to v8.25.1 2025-04-30 13:54:22 +00:00
Renovate 8c4f579cef chore(deps): update goreleaser/goreleaser docker tag to v2.9.0 2025-04-30 02:53:40 +00:00
Renovate 30ccbf9aab fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.175 2025-04-29 16:54:01 +00:00
Renovate 5973c1341d chore(deps): update pre-commit hook gitleaks/gitleaks to v8.25.0 2025-04-29 14:54:52 +00:00
Renovate 0285549431 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.174 2025-04-29 13:54:18 +00:00
argoyle 3256819705 feat(k8s): add PodDisruptionBudget for schemas service
Create a PodDisruptionBudget to ensure minimum availability of the 
schemas service during voluntary disruptions. This enhances the 
service's resilience and ensures high availability.
2025-04-29 09:51:37 +02:00
Renovate 578354ddeb chore(deps): update golang:1.24.2 docker digest to bf7899c 2025-04-29 07:39:48 +02:00
Renovate 12adc9bc48 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.173 2025-04-25 22:54:16 +00:00
Renovate a44937e130 chore(deps): update pre-commit hook golangci/golangci-lint to v2.1.5 2025-04-24 19:54:11 +00:00
Renovate 04a88bf310 fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.26 2025-04-24 18:54:31 +00:00
Renovate c1e5ee97ee chore(deps): update pre-commit hook golangci/golangci-lint to v2.1.4 2025-04-24 17:56:17 +00:00
Unbound Release 66dd948181 chore(release): prepare for v0.4.1 2025-04-24 14:44:21 +02:00
Renovate 6fc87e952b fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.172 2025-04-22 18:54:20 +00:00
Renovate dade16a10c fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.171 2025-04-22 09:55:07 +00:00
Renovate aa617ae11d fix(deps): update module github.com/99designs/gqlgen to v0.17.72 2025-04-19 00:56:32 +00:00
Renovate a87b480345 fix(deps): update module github.com/99designs/gqlgen to v0.17.71 2025-04-18 10:23:36 +02:00
Renovate 69e232cd7c fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.170 2025-04-17 19:53:50 +00:00
Renovate 5adfe0e711 fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.25 2025-04-17 12:55:01 +00:00
Renovate 7fa947a945 chore(deps): update pre-commit hook golangci/golangci-lint to v2.1.2 2025-04-15 13:55:14 +00:00
Renovate a4552cb418 chore(deps): update pre-commit hook golangci/golangci-lint to v2.1.1 2025-04-12 18:55:16 +00:00
Unbound Release c15371c236 chore(release): prepare for v0.4.0 2025-04-12 14:08:29 +02:00
argoyle aaa111dd20 feat(service): implement graceful shutdown for HTTP server
Add a context with timeout to handle graceful shutdown of the HTTP 
server. Update error handling during the server's close to include 
context-aware shutdown. Ensure that the server properly logs only 
non-closed errors when listening.
2025-04-12 13:41:02 +02:00
argoyle 8e02bfb0a2 refactor(deploy): remove cpu and memory limits for schemas
Removes the CPU and memory limits for the schemas container in the
Kubernetes deployment configuration. This change is made to allow
for greater flexibility in resource allocation based on runtime
demands, ensuring better performance in varying load conditions.
2025-04-12 10:44:13 +02:00
Renovate 1e34fe77eb chore(deps): update pre-commit hook gitleaks/gitleaks to v8.24.3 2025-04-11 14:54:14 +00:00
Renovate 30ca9091d2 fix(deps): update module gitlab.com/unboundsoftware/eventsourced/amqp to v1.8.1 2025-04-11 09:56:34 +00:00
argoyle 4dd79e3d73 fix(k8s): increase CPU request for better performance
Adjusts the CPU requests from "10m" to "20m" in the deploy.yaml file to 
improve application performance and ensure stability under load.
2025-04-10 17:19:48 +02:00
Renovate bdfbf6c22e fix(deps): update module github.com/getsentry/sentry-go to v0.32.0 2025-04-10 09:56:22 +00:00
Renovate b6a281b5f2 fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.24 2025-04-09 22:54:35 +00:00
Renovate e8305441bb fix(deps): update module github.com/sparetimecoders/goamqp to v0.3.2 2025-04-09 13:55:36 +00:00
argoyle dd5c0f3dc0 fix(secrets): remove namespace from ExternalSecret definition
This change removes the namespace field from the ExternalSecret 
definition in the secrets.yaml file, allowing for more flexible 
deployment within different namespaces without the need for 
modification.
2025-04-08 11:27:12 +02:00
Unbound Release f35be93cb6 chore(release): prepare for v0.3.0 2025-04-08 10:42:13 +02:00
Renovate 3840c40c90 chore(deps): update golang:1.24.2 docker digest to aebb7df 2025-04-08 08:24:05 +02:00
argoyle 2ba10d763d feat(k8s): add RabbitMQ configurations and update secrets
Add a new extract for RabbitMQ in the secrets and include
AMQP_URL in local secrets. Update the merge policy and
engine version in the deployment template. Remove unused
RabbitMQ secret reference from the deployment. These changes
improve configuration management and ensure consistency
between environments.
2025-04-08 07:49:54 +02:00
Renovate ba099eff51 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.169 2025-04-07 16:54:25 +00:00
Renovate 2196f5a417 chore(deps): update golang docker tag to v1.24.2 2025-04-01 22:31:52 +02:00
Renovate 3e26aa0166 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.168 2025-04-01 16:54:09 +00:00
Renovate fdf6402b7c fix(deps): update eventsourced 2025-04-01 12:54:52 +00:00
Renovate c6a5711dff fix(deps): update module github.com/alecthomas/kong to v1.10.0 2025-04-01 07:26:41 +02:00
Renovate f82935e71a chore(deps): update goreleaser/goreleaser docker tag to v2.8.2 2025-04-01 02:53:25 +00:00
Renovate b8053b6273 fix(deps): update module github.com/pressly/goose/v3 to v3.24.2 2025-03-28 02:54:25 +00:00
Renovate 4086ddf73c fix(deps): update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.19.1 2025-03-27 08:55:53 +00:00
Renovate 8d5ff3863d fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.167 2025-03-26 23:53:39 +00:00
Renovate 19233af4a7 fix(deps): update module github.com/99designs/gqlgen to v0.17.70 2025-03-26 14:54:27 +00:00
Renovate b6ed3c7ad9 fix(deps): update module github.com/99designs/gqlgen to v0.17.69 2025-03-26 08:53:17 +01:00
Renovate 05eaa96d37 chore(deps): update pre-commit hook golangci/golangci-lint to v2.0.2 2025-03-26 08:47:48 +01:00
Renovate 9b8f98c2d2 fix(deps): update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.19.0 2025-03-25 20:54:41 +00:00
Renovate d6a862ee94 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.166 2025-03-25 17:54:57 +00:00
Renovate 574e6c8926 chore(deps): update pre-commit hook golangci/golangci-lint to v2.0.1 2025-03-24 20:53:49 +00:00
Renovate 15eda6f0de chore(deps): update pre-commit hook golangci/golangci-lint to v2 2025-03-24 14:45:39 +01:00
Renovate 46b624568e chore(deps): update pre-commit hook gitleaks/gitleaks to v8.24.2 2025-03-22 12:53:29 +00:00
Renovate 72bbf92265 fix(deps): update module github.com/golang-jwt/jwt/v5 to v5.2.2 2025-03-21 20:53:44 +00:00
Renovate 313e43016b chore(deps): update golang:1.24.1 docker digest to 5ecf333 2025-03-18 03:53:41 +00:00
Renovate 570a0114b3 chore(deps): update pre-commit hook golangci/golangci-lint to v1.64.8 2025-03-17 20:53:41 +00:00
Renovate a9c07bf4c2 fix(deps): update module github.com/99designs/gqlgen to v0.17.68 2025-03-17 08:39:58 +01:00
Renovate f126c23b45 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.165 2025-03-14 12:53:49 +00:00
Renovate 65dc35a5fc chore(deps): update goreleaser/goreleaser docker tag to v2.8.1 2025-03-14 02:53:00 +00:00
Renovate b57080c9d0 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.164 2025-03-13 18:54:37 +00:00
Renovate 19a826608c chore(deps): update goreleaser/goreleaser docker tag to v2.8.0 2025-03-13 04:53:08 +00:00
Renovate 316d4a4c34 chore(deps): update pre-commit hook golangci/golangci-lint to v1.64.7 2025-03-11 23:53:18 +00:00
Renovate 48873bf5ee chore(deps): update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.22.0 2025-03-11 14:53:36 +00:00
Renovate f9cce092b5 fix(deps): update module github.com/alecthomas/kong to v1.9.0 2025-03-11 06:53:43 +00:00
Renovate ae8aa21388 fix(deps): update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.18.1 2025-03-10 16:01:25 +00:00
Renovate 7ba1d3ae08 fix(deps): update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.18.0 2025-03-09 19:54:00 +00:00
Renovate fd6e4a0cbd fix(deps): update module github.com/auth0/go-jwt-middleware/v2 to v2.3.0 2025-03-05 10:53:54 +00:00
Renovate 856b140538 chore(deps): update golang docker tag to v1.24.1 2025-03-05 11:22:36 +01:00
Renovate fdfbf823a6 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.163 2025-03-04 19:54:01 +00:00
Renovate 697e6c3d75 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.162 2025-03-03 15:53:43 +00:00
Renovate fdbb57e33a fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.161 2025-03-03 13:53:34 +00:00
Renovate 07057d7206 chore(deps): update pre-commit hook golangci/golangci-lint to v1.64.6 2025-03-02 23:53:20 +00:00
Unbound Release d0afaa7815 chore(release): prepare for v0.2.0 2025-02-28 12:49:26 +00:00
argoyle ee378dc6a3 feat(sdlmerge): add shared types for GraphQL schema handling
Introduce types for managing fielded, enum, union, and scalar shared types.
Implement functionality for comparing values and creating field sets.
Enhance schema extensions by integrating new visitors for enum types.
2025-02-28 13:10:07 +01:00
Renovate 7ffa9a3881 fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.23 2025-02-27 23:35:06 +01:00
Renovate 683bf6bd85 fix(deps): update eventsourced 2025-02-27 20:24:02 +01:00
argoyle 17a3edbc07 feat(dependencies): add Eventsourced package group for updates
Adds a new package group for Eventsourced to the Renovate configuration.  
This change improves dependency management by organizing related  
packages under a specific group for better update tracking.
2025-02-27 20:24:02 +01:00
argoyle 318e211196 chore(docker): update base image architecture to amd64
Change the base image in the Dockerfile to use the amd64
architecture. This ensures compatibility with the target
environment and resolves issues related to image
compatibility during the build process.
2025-02-27 20:23:53 +01:00
Renovate bf0b8f5935 chore(deps): update golang:1.24.0 docker digest to 58cf31c 2025-02-25 18:54:36 +00:00
Renovate 1232ca62b2 chore(deps): update golang:1.24.0 docker digest to a14c5a6 2025-02-25 12:53:28 +00:00
Renovate f6a1e47361 chore(deps): update golang:1.24.0 docker digest 2025-02-25 06:53:30 +00:00
Renovate f96e6e860b chore(deps): update pre-commit hook gitleaks/gitleaks to v8.24.0 2025-02-20 02:53:59 +00:00
Renovate 44cc6ccd16 fix(deps): update module github.com/99designs/gqlgen to v0.17.66 2025-02-15 16:33:11 +00:00
Renovate 6abc49a3fc chore(deps): update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.21.0 2025-02-15 14:53:53 +00:00
Renovate 7d7836fedf fix(deps): update module github.com/99designs/gqlgen to v0.17.65 2025-02-15 00:55:15 +00:00
argoyle f62a8037bc fix(deps): update dependencies to latest versions
Updates the following dependencies to their latest stable versions:
- golang.org/x/crypto to v0.33.0
- golang.org/x/mod to v0.23.0
- golang.org/x/net to v0.35.0
- golang.org/x/sync to v0.11.0
- golang.org/x/sys to v0.30.0
- golang.org/x/text to v0.22.0
- golang.org/x/tools to v0.30.0

These changes ensure compatibility with the latest features and fixes, enhancing overall project stability and performance.
2025-02-14 10:54:08 +01:00
Renovate 08bba81ba0 chore(deps): update pre-commit hook golangci/golangci-lint to v1.64.5 2025-02-13 21:54:37 +00:00
Renovate 881ff122f8 fix(deps): update module github.com/alecthomas/kong to v1.8.1 2025-02-13 19:54:26 +00:00
Renovate 0d384e8a3f chore(deps): update golang docker tag to v1.24.0 2025-02-13 13:54:01 +00:00
argoyle f49156f637 chore(go): update go version to 1.23.6 and remove toolchain
Updates the Go version in go.mod to 1.23.6 and removes the toolchain 
line to simplify the module configuration. This ensures compatibility 
with the latest Go features and improvements.
2025-02-13 14:15:19 +01:00
Renovate 62869e4a77 chore(deps): update pre-commit hook golangci/golangci-lint to v1.64.4 2025-02-12 22:54:20 +00:00
Renovate ab2c55fb39 chore(deps): update pre-commit hook golangci/golangci-lint to v1.64.3 2025-02-12 19:54:16 +00:00
argoyle ef271a88a9 fix(ci): add resource group to production deployment configuration
Adds a resource group to the production deployment configuration in 
the GitLab CI/CD pipeline. This change ensures that the deployment 
process is correctly associated with the specified resource group, 
enhancing the deployment's reliability and clarity.
2025-02-12 13:04:43 +00:00
argoyle 14d3733bf5 fix(ci): update golang image to improve compatibility
Changes the golang image used in the build and check stages from
a generic image to the amd64 variant. This ensures better
compatibility with the tools and libraries being used in the 
pipeline.
2025-02-12 13:50:46 +01:00
Renovate 2cc4e379bc chore(deps): update pre-commit hook golangci/golangci-lint to v1.64.2 2025-02-11 21:53:56 +00:00
Renovate d39427c9ff chore(deps): update goreleaser/goreleaser docker tag to v2.7.0 2025-02-11 02:53:26 +00:00
Renovate 2cb2ba9754 fix(deps): update module github.com/alecthomas/kong to v1.8.0 2025-02-09 23:54:31 +00:00
Renovate 53d5c21b77 chore(deps): update golang:1.23.6 docker digest to 9271129 2025-02-05 09:55:16 +00:00
Renovate 2b09f6c3c5 chore(deps): update golang:1.23.6 docker digest to 958bd2e 2025-02-05 06:53:44 +00:00
Renovate 9f2be264c3 chore(deps): update golang docker tag to v1.23.6 2025-02-05 03:54:38 +00:00
Renovate 31e8d8cd49 chore(deps): update dependency go to v1.23.6 2025-02-04 16:54:25 +00:00
Renovate b4e4c9e2e3 chore(deps): update golang:1.23.5 docker digest to e213430 2025-02-04 09:55:14 +00:00
Renovate 35bf4eb6dc fix(deps): update module github.com/khan/genqlient to v0.8.0 2025-02-03 00:56:28 +00:00
Renovate 7ddca97cce fix(deps): update module github.com/alecthomas/kong to v1.7.0 2025-01-30 02:56:20 +00:00
Renovate 3a78d90c4b chore(deps): update pre-commit hook gitleaks/gitleaks to v8.23.3 2025-01-29 14:54:57 +00:00
Renovate 84b7d2bf74 fix(deps): update module github.com/99designs/gqlgen to v0.17.64 2025-01-28 19:48:02 +01:00
Unbound Release 16008218a5 chore(release): prepare for v0.1.1 2025-01-24 17:42:58 +00:00
Renovate 0908099d34 chore(deps): update pre-commit hook gitleaks/gitleaks to v8.23.2 2025-01-24 15:03:16 +00:00
argoyle 74823a8947 fix(k8s): standardize app label to app.kubernetes.io/name
Update Kubernetes YAML files to replace the app label with the 
standard app.kubernetes.io/name label for better consistency 
and adherence to best practices in Kubernetes resource labeling.
2025-01-24 15:14:13 +01:00
Renovate c5dcc6f87a chore(deps): update goreleaser/goreleaser docker tag to v2.6.1 2025-01-22 11:55:04 +00:00
Renovate 8f2a88f405 chore(deps): update golang:1.23.5 docker digest to 8c10f21 2025-01-22 09:14:34 +00:00
Renovate d88b6f2ee8 chore(deps): update goreleaser/goreleaser docker tag to v2.6.0 2025-01-22 00:57:25 +00:00
Renovate 21e32b5b09 chore(deps): update golang docker tag to v1.23.5 2025-01-17 07:25:59 +00:00
Renovate cd08e429e8 chore(deps): update dependency go to v1.23.5 2025-01-16 20:56:07 +00:00
Renovate 73fdd8a2e7 chore(deps): update golang:1.23.4 docker digest to 9820aca 2025-01-15 23:11:57 +00:00
Renovate c73a6a2c1f chore(deps): update golang:1.23.4 docker digest to 5305905 2025-01-15 18:55:36 +00:00
Renovate 22e0952012 chore(deps): update pre-commit hook gitleaks/gitleaks to v8.23.1 2025-01-15 12:57:32 +00:00
Renovate fe52ddbb3a chore(deps): update golang:1.23.4 docker digest to 585103a 2025-01-15 00:57:22 +00:00
Renovate e229458c39 chore(deps): update golang:1.23.4 docker digest to 08e1417 2025-01-14 12:56:45 +00:00
Renovate c64f5ce1df chore(deps): update golang:1.23.4 docker digest to 3b1a7de 2025-01-14 07:13:53 +00:00
Renovate 7a95c98573 chore(deps): update pre-commit hook gitleaks/gitleaks to v8.23.0 2025-01-13 15:56:15 +00:00
Renovate 03ba8a774c fix(deps): update module github.com/99designs/gqlgen to v0.17.63 2025-01-10 15:55:56 +00:00
Renovate 23da66078a fix(deps): update module github.com/pressly/goose/v3 to v3.24.1 2025-01-10 09:07:01 +00:00
Renovate 1e50301c3c fix(deps): update module github.com/alecthomas/kong to v1.6.1 2025-01-07 00:57:18 +00:00
Renovate 8de129c925 chore(deps): update pre-commit hook golangci/golangci-lint to v1.63.4 2025-01-03 19:56:20 +00:00
Renovate 660f07f3cd chore(deps): update pre-commit hook golangci/golangci-lint to v1.63.3 2025-01-02 20:29:38 +00:00
Renovate fed6e512d3 fix(deps): update module github.com/getsentry/sentry-go to v0.31.1 2025-01-02 16:56:30 +00:00
Renovate f1b7a36103 fix(deps): update module github.com/getsentry/sentry-go to v0.31.0 2025-01-02 14:14:31 +00:00
Renovate 74ee419e56 chore(deps): update goreleaser/goreleaser docker tag to v2.5.1 2025-01-02 14:13:28 +00:00
Renovate f8aa95ccd5 chore(deps): update pre-commit hook golangci/golangci-lint to v1.63.2 2025-01-02 12:55:24 +00:00
Renovate e013762fd9 chore(deps): update pre-commit hook golangci/golangci-lint to v1.63.1 2025-01-01 21:55:28 +00:00
53 changed files with 4904 additions and 2409 deletions
+10 -4
View File
@@ -1,5 +1,7 @@
include:
- template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'
- project: unboundsoftware/ci-templates
file: Defaults.gitlab-ci.yml
- project: unboundsoftware/ci-templates
file: Release.gitlab-ci.yml
- project: unboundsoftware/ci-templates
@@ -19,7 +21,7 @@ variables:
check:
stage: .pre
image: golang:1.23.4@sha256:7ea4c9dcb2b97ff8ee80a67db3d44f98c8ffa0d191399197007d8459c1453041
image: amd64/golang:1.25.4@sha256:efe81fa41fdf81fb873ab7cd931b9bb29bd10aced6c252cbd91739c34e654f01
script:
- go install mvdan.cc/gofumpt@latest
- go install golang.org/x/tools/cmd/goimports@latest
@@ -38,7 +40,7 @@ build:
vulnerabilities:
stage: build
image: golang:1.23.4@sha256:7ea4c9dcb2b97ff8ee80a67db3d44f98c8ffa0d191399197007d8459c1453041
image: amd64/golang:1.25.4@sha256:efe81fa41fdf81fb873ab7cd931b9bb29bd10aced6c252cbd91739c34e654f01
script:
- go install golang.org/x/vuln/cmd/govulncheck@latest
- govulncheck ./...
@@ -54,12 +56,15 @@ deploy-prod:
- if: $CI_COMMIT_BRANCH == "main"
environment:
name: prod
resource_group: prod
check_release:
stage: test
image:
name: goreleaser/goreleaser:v2.5.0@sha256:8a70dbaf65cef49cd3ae9b564395fe875fa8136a3d45908f84c6e35ff8925ec9
name: goreleaser/goreleaser:v2.12.7@sha256:a2a47c0dda85f8d40eaaa5b9765bf76c69addb6060666f8a51441410d9b008e9
entrypoint: [ '' ]
variables:
GOTOOLCHAIN: auto
script: |
goreleaser check
goreleaser release --snapshot --clean
@@ -69,13 +74,14 @@ release:
needs:
- unbound_release_prepare_release
image:
name: goreleaser/goreleaser:v2.5.0@sha256:8a70dbaf65cef49cd3ae9b564395fe875fa8136a3d45908f84c6e35ff8925ec9
name: goreleaser/goreleaser:v2.12.7@sha256:a2a47c0dda85f8d40eaaa5b9765bf76c69addb6060666f8a51441410d9b008e9
entrypoint: [ '' ]
variables:
# Disable shallow cloning so that goreleaser can diff between tags to
# generate a changelog.
GIT_DEPTH: 0
GITLAB_TOKEN: $GITLAB_CI_TOKEN
GOTOOLCHAIN: auto
# Only run this release job for tags, not every commit (for example).
rules:
- if: $CI_COMMIT_TAG
+20 -1
View File
@@ -1,3 +1,22 @@
version: "2"
run:
allow-parallel-runners: true
timeout: 5m
linters:
exclusions:
generated: lax
presets:
- comments
- common-false-positives
- legacy
- std-error-handling
paths:
- third_party$
- builtin$
- examples$
formatters:
exclusions:
generated: lax
paths:
- third_party$
- builtin$
- examples$
+8 -4
View File
@@ -16,18 +16,22 @@ builds:
- amd64
- arm64
brews:
homebrew_casks:
- name: unbound-schemas
repository:
owner: unboundsoftware
name: homebrew-taps
directory: Formula
install: |
bin.install "schemactl"
binaries: [schemactl]
directory: Casks
commit_author:
name: "Joakim Olsson"
email: joakim@unbound.se
homepage: "https://schemas.unbound.se/"
hooks:
post:
install: |
# replace foo with the actual binary name
system_command "/usr/bin/xattr", args: ["-dr", "com.apple.quarantine", "#{staged_path}/schemactl"]
archives:
- id: unbound-schemas
+5 -5
View File
@@ -2,7 +2,7 @@
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
rev: v6.0.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
@@ -18,7 +18,7 @@ repos:
- --project
- unboundsoftware/schemas
- repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook
rev: v9.20.0
rev: v9.23.0
hooks:
- id: commitlint
stages: [ commit-msg ]
@@ -32,16 +32,16 @@ repos:
- -local
- gitlab.com/unboundsoftware/schemas
- repo: https://github.com/lietu/go-pre-commit
rev: v0.1.0
rev: v1.0.0
hooks:
- id: go-test
- id: gofumpt
- repo: https://github.com/golangci/golangci-lint
rev: v1.63.0
rev: v2.6.2
hooks:
- id: golangci-lint-full
- repo: https://github.com/gitleaks/gitleaks
rev: v8.22.1
rev: v8.29.0
hooks:
- id: gitleaks
exclude: '^ctl/generated.go|graph/generated/.*$|^graph/model/models_gen.go|^tools/.*$$'
+1
View File
@@ -0,0 +1 @@
{"version":"v0.7.0"}
+640
View File
@@ -2,6 +2,432 @@
All notable changes to this project will be documented in this file.
## [0.7.0] - 2025-11-19
### 🚀 Features
- Add Cosmo Router config generation and PubSub support
### 🐛 Bug Fixes
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.231
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.232
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.233
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.234
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.235
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.31
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.236
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.82
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.237
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.83
- *(deps)* Update module github.com/alecthomas/kong to v1.13.0
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.238
### ⚙️ Miscellaneous Tasks
- Add git-cliff configuration for changelog generation
- *(deps)* Update golang:1.25.3 docker digest to 69d1009
- *(deps)* Update goreleaser/goreleaser docker tag to v2.12.6
- *(deps)* Update goreleaser/goreleaser docker tag to v2.12.7
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2.6.0
- *(deps)* Update golang:1.25.3 docker digest to 9ac0edc
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2.6.1
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.29.0
- *(deps)* Update golang docker tag to v1.25.4
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2.6.2
- *(deps)* Update golang:1.25.4 docker digest to efe81fa
## [0.6.6] - 2025-10-14
### 🐛 Bug Fixes
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.227
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.228
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.229
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.81
- *(deps)* Update module github.com/pressly/goose/v3 to v3.26.0
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.230
### ⚙️ Miscellaneous Tasks
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2.5.0
- *(deps)* Update goreleaser/goreleaser docker tag to v2.12.3
- *(deps)* Update goreleaser/goreleaser docker tag to v2.12.4
- *(deps)* Update goreleaser/goreleaser docker tag to v2.12.5
- *(deps)* Update golang:1.25.1 docker digest to 12640a4
- *(deps)* Update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.23.0
- *(deps)* Update golang docker tag to v1.25.2
- *(deps)* Update golang docker tag to v1.25.3
## [0.6.5] - 2025-09-18
### 🐛 Bug Fixes
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.226
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.79
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.80
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.19.3
### ⚙️ Miscellaneous Tasks
- *(deps)* Update pre-commit hook lietu/go-pre-commit to v1
- *(deps)* Update goreleaser/goreleaser docker tag to v2.12.1
- *(deps)* Update goreleaser/goreleaser docker tag to v2.12.2
## [0.6.4] - 2025-09-11
### 🐛 Bug Fixes
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/amqp to v1.9.0
## [0.6.3] - 2025-09-09
### 🐛 Bug Fixes
- *(deps)* Update module github.com/stretchr/testify to v1.11.0
- *(deps)* Update module github.com/pressly/goose/v3 to v3.25.0
- *(deps)* Update module github.com/stretchr/testify to v1.11.1
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.222
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.223
- *(deps)* Update opentelemetry-go monorepo
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.224
- *(deps)* Update module go.opentelemetry.io/contrib/bridges/otelslog to v0.13.0
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.225
### ⚙️ Miscellaneous Tasks
- *(deps)* Update golang:1.25.0 docker digest to f6b9e1a
- *(deps)* Update goreleaser/goreleaser docker tag to v2.12.0
- *(deps)* Update golang docker tag to v1.25.1
- *(deps)* Update golang:1.25.1 docker digest to 53f7808
## [0.6.2] - 2025-08-22
### ⚙️ Miscellaneous Tasks
- Remove conflicts entry from homebrew-taps config
## [0.6.1] - 2025-08-22
### 🐛 Bug Fixes
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.195
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.196
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.197
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.198
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.199
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.200
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.202
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.203
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.204
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.207
- *(deps)* Update module github.com/golang-jwt/jwt/v5 to v5.2.3
- *(deps)* Update module github.com/alecthomas/kong to v1.12.1
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.208
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.210
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.78
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.212
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.213
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.215
- *(deps)* Update module github.com/golang-jwt/jwt/v5 to v5.3.0
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.216
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.217
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.218
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.219
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.220
- *(deps)* Update module github.com/sparetimecoders/goamqp to v0.3.3
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.221
### ⚙️ Miscellaneous Tasks
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2.2.1
- *(deps)* Update golang:1.24.4 docker digest to 9f820b6
- *(deps)* Update golang docker tag to v1.24.5
- *(deps)* Update goreleaser/goreleaser docker tag to v2.11.0
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2.2.2
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.28.0
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2.3.0
- *(deps)* Update golang:1.24.5 docker digest to 0a156a4
- *(deps)* Update goreleaser/goreleaser docker tag to v2.11.1
- *(deps)* Update goreleaser/goreleaser docker tag to v2.11.2
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2.3.1
- *(deps)* Update golang docker tag to v1.24.6
- *(deps)* Update pre-commit hook pre-commit/pre-commit-hooks to v6
- *(deps)* Update golang:1.24.6 docker digest to 958bfd1
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2.4.0
- *(deps)* Update golang:1.24.6 docker digest to cd8f653
- *(deps)* Update golang docker tag to v1.25.0
## [0.6.0] - 2025-06-29
### 🚀 Features
- *(k8s)* Add OpenTelemetry exporter endpoint to deploy.yaml
- Add build version injection via CI_COMMIT argument
### 🐛 Bug Fixes
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.190
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.28
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.75
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.192
- *(deps)* Update module github.com/alecthomas/kong to v1.12.0
- *(deps)* Update opentelemetry-go monorepo
- *(deps)* Update module go.opentelemetry.io/contrib/bridges/otelslog to v0.12.0
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.29
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.194
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.30
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.76
### ⚙️ Miscellaneous Tasks
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2.2.0
## [0.5.3] - 2025-06-13
### 🐛 Bug Fixes
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.187
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.188
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.189
### 🚜 Refactor
- Remove Sentry integration and replace with OpenTelemetry
### ⚙️ Miscellaneous Tasks
- *(deps)* Update golang:1.24.4 docker digest to 3494bbe
## [0.5.2] - 2025-06-09
### 🐛 Bug Fixes
- *(goreleaser)* Specify binary name in configuration
## [0.5.1] - 2025-06-09
### 🐛 Bug Fixes
- *(deps)* Update module github.com/alecthomas/kong to v1.11.0
- *(deps)* Update module github.com/getsentry/sentry-go to v0.33.0
- *(deps)* Update module github.com/khan/genqlient to v0.8.1
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.179
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.180
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.181
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.182
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.183
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.74
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.184
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.185
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.186
### ⚙️ Miscellaneous Tasks
- *(deps)* Update golang:1.24.3 docker digest to f255a7d
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.27.0
- *(deps)* Update golang docker tag to v1.24.4
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.27.1
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.27.2
- *(deps)* Update goreleaser/goreleaser docker tag to v2.10.2
## [0.5.0] - 2025-05-15
### 🚀 Features
- *(k8s)* Add PodDisruptionBudget for schemas service
### 🐛 Bug Fixes
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.26
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.173
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.174
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.175
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.176
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.73
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.177
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.178
- *(deps)* Update module github.com/pressly/goose/v3 to v3.24.3
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.27
- *(k8s)* Update apiVersion for external secrets
### ⚙️ Miscellaneous Tasks
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2.1.4
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2.1.5
- *(deps)* Update golang:1.24.2 docker digest to bf7899c
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.25.0
- *(deps)* Update goreleaser/goreleaser docker tag to v2.9.0
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.25.1
- *(ci)* Update GitLab CI configuration for templates
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2.1.6
- *(deps)* Update golang docker tag to v1.24.3
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.26.0
## [0.4.1] - 2025-04-24
### 🐛 Bug Fixes
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.25
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.170
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.71
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.72
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.171
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.172
### ⚙️ Miscellaneous Tasks
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2.1.1
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2.1.2
## [0.4.0] - 2025-04-12
### 🚀 Features
- *(service)* Implement graceful shutdown for HTTP server
### 🐛 Bug Fixes
- *(secrets)* Remove namespace from ExternalSecret definition
- *(deps)* Update module github.com/sparetimecoders/goamqp to v0.3.2
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.24
- *(deps)* Update module github.com/getsentry/sentry-go to v0.32.0
- *(k8s)* Increase CPU request for better performance
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/amqp to v1.8.1
### 🚜 Refactor
- *(deploy)* Remove cpu and memory limits for schemas
### ⚙️ Miscellaneous Tasks
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.24.3
## [0.3.0] - 2025-04-08
### 🚀 Features
- *(k8s)* Add RabbitMQ configurations and update secrets
### 🐛 Bug Fixes
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.161
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.162
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.163
- *(deps)* Update module github.com/auth0/go-jwt-middleware/v2 to v2.3.0
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.18.0
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.18.1
- *(deps)* Update module github.com/alecthomas/kong to v1.9.0
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.164
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.165
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.68
- *(deps)* Update module github.com/golang-jwt/jwt/v5 to v5.2.2
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.166
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.19.0
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.69
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.70
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.167
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.19.1
- *(deps)* Update module github.com/pressly/goose/v3 to v3.24.2
- *(deps)* Update module github.com/alecthomas/kong to v1.10.0
- *(deps)* Update eventsourced
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.168
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.169
### ⚙️ Miscellaneous Tasks
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.64.6
- *(deps)* Update golang docker tag to v1.24.1
- *(deps)* Update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.22.0
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.64.7
- *(deps)* Update goreleaser/goreleaser docker tag to v2.8.0
- *(deps)* Update goreleaser/goreleaser docker tag to v2.8.1
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.64.8
- *(deps)* Update golang:1.24.1 docker digest to 5ecf333
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.24.2
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2.0.1
- *(deps)* Update pre-commit hook golangci/golangci-lint to v2.0.2
- *(deps)* Update goreleaser/goreleaser docker tag to v2.8.2
- *(deps)* Update golang docker tag to v1.24.2
- *(deps)* Update golang:1.24.2 docker digest to aebb7df
## [0.2.0] - 2025-02-28
### 🚀 Features
- *(dependencies)* Add Eventsourced package group for updates
- *(sdlmerge)* Add shared types for GraphQL schema handling
### 🐛 Bug Fixes
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.64
- *(deps)* Update module github.com/alecthomas/kong to v1.7.0
- *(deps)* Update module github.com/khan/genqlient to v0.8.0
- *(deps)* Update module github.com/alecthomas/kong to v1.8.0
- *(ci)* Update golang image to improve compatibility
- *(ci)* Add resource group to production deployment configuration
- *(deps)* Update module github.com/alecthomas/kong to v1.8.1
- *(deps)* Update dependencies to latest versions
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.65
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.66
- *(deps)* Update eventsourced
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.23
### ⚙️ Miscellaneous Tasks
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.23.3
- *(deps)* Update golang:1.23.5 docker digest to e213430
- *(deps)* Update dependency go to v1.23.6
- *(deps)* Update golang docker tag to v1.23.6
- *(deps)* Update golang:1.23.6 docker digest to 958bd2e
- *(deps)* Update golang:1.23.6 docker digest to 9271129
- *(deps)* Update goreleaser/goreleaser docker tag to v2.7.0
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.64.2
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.64.3
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.64.4
- *(go)* Update go version to 1.23.6 and remove toolchain
- *(deps)* Update golang docker tag to v1.24.0
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.64.5
- *(deps)* Update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.21.0
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.24.0
- *(deps)* Update golang:1.24.0 docker digest
- *(deps)* Update golang:1.24.0 docker digest to a14c5a6
- *(deps)* Update golang:1.24.0 docker digest to 58cf31c
- *(docker)* Update base image architecture to amd64
## [0.1.1] - 2025-01-24
### 🐛 Bug Fixes
- *(deps)* Update module github.com/getsentry/sentry-go to v0.31.0
- *(deps)* Update module github.com/getsentry/sentry-go to v0.31.1
- *(deps)* Update module github.com/alecthomas/kong to v1.6.1
- *(deps)* Update module github.com/pressly/goose/v3 to v3.24.1
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.63
- *(k8s)* Standardize app label to app.kubernetes.io/name
### ⚙️ Miscellaneous Tasks
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.63.1
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.63.2
- *(deps)* Update goreleaser/goreleaser docker tag to v2.5.1
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.63.3
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.63.4
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.23.0
- *(deps)* Update golang:1.23.4 docker digest to 3b1a7de
- *(deps)* Update golang:1.23.4 docker digest to 08e1417
- *(deps)* Update golang:1.23.4 docker digest to 585103a
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.23.1
- *(deps)* Update golang:1.23.4 docker digest to 5305905
- *(deps)* Update golang:1.23.4 docker digest to 9820aca
- *(deps)* Update dependency go to v1.23.5
- *(deps)* Update golang docker tag to v1.23.5
- *(deps)* Update goreleaser/goreleaser docker tag to v2.6.0
- *(deps)* Update golang:1.23.5 docker digest to 8c10f21
- *(deps)* Update goreleaser/goreleaser docker tag to v2.6.1
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.23.2
## [0.1.0] - 2025-01-01
### 🚀 Features
@@ -42,8 +468,47 @@ All notable changes to this project will be documented in this file.
### ⚙️ Miscellaneous Tasks
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.21.2
- *(deps)* Update goreleaser/goreleaser docker tag to v2.4.1
- *(deps)* Pin dependencies
- *(deps)* Pin dependencies
- *(deps)* Update goreleaser/goreleaser docker tag to v2.4.2
- *(deps)* Update goreleaser/goreleaser docker tag to v2.4.4
- *(deps)* Update dependency go to v1.23.3
- *(deps)* Update golang docker tag to v1.23.3
- *(deps)* Update unbound/pre-commit docker digest to 596abf5
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.62.0
- *(deps)* Update golang:1.23.3 docker digest to 8956c08
- *(deps)* Update unbound/pre-commit docker digest to e78425c
- *(deps)* Update golang:1.23.3 docker digest to 3694e36
- *(deps)* Update golang:1.23.3 docker digest to b2ca381
- *(deps)* Update golang:1.23.3 docker digest to 2660218
- *(deps)* Update golang:1.23.3 docker digest to c2d828f
- *(deps)* Update goreleaser/goreleaser docker tag to v2.4.5
- *(deps)* Update golang:1.23.3 docker digest to 73f06be
- *(deps)* Update goreleaser/goreleaser docker tag to v2.4.6
- *(deps)* Update goreleaser/goreleaser docker tag to v2.4.7
- *(deps)* Update goreleaser/goreleaser docker tag to v2.4.8
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.62.2
- *(deps)* Update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.19.0
- *(deps)* Update golang:1.23.3 docker digest to ee5f0ad
- *(deps)* Update golang:1.23.3 docker digest to b4aabba
- *(deps)* Update golang:1.23.3 docker digest to 2b01164
- *(deps)* Update golang:1.23.3 docker digest to 017ec6b
- *(deps)* Update dependency go to v1.23.4
- *(deps)* Update golang docker tag to v1.23.4
- *(deps)* Update golang:1.23.4 docker digest to 574185e
- Remove unnecessary Docker variables from configuration
- *(ci)* Remove unused docker service from buildtools
- *(deps)* Update golang:1.23.4 docker digest to 7003184
- *(deps)* Update goreleaser/goreleaser docker tag to v2.5.0
- *(deps)* Update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.20.0
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.21.3
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.21.4
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.22.0
- *(deps)* Update golang:1.23.4 docker digest to 7ea4c9d
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.22.1
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.63.0
## [0.0.7] - 2024-10-22
@@ -88,9 +553,49 @@ All notable changes to this project will be documented in this file.
### ⚙️ Miscellaneous Tasks
- *(deps)* Update pre-commit hook pre-commit/pre-commit-hooks to v4.6.0
- *(deps)* Update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.15.0
- *(deps)* Update dependency go to v1.22.2
- *(deps)* Update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.16.0
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.58.0
- *(deps)* Update dependency go to v1.22.3
- *(deps)* Update golang docker tag to v1.22.3
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.58.1
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.58.2
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.59.0
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.18.3
- *(deps)* Update dependency go to v1.22.4
- *(deps)* Update golang docker tag to v1.22.4
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.59.1
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.18.4
- *(deps)* Update dependency go to v1.22.5
- *(deps)* Update golang docker tag to v1.22.5
- *(deps)* Update dependency go to v1.22.6
- *(deps)* Update golang docker tag to v1.22.6
- *(deps)* Update dependency go to v1.23.0
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.60.1
- *(deps)* Update golang docker tag to v1.23.0
- Update golangci-lint hook identifier in pre-commit config
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.60.2
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.60.3
- *(deps)* Update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.17.0
- *(deps)* Update dependency go to v1.23.1
- *(deps)* Update golang docker tag to v1.23.1
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.61.0
- *(deps)* Update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.18.0
- Update goreleaser image to v2.3.1
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.19.1
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.19.2
- Add generate check
- *(deps)* Update goreleaser/goreleaser docker tag to v2.3.2
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.19.3
- *(deps)* Update dependency go to v1.23.2
- *(deps)* Update golang docker tag to v1.23.2
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.20.0
- *(deps)* Update pre-commit hook pre-commit/pre-commit-hooks to v5
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.20.1
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.21.0
- *(deps)* Update pre-commit hook gitleaks/gitleaks to v8.21.1
- Add release notes for goreleaser command in .gitlab-ci.yml
## [0.0.6] - 2024-04-04
@@ -102,6 +607,7 @@ All notable changes to this project will be documented in this file.
### ⚙️ Miscellaneous Tasks
- Add step for checking release
- *(deps)* Update golang docker tag to v1.22.2
## [0.0.5] - 2024-04-03
@@ -126,15 +632,106 @@ All notable changes to this project will be documented in this file.
### ⚙️ Miscellaneous Tasks
- *(deps)* Bump github.com/stretchr/testify from 1.8.3 to 1.8.4
- Update golangci-lint
- *(deps)* Bump golang from 1.20.4 to 1.20.5
- Update Go version for vulnerabilities
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.31 to 0.17.32
- *(deps)* Bump github.com/wundergraph/graphql-go-tools
- *(deps)* Bump github.com/vektah/gqlparser/v2
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.32 to 0.17.33
- *(deps)* Bump github.com/getsentry/sentry-go from 0.21.0 to 0.22.0
- *(deps)* Bump github.com/alecthomas/kong from 0.7.1 to 0.8.0
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.33 to 0.17.34
- *(deps)* Bump github.com/vektah/gqlparser/v2 from 2.5.3 to 2.5.5
- *(deps)* Bump github.com/vektah/gqlparser/v2 from 2.5.5 to 2.5.6
- *(deps)* Bump github.com/pressly/goose/v3 from 3.11.2 to 3.13.0
- *(deps)* Bump github.com/sparetimecoders/goamqp from 0.1.4 to 0.1.5
- *(deps)* Bump github.com/pressly/goose/v3 from 3.13.0 to 3.13.1
- *(deps)* Bump github.com/pressly/goose/v3 from 3.13.1 to 3.13.4
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/pg
- *(deps)* Bump github.com/wundergraph/graphql-go-tools
- *(deps)* Bump golang from 1.20.5 to 1.20.6
- *(deps)* Bump github.com/vektah/gqlparser/v2 from 2.5.6 to 2.5.7
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.34 to 0.17.35
- *(deps)* Bump github.com/vektah/gqlparser/v2 from 2.5.7 to 2.5.8
- *(deps)* Bump github.com/wundergraph/graphql-go-tools
- *(deps)* Bump github.com/pressly/goose/v3 from 3.13.4 to 3.14.0
- *(deps)* Bump github.com/wundergraph/graphql-go-tools
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.35 to 0.17.36
- *(deps)* Bump github.com/wundergraph/graphql-go-tools
- *(deps)* Bump github.com/getsentry/sentry-go from 0.22.0 to 0.23.0
- *(deps)* Bump golang from 1.20.6 to 1.20.7
- Update to Go 1.20.7
- *(deps)* Bump github.com/wundergraph/graphql-go-tools
- *(deps)* Bump github.com/wundergraph/graphql-go-tools
- *(deps)* Bump golang from 1.20.7 to 1.21.0
- *(deps)* Bump github.com/pressly/goose/v3 from 3.14.0 to 3.15.0
- *(deps)* Bump github.com/wundergraph/graphql-go-tools
- Update to Golang 1.21.0 for vulnerabilities
- Update pre-commit versions
- *(deps)* Bump github.com/getsentry/sentry-go from 0.23.0 to 0.24.0
- *(deps)* Bump github.com/rs/cors from 1.9.0 to 1.10.0
- *(deps)* Bump golang from 1.21.0 to 1.21.1
- Update to Go 1.21.1 for vulnerabilities
- *(deps)* Bump github.com/vektah/gqlparser/v2 from 2.5.8 to 2.5.9
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.36 to 0.17.37
- *(deps)* Bump github.com/getsentry/sentry-go from 0.24.0 to 0.24.1
- *(deps)* Bump github.com/vektah/gqlparser/v2 from 2.5.9 to 2.5.10
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.37 to 0.17.38
- *(deps)* Bump github.com/wundergraph/graphql-go-tools
- *(deps)* Bump github.com/rs/cors from 1.10.0 to 1.10.1
- *(deps)* Bump github.com/getsentry/sentry-go from 0.24.1 to 0.25.0
- *(deps)* Bump github.com/sparetimecoders/goamqp from 0.1.5 to 0.2.0
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.38 to 0.17.39
- *(deps)* Bump golang from 1.21.1 to 1.21.2
- *(deps)* Bump github.com/pressly/goose/v3 from 3.15.0 to 3.15.1
- *(deps)* Bump golang from 1.21.2 to 1.21.3
- *(deps)* Bump github.com/alecthomas/kong from 0.8.0 to 0.8.1
- *(deps)* Bump github.com/wundergraph/graphql-go-tools
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.39 to 0.17.40
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/eventsourced
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/pg
- *(deps)* Bump golang from 1.21.3 to 1.21.4
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/pg
- *(deps)* Bump github.com/pressly/goose/v3 from 3.15.1 to 3.16.0
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/pg
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/pg
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.40 to 0.17.41
- *(deps)* Bump github.com/auth0/go-jwt-middleware/v2
- *(deps)* Bump golang from 1.21.4 to 1.21.5
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/pg
- *(deps)* Bump github.com/pressly/goose/v3 from 3.16.0 to 3.17.0
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/pg
- *(deps)* Bump github.com/sparetimecoders/goamqp from 0.2.0 to 0.2.1
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.41 to 0.17.42
- *(deps)* Bump golang from 1.21.5 to 1.21.6
- *(deps)* Bump github.com/getsentry/sentry-go from 0.25.0 to 0.26.0
- *(deps)* Bump github.com/sparetimecoders/goamqp from 0.2.1 to 0.3.0
- *(deps)* Bump github.com/vektah/gqlparser/v2 from 2.5.10 to 2.5.11
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.42 to 0.17.43
- *(deps)* Bump github.com/auth0/go-jwt-middleware/v2
- *(deps)* Bump github.com/wundergraph/graphql-go-tools
- *(deps)* Bump github.com/pressly/goose/v3 from 3.17.0 to 3.18.0
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/eventsourced
- *(deps)* Bump golang from 1.21.6 to 1.22.0
- *(deps)* Bump github.com/getsentry/sentry-go from 0.26.0 to 0.27.0
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.43 to 0.17.44
- *(deps)* Update pre-commit hook devopshq/gitlab-ci-linter to v1.0.6
- *(deps)* Update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.11.0
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.56.2
- *(deps)* Update pre-commit hook lietu/go-pre-commit to v0.1.0
- *(deps)* Update pre-commit hook pre-commit/pre-commit-hooks to v4.5.0
- *(deps)* Update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.12.0
- *(deps)* Update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.13.0
- Use OrbStack for local dev
- *(deps)* Update golang docker tag to v1.22.1
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.57.0
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.57.1
- Add gitleaks to pre-commit setup
- Update resources
- *(deps)* Update pre-commit hook golangci/golangci-lint to v1.57.2
- *(deps)* Update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.14.0
- Run release on medium instance
- Back to small and upgrade goreleaser
- Remove deprecated replacements
@@ -147,8 +744,18 @@ All notable changes to this project will be documented in this file.
### ⚙️ Miscellaneous Tasks
- *(deps)* Bump golang from 1.20.3 to 1.20.4
- *(deps)* Bump github.com/pressly/goose/v3 from 3.10.0 to 3.11.0
- Update Go version for vulnerabilities
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.30 to 0.17.31
- *(deps)* Bump github.com/Khan/genqlient from 0.5.0 to 0.6.0
- *(deps)* Bump github.com/getsentry/sentry-go from 0.20.0 to 0.21.0
- *(deps)* Bump github.com/pressly/goose/v3 from 3.11.0 to 3.11.2
- *(deps)* Bump github.com/wundergraph/graphql-go-tools
- *(deps)* Bump github.com/sparetimecoders/goamqp from 0.1.3 to 0.1.4
- *(deps)* Bump github.com/wundergraph/graphql-go-tools
- Update pre-commit and fix golangci-lint
- *(deps)* Bump github.com/stretchr/testify from 1.8.2 to 1.8.3
- Actually validate API key privileges and refs
## [0.0.3] - 2023-04-27
@@ -167,19 +774,52 @@ All notable changes to this project will be documented in this file.
- Update schema if URLs have changed
- Add pre-commit and remove those checks from Dockerfile
- *(deps)* Bump github.com/alecthomas/kong from 0.6.1 to 0.7.1
- *(deps)* Bump github.com/stretchr/testify from 1.8.0 to 1.8.1
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.20 to 0.17.22
- *(deps)* Bump github.com/getsentry/sentry-go from 0.14.0 to 0.16.0
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/eventsourced
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/amqp
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/pg
- Add context and error handling
- *(deps)* Bump github.com/rs/cors from 1.8.2 to 1.8.3
- Move to default ingress group
- Decrease trace sample rate
- Improve docker caching
- *(deps)* Bump golang from 1.19.4 to 1.19.5
- *(deps)* Bump github.com/getsentry/sentry-go from 0.16.0 to 0.17.0
- Add local module to pre-commit config
- Only ignore generated files with do not edit
- Default ingress group
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/eventsourced
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/eventsourced
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.22 to 0.17.24
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/eventsourced
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/pg
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/pg
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/eventsourced
- *(deps)* Bump golang from 1.19.5 to 1.20.0
- Use Docker DinD version from variable
- *(deps)* Bump github.com/getsentry/sentry-go from 0.17.0 to 0.18.0
- Switch to manual rebases for Dependabot
- *(deps)* Bump golang from 1.20.0 to 1.20.1
- Update to golang 1.20.1
- *(deps)* Bump github.com/stretchr/testify from 1.8.1 to 1.8.2
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.24 to 0.17.25
- *(deps)* Bump github.com/getsentry/sentry-go from 0.18.0 to 0.19.0
- *(deps)* Bump golang from 1.20.1 to 1.20.2
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.25 to 0.17.26
- Update Go verion for vulnerabilities scan
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.26 to 0.17.27
- Reduce sample rate
- *(deps)* Bump github.com/getsentry/sentry-go from 0.19.0 to 0.20.0
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.27 to 0.17.28
- *(deps)* Bump golang from 1.20.2 to 1.20.3
- Update to Go 1.20.3
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.28 to 0.17.29
- *(deps)* Bump github.com/rs/cors from 1.8.3 to 1.9.0
- *(deps)* Bump gitlab.com/unboundsoftware/eventsourced/pg
- *(deps)* Bump github.com/99designs/gqlgen from 0.17.29 to 0.17.30
- Fix Gitlab CI lint
## [0.0.2] - 2022-10-14
+3 -2
View File
@@ -1,9 +1,10 @@
FROM golang:1.23.4@sha256:7ea4c9dcb2b97ff8ee80a67db3d44f98c8ffa0d191399197007d8459c1453041 as modules
FROM amd64/golang:1.25.4@sha256:efe81fa41fdf81fb873ab7cd931b9bb29bd10aced6c252cbd91739c34e654f01 as modules
WORKDIR /build
ADD go.* /build
RUN go mod download
FROM modules as build
ARG CI_COMMIT
WORKDIR /build
ENV CGO_ENABLED=0
ADD . /build
@@ -17,7 +18,7 @@ RUN GOOS=linux GOARCH=amd64 go build \
-a -installsuffix cgo \
-mod=readonly \
-o /release/service \
-ldflags '-w -s' \
-ldflags "-w -s -X main.buildVersion=${CI_COMMIT}" \
./cmd/service/service.go
FROM scratch as export
+4 -4
View File
@@ -2,9 +2,9 @@ package cache
import (
"fmt"
"log/slog"
"time"
"github.com/apex/log"
"github.com/sparetimecoders/goamqp"
"gitlab.com/unboundsoftware/schemas/domain"
@@ -18,7 +18,7 @@ type Cache struct {
services map[string]map[string]map[string]struct{}
subGraphs map[string]string
lastUpdate map[string]string
logger log.Interface
logger *slog.Logger
}
func (c *Cache) OrganizationByAPIKey(apiKey string) *domain.Organization {
@@ -98,7 +98,7 @@ func (c *Cache) Update(msg any, _ goamqp.Headers) (any, error) {
case *domain.SubGraph:
c.updateSubGraph(m.OrganizationId, m.Ref, m.ID.String(), m.Service, m.ChangedAt)
default:
c.logger.Warnf("unexpected message received: %+v", msg)
c.logger.With("msg", msg).Warn("unexpected message received")
}
return nil, nil
}
@@ -124,7 +124,7 @@ func (c *Cache) addUser(sub string, organization domain.Organization) {
}
}
func New(logger log.Interface) *Cache {
func New(logger *slog.Logger) *Cache {
return &Cache{
organizations: make(map[string]domain.Organization),
users: make(map[string][]string),
+80
View File
@@ -0,0 +1,80 @@
# git-cliff ~ default configuration file
# https://git-cliff.org/docs/configuration
#
# Lines starting with "#" are comments.
# Configuration options are organized into tables and keys.
# See documentation for more information on available options.
[changelog]
# template for the changelog header
header = """
# Changelog\n
All notable changes to this project will be documented in this file.\n
"""
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
### {{ group | striptags | trim | upper_first }}
{% for commit in commits %}
- {% if commit.scope %}*({{ commit.scope }})* {% endif %}\
{% if commit.breaking %}[**breaking**] {% endif %}\
{{ commit.message | upper_first }}\
{% endfor %}
{% endfor %}\n
"""
# template for the changelog footer
footer = """
<!-- generated by git-cliff -->
"""
# remove the leading and trailing s
trim = true
# postprocessors
postprocessors = [
# { pattern = '<REPO>', replace = "https://github.com/orhun/git-cliff" }, # replace repository URL
]
# render body even when there are no releases to process
# render_always = true
# output file path
# output = "test.md"
[git]
# parse the commits based on https://www.conventionalcommits.org
conventional_commits = true
# filter out the commits that are not conventional
filter_unconventional = true
# process each line of a commit as an individual commit
split_commits = false
# regex for preprocessing the commit messages
commit_preprocessors = [
# Replace issue numbers
#{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](<REPO>/issues/${2}))"},
# Check spelling of the commit with https://github.com/crate-ci/typos
# If the spelling is incorrect, it will be automatically fixed.
#{ pattern = '.*', replace_command = 'typos --write-changes -' },
]
# regex for parsing and grouping commits
commit_parsers = [
{ message = "^feat", group = "<!-- 0 -->🚀 Features" },
{ message = "^fix", group = "<!-- 1 -->🐛 Bug Fixes" },
{ message = "^doc", group = "<!-- 3 -->📚 Documentation" },
{ message = "^perf", group = "<!-- 4 -->⚡ Performance" },
{ message = "^refactor", group = "<!-- 2 -->🚜 Refactor" },
{ message = "^style", group = "<!-- 5 -->🎨 Styling" },
{ message = "^test", group = "<!-- 6 -->🧪 Testing" },
{ message = "^chore\\(release\\): prepare for", skip = true },
{ message = "^chore|^ci", group = "<!-- 7 -->⚙️ Miscellaneous Tasks" },
{ body = ".*security", group = "<!-- 8 -->🛡️ Security" },
{ message = "^revert", group = "<!-- 9 -->◀️ Revert" },
]
# filter out the commits that are not matched by commit parsers
filter_commits = false
# sort the tags topologically
topo_order = false
# sort the commits inside sections by oldest/newest order
sort_commits = "oldest"
+30 -62
View File
@@ -2,7 +2,9 @@ package main
import (
"context"
"errors"
"fmt"
"log/slog"
"net/http"
"os"
"os/signal"
@@ -17,10 +19,6 @@ import (
"github.com/99designs/gqlgen/graphql/handler/transport"
"github.com/99designs/gqlgen/graphql/playground"
"github.com/alecthomas/kong"
"github.com/apex/log"
"github.com/apex/log/handlers/json"
"github.com/getsentry/sentry-go"
sentryhttp "github.com/getsentry/sentry-go/http"
"github.com/rs/cors"
"github.com/sparetimecoders/goamqp"
"github.com/vektah/gqlparser/v2/ast"
@@ -32,7 +30,9 @@ import (
"gitlab.com/unboundsoftware/schemas/domain"
"gitlab.com/unboundsoftware/schemas/graph"
"gitlab.com/unboundsoftware/schemas/graph/generated"
"gitlab.com/unboundsoftware/schemas/logging"
"gitlab.com/unboundsoftware/schemas/middleware"
"gitlab.com/unboundsoftware/schemas/monitoring"
"gitlab.com/unboundsoftware/schemas/store"
)
@@ -40,16 +40,12 @@ type CLI struct {
AmqpURL string `name:"amqp-url" env:"AMQP_URL" help:"URL to use to connect to RabbitMQ" default:"amqp://user:password@unbound-control-plane.orb.local:5672/"`
Port int `name:"port" env:"PORT" help:"Listen-port for GraphQL API" default:"8080"`
LogLevel string `name:"log-level" env:"LOG_LEVEL" help:"The level of logging to use (debug, info, warn, error, fatal)" default:"info"`
LogFormat string `name:"log-format" env:"LOG_FORMAT" help:"The format of logs" default:"text" enum:"otel,json,text"`
DatabaseURL string `name:"postgres-url" env:"POSTGRES_URL" help:"URL to use to connect to Postgres" default:"postgres://postgres:postgres@unbound-control-plane.orb.local:5432/schemas?sslmode=disable"`
DatabaseDriverName string `name:"db-driver" env:"DB_DRIVER" help:"Driver to use to connect to db" default:"postgres"`
Issuer string `name:"issuer" env:"ISSUER" help:"The JWT token issuer to use" default:"unbound.eu.auth0.com"`
StrictSSL bool `name:"strict-ssl" env:"STRICT_SSL" help:"Should strict SSL handling be enabled" default:"true"`
SentryConfig
}
type SentryConfig struct {
DSN string `name:"sentry-dsn" env:"SENTRY_DSN" help:"Sentry dsn" default:""`
Environment string `name:"sentry-environment" env:"SENTRY_ENVIRONMENT" help:"Sentry environment" default:"development"`
Environment string `name:"environment" env:"ENVIRONMENT" help:"The environment we are running in" default:"development" enum:"development,staging,production"`
}
var buildVersion = "none"
@@ -59,9 +55,7 @@ const serviceName = "schemas"
func main() {
var cli CLI
_ = kong.Parse(&cli)
log.SetHandler(json.New(os.Stdout))
log.SetLevelFromString(cli.LogLevel)
logger := log.WithField("service", serviceName)
logger := logging.SetupLogger(cli.LogLevel, cli.LogFormat, serviceName, buildVersion)
closeEvents := make(chan error)
if err := start(
@@ -70,19 +64,22 @@ func main() {
ConnectAMQP,
cli,
); err != nil {
logger.WithError(err).Error("process error")
logger.With("error", err).Error("process error")
}
}
func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url string) (Connection, error), cli CLI) error {
if err := setupSentry(logger, cli.SentryConfig); err != nil {
return err
}
defer sentry.Flush(2 * time.Second)
func start(closeEvents chan error, logger *slog.Logger, connectToAmqpFunc func(url string) (Connection, error), cli CLI) error {
rootCtx, rootCancel := context.WithCancel(context.Background())
defer rootCancel()
shutdownFn, err := monitoring.SetupOTelSDK(rootCtx, cli.LogFormat == "otel", serviceName, buildVersion, cli.Environment)
if err != nil {
return err
}
defer func() {
_ = errors.Join(shutdownFn(context.Background()))
}()
db, err := store.SetupDB(cli.DatabaseDriverName, cli.DatabaseURL)
if err != nil {
return fmt.Errorf("failed to setup DB: %v", err)
@@ -123,7 +120,7 @@ func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url
return fmt.Errorf("caching subgraphs: %w", err)
}
setups := []goamqp.Setup{
goamqp.UseLogger(logger.Error),
goamqp.UseLogger(func(s string) { logger.Error(s) }),
goamqp.CloseListener(closeEvents),
goamqp.WithPrefetchLimit(20),
goamqp.EventStreamPublisher(publisher),
@@ -169,7 +166,7 @@ func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url
defer wg.Done()
err := <-closeEvents
if err != nil {
logger.WithError(err).Error("received close from AMQP")
logger.With("error", err).Error("received close from AMQP")
rootCancel()
}
}()
@@ -179,8 +176,11 @@ func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url
defer wg.Done()
<-rootCtx.Done()
if err := httpSrv.Close(); err != nil {
logger.WithError(err).Error("close http server")
shutdownCtx, shutdownRelease := context.WithTimeout(context.Background(), 10*time.Second)
defer shutdownRelease()
if err := httpSrv.Shutdown(shutdownCtx); err != nil {
logger.With("error", err).Error("close http server")
}
close(sigint)
close(closeEvents)
@@ -195,6 +195,7 @@ func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url
Publisher: eventPublisher,
Logger: logger,
Cache: serviceCache,
PubSub: graph.NewPubSub(),
}
config := generated.Config{
@@ -222,11 +223,10 @@ func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url
Cache: lru.New[string](100),
})
sentryHandler := sentryhttp.New(sentryhttp.Options{Repanic: true})
mux.Handle("/", sentryHandler.HandleFunc(playground.Handler("GraphQL playground", "/query")))
mux.Handle("/", monitoring.Handler(playground.Handler("GraphQL playground", "/query")))
mux.Handle("/health", http.HandlerFunc(healthFunc))
mux.Handle("/query", cors.AllowAll().Handler(
sentryHandler.Handle(
monitoring.Handler(
mw.Middleware().CheckJWT(
apiKeyMiddleware.Handler(
authMiddleware.Handler(srv),
@@ -235,10 +235,10 @@ func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url
),
))
logger.Infof("connect to http://localhost:%d/ for GraphQL playground", cli.Port)
logger.Info(fmt.Sprintf("connect to http://localhost:%d/ for GraphQL playground", cli.Port))
if err := httpSrv.ListenAndServe(); err != nil {
logger.WithError(err).Error("listen http")
if err := httpSrv.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) {
logger.With("error", err).Error("listen http")
}
}()
@@ -287,38 +287,6 @@ func healthFunc(w http.ResponseWriter, _ *http.Request) {
_, _ = w.Write([]byte("OK"))
}
func setupSentry(logger log.Interface, args SentryConfig) error {
if args.Environment == "" {
return fmt.Errorf("no Sentry environment supplied, exiting")
}
cfg := sentry.ClientOptions{
Dsn: args.DSN,
Environment: args.Environment,
Release: fmt.Sprintf("%s-%s", serviceName, buildVersion),
}
switch args.Environment {
case "development":
cfg.Debug = true
cfg.EnableTracing = false
cfg.TracesSampleRate = 0.0
case "production":
if args.DSN == "" {
return fmt.Errorf("no DSN supplied for non-dev environment, exiting")
}
cfg.Debug = false
cfg.EnableTracing = true
cfg.TracesSampleRate = 0.01
default:
return fmt.Errorf("illegal environment %s", args.Environment)
}
if err := sentry.Init(cfg); err != nil {
return fmt.Errorf("sentry setup: %w", err)
}
logger.Infof("configured Sentry for env: %s", args.Environment)
return nil
}
func ConnectAMQP(url string) (Connection, error) {
return goamqp.NewFromURL(serviceName, url)
}
+47 -32
View File
@@ -1,61 +1,76 @@
module gitlab.com/unboundsoftware/schemas
go 1.22.5
toolchain go1.23.4
go 1.25
require (
github.com/99designs/gqlgen v0.17.62
github.com/Khan/genqlient v0.7.0
github.com/alecthomas/kong v1.6.0
github.com/99designs/gqlgen v0.17.83
github.com/Khan/genqlient v0.8.1
github.com/alecthomas/kong v1.13.0
github.com/apex/log v1.9.0
github.com/auth0/go-jwt-middleware/v2 v2.2.2
github.com/getsentry/sentry-go v0.30.0
github.com/golang-jwt/jwt/v5 v5.2.1
github.com/auth0/go-jwt-middleware/v2 v2.3.0
github.com/golang-jwt/jwt/v5 v5.3.0
github.com/jmoiron/sqlx v1.4.0
github.com/pkg/errors v0.9.1
github.com/pressly/goose/v3 v3.24.0
github.com/pressly/goose/v3 v3.26.0
github.com/rs/cors v1.11.1
github.com/sparetimecoders/goamqp v0.3.1
github.com/stretchr/testify v1.10.0
github.com/vektah/gqlparser/v2 v2.5.21
github.com/wundergraph/graphql-go-tools v1.67.4
gitlab.com/unboundsoftware/eventsourced/amqp v1.7.0
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.16.0
gitlab.com/unboundsoftware/eventsourced/pg v1.15.0
github.com/sparetimecoders/goamqp v0.3.3
github.com/stretchr/testify v1.11.1
github.com/vektah/gqlparser/v2 v2.5.31
github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.238
gitlab.com/unboundsoftware/eventsourced/amqp v1.9.0
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.19.3
gitlab.com/unboundsoftware/eventsourced/pg v1.17.0
go.opentelemetry.io/contrib/bridges/otelslog v0.13.0
go.opentelemetry.io/otel v1.38.0
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0
go.opentelemetry.io/otel/log v0.14.0
go.opentelemetry.io/otel/sdk v1.38.0
go.opentelemetry.io/otel/sdk/log v0.14.0
go.opentelemetry.io/otel/sdk/metric v1.38.0
go.opentelemetry.io/otel/trace v1.38.0
)
require (
github.com/agnivade/levenshtein v1.2.0 // indirect
github.com/agnivade/levenshtein v1.2.1 // indirect
github.com/buger/jsonparser v1.1.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/websocket v1.5.1 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/jensneuse/byte-template v0.0.0-20200214152254-4f3cf06e5c68 // indirect
github.com/lib/pq v1.10.9 // indirect
github.com/mfridman/interpolate v0.0.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rabbitmq/amqp091-go v1.10.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect
github.com/sethvargo/go-retry v0.3.0 // indirect
github.com/sosodev/duration v1.3.1 // indirect
github.com/tidwall/gjson v1.17.0 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.1 // indirect
github.com/tidwall/sjson v1.2.5 // indirect
github.com/urfave/cli/v2 v2.27.5 // indirect
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
github.com/urfave/cli/v3 v3.6.0 // indirect
github.com/wundergraph/astjson v0.0.0-20250106123708-be463c97e083 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // indirect
go.opentelemetry.io/otel/metric v1.38.0 // indirect
go.opentelemetry.io/proto/otlp v1.7.1 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/mod v0.20.0 // indirect
golang.org/x/net v0.33.0 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/sys v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
golang.org/x/tools v0.24.0 // indirect
golang.org/x/mod v0.29.0 // indirect
golang.org/x/net v0.46.0 // indirect
golang.org/x/sync v0.17.0 // indirect
golang.org/x/sys v0.37.0 // indirect
golang.org/x/text v0.30.0 // indirect
golang.org/x/tools v0.38.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect
google.golang.org/grpc v1.75.0 // indirect
google.golang.org/protobuf v1.36.10 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
+129 -104
View File
@@ -1,25 +1,25 @@
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/99designs/gqlgen v0.17.62 h1:Wovt1+XJN9dTWYh92537Y9a5FuMVSkrQL4bn0a8v5Rg=
github.com/99designs/gqlgen v0.17.62/go.mod h1:sVCM2iwIZisJjTI/DEC3fpH+HFgxY1496ZJ+jbT9IjA=
github.com/99designs/gqlgen v0.17.83 h1:LZOd4Of2snK5V22/ZWfBAPa3WoAZkBO70dKXM0ODHQk=
github.com/99designs/gqlgen v0.17.83/go.mod h1:q6Lb64wknFqNFSbSUGzKRKupklvY/xgNr62g0GGWPB8=
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU=
github.com/Khan/genqlient v0.7.0 h1:GZ1meyRnzcDTK48EjqB8t3bcfYvHArCUUvgOwpz1D4w=
github.com/Khan/genqlient v0.7.0/go.mod h1:HNyy3wZvuYwmW3Y7mkoQLZsa/R5n5yIRajS1kPBvSFM=
github.com/PuerkitoBio/goquery v1.9.3 h1:mpJr/ikUA9/GNJB/DBZcGeFDXUtosHRyRrwh7KGdTG0=
github.com/PuerkitoBio/goquery v1.9.3/go.mod h1:1ndLHPdTz+DyQPICCWYlYQMPl0oXZj0G6D4LCYA6u4U=
github.com/agnivade/levenshtein v1.2.0 h1:U9L4IOT0Y3i0TIlUIDJ7rVUziKi/zPbrJGaFrtYH3SY=
github.com/agnivade/levenshtein v1.2.0/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU=
github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs=
github.com/Khan/genqlient v0.8.1/go.mod h1:R2G6DzjBvCbhjsEajfRjbWdVglSH/73kSivC9TLWVjU=
github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiUkhzPo=
github.com/PuerkitoBio/goquery v1.10.3/go.mod h1:tMUX0zDMHXYlAQk6p35XxQMqMweEKB7iK7iLNd4RH4Y=
github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM=
github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU=
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
github.com/alecthomas/kong v1.6.0 h1:mwOzbdMR7uv2vul9J0FU3GYxE7ls/iX1ieMg5WIM6gE=
github.com/alecthomas/kong v1.6.0/go.mod h1:p2vqieVMeTAnaC83txKtXe8FLke2X07aruPWXyMPQrU=
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/alecthomas/kong v1.13.0 h1:5e/7XC3ugvhP1DQBmTS+WuHtCbcv44hsohMgcvVxSrA=
github.com/alecthomas/kong v1.13.0/go.mod h1:wrlbXem1CWqUV5Vbmss5ISYhsVPkBb1Yo7YKJghju2I=
github.com/alecthomas/repr v0.5.2 h1:SU73FTI9D1P5UNtvseffFSGmdNci/O6RsqzeXJtP0Qs=
github.com/alecthomas/repr v0.5.2/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM=
github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA=
github.com/apex/log v1.9.0 h1:FHtw/xuaM8AgmvDDTI9fiwoAL25Sq2cxojnZICUU8l0=
github.com/apex/log v1.9.0/go.mod h1:m82fZlWIuiWzWP04XCTXmnX0xRkYYbCdYn8jbJeLBEA=
github.com/apex/logs v1.0.0/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo=
@@ -27,16 +27,16 @@ github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy
github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys=
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q=
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
github.com/auth0/go-jwt-middleware/v2 v2.2.2 h1:vrvkFZf72r3Qbt45KLjBG3/6Xq2r3NTixWKu2e8de9I=
github.com/auth0/go-jwt-middleware/v2 v2.2.2/go.mod h1:4vwxpVtu/Kl4c4HskT+gFLjq0dra8F1joxzamrje6J0=
github.com/auth0/go-jwt-middleware/v2 v2.3.0 h1:4QREj6cS3d8dS05bEm443jhnqQF97FX9sMBeWqnNRzE=
github.com/auth0/go-jwt-middleware/v2 v2.3.0/go.mod h1:dL4ObBs1/dj4/W4cYxd8rqAdDGXYyd5rqbpMIxcbVrU=
github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I=
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -44,39 +44,39 @@ github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7c
github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/evanphx/json-patch/v5 v5.1.0 h1:B0aXl1o/1cP8NbviYiBMkcHBtUjIJ1/Ccg6b+SwCLQg=
github.com/evanphx/json-patch/v5 v5.1.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/getsentry/sentry-go v0.30.0 h1:lWUwDnY7sKHaVIoZ9wYqRHJ5iEmoc0pqcRqFkosKzBo=
github.com/getsentry/sentry-go v0.30.0/go.mod h1:WU9B9/1/sHDqeV8T+3VwwbjeR5MSXs/6aqG3mqZrezA=
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=
github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/jensneuse/byte-template v0.0.0-20200214152254-4f3cf06e5c68 h1:E80wOd3IFQcoBxLkAUpUQ3BoGrZ4DxhQdP21+HH1s6A=
github.com/jensneuse/byte-template v0.0.0-20200214152254-4f3cf06e5c68/go.mod h1:0D5r/VSW6D/o65rKLL9xk7sZxL2+oku2HvFPYeIMFr4=
github.com/jensneuse/diffview v1.0.0 h1:4b6FQJ7y3295JUHU3tRko6euyEboL825ZsXeZZM47Z4=
github.com/jensneuse/diffview v1.0.0/go.mod h1:i6IacuD8LnEaPuiyzMHA+Wfz5mAuycMOf3R/orUY9y4=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
@@ -88,8 +88,9 @@ github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
@@ -107,32 +108,26 @@ github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdh
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pressly/goose/v3 v3.24.0 h1:sFbNms7Bd++2VMq6HSgDHDLWa7kHz1qXzPb3ZIU72VU=
github.com/pressly/goose/v3 v3.24.0/go.mod h1:rEWreU9uVtt0DHCyLzF9gRcWiiTF/V+528DV+4DORug=
github.com/pressly/goose/v3 v3.26.0 h1:KJakav68jdH0WDvoAcj8+n61WqOIaPGgH0bJWS6jpmM=
github.com/pressly/goose/v3 v3.26.0/go.mod h1:4hC1KrritdCxtuFsqgs1R4AU5bWtTAf+cnWvfhf2DNY=
github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw=
github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA=
github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo=
github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U=
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4=
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY=
github.com/sebdah/goldie/v2 v2.5.3 h1:9ES/mNN+HNUbNWpVAlrzuZ7jE+Nrczbj8uFRjM7624Y=
github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI=
github.com/sanity-io/litter v1.5.8 h1:uM/2lKrWdGbRXDrIq08Lh9XtVYoeGtcQxk9rtQ7+rYg=
github.com/sanity-io/litter v1.5.8/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U=
github.com/sebdah/goldie/v2 v2.7.1 h1:PkBHymaYdtvEkZV7TmyqKxdmn5/Vcj+8TpATWZjnG5E=
github.com/sebdah/goldie/v2 v2.7.1/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
@@ -143,19 +138,13 @@ github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h
github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs=
github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4=
github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg=
github.com/sparetimecoders/goamqp v0.3.1 h1:NCzdyAz84G679HlO+ivhyoI1aMgXEe3qfqpn4EChu1s=
github.com/sparetimecoders/goamqp v0.3.1/go.mod h1:PjkgrmsuMVgRbiQDTLs0pCWYrcQgqcUee38JjCDZdlk=
github.com/sparetimecoders/goamqp v0.3.3 h1:z/nfTPmrjeU/rIVuNOgsVLCimp3WFoNFvS3ZzXRJ6HE=
github.com/sparetimecoders/goamqp v0.3.3/go.mod h1:W9NRCpWLE+Vruv2dcRSbszNil2O826d2Nv6kAkETW5o=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=
github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
@@ -173,51 +162,93 @@ github.com/tj/go-buffer v1.1.0/go.mod h1:iyiJpfFcR2B9sXu7KvjbT9fpM4mOelRSDTbntVj
github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0=
github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao=
github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4=
github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w=
github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ=
github.com/vektah/gqlparser/v2 v2.5.21 h1:Zw1rG2dr1pRR4wqwbVq4d6+xk2f4ut/yo+hwr4QjE08=
github.com/vektah/gqlparser/v2 v2.5.21/go.mod h1:xMl+ta8a5M1Yo1A1Iwt/k7gSpscwSnHZdw7tfhEGfTM=
github.com/wundergraph/graphql-go-tools v1.67.4 h1:1QtoftaZz5sScV/J6XLZ/oTfi1lMHp6UmFkYRQfY2/g=
github.com/wundergraph/graphql-go-tools v1.67.4/go.mod h1:UFvflYjB/qnSCdgcHQuE6dTfwZ6viJB7yPnGOtBuibo=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
gitlab.com/unboundsoftware/eventsourced/amqp v1.7.0 h1:AyYVqo/2gNtgtx6Nq4USu9uH2MIE9pV5YXsMk5utdKw=
gitlab.com/unboundsoftware/eventsourced/amqp v1.7.0/go.mod h1:gmA1jjRBNPtOawpzwEkOABvRYE0rE187wSsBrCtnEBA=
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.16.0 h1:M23pbqxgwFc+bzLKEio4lj+fRSDoWjp6QHOHzdRRtw4=
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.16.0/go.mod h1:UAf1o59zIANqyzFzcR7Z0pWp5rfd2wyz2XDSP4LJIdI=
gitlab.com/unboundsoftware/eventsourced/pg v1.15.0 h1:wH74r4MIiLgFxV8U+aF6OfjpwBLjVmeWnd/dilgQmwY=
gitlab.com/unboundsoftware/eventsourced/pg v1.15.0/go.mod h1:u3niHnTGKssMUyHxiMDkl6IUEED8qHyX1pKJyy5cRmk=
github.com/urfave/cli/v3 v3.6.0 h1:oIdArVjkdIXHWg3iqxgmqwQGC8NM0JtdgwQAj2sRwFo=
github.com/urfave/cli/v3 v3.6.0/go.mod h1:ysVLtOEmg2tOy6PknnYVhDoouyC/6N42TMeoMzskhso=
github.com/vektah/gqlparser/v2 v2.5.31 h1:YhWGA1mfTjID7qJhd1+Vxhpk5HTgydrGU9IgkWBTJ7k=
github.com/vektah/gqlparser/v2 v2.5.31/go.mod h1:c1I28gSOVNzlfc4WuDlqU7voQnsqI6OG2amkBAFmgts=
github.com/wundergraph/astjson v0.0.0-20250106123708-be463c97e083 h1:8/D7f8gKxTBjW+SZK4mhxTTBVpxcqeBgWF1Rfmltbfk=
github.com/wundergraph/astjson v0.0.0-20250106123708-be463c97e083/go.mod h1:eOTL6acwctsN4F3b7YE+eE2t8zcJ/doLm9sZzsxxxrE=
github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.238 h1:ll0BtYVMziRa8v0T/f+DQOJ/1x3Dq5puifJNnxF0R+M=
github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.238/go.mod h1:ErOQH1ki2+SZB8JjpTyGVnoBpg5picIyjvuWQJP4abg=
gitlab.com/unboundsoftware/eventsourced/amqp v1.9.0 h1:TdBJnrnrxJrPhC4i6KTFUElZa3k/fFXiGwg0sds5aAo=
gitlab.com/unboundsoftware/eventsourced/amqp v1.9.0/go.mod h1:VauAph7uCvEakYNdHkkSAoOOGKvEuUA/uhsR376ThbI=
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.19.3 h1:0HbDHF4sHfoyDrbPLMFWvsQLbTl2ITrpI9PjDIZsV1Y=
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.19.3/go.mod h1:LrA7I7etRmhIC1PjO8c26BHm+gWsy2rC3eSMe5+XUWE=
gitlab.com/unboundsoftware/eventsourced/pg v1.17.0 h1:pUJzMpNPX0GVsffRZXlpKR1d7Ws96KTxJwbLFPpASSc=
gitlab.com/unboundsoftware/eventsourced/pg v1.17.0/go.mod h1:WgPrZhyCbsZ3TG2tPUbh2MUjOEaANJjsWi/0hlIwRVU=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/contrib/bridges/otelslog v0.13.0 h1:bwnLpizECbPr1RrQ27waeY2SPIPeccCx/xLuoYADZ9s=
go.opentelemetry.io/contrib/bridges/otelslog v0.13.0/go.mod h1:3nWlOiiqA9UtUnrcNk82mYasNxD8ehOspL0gOfEo6Y4=
go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=
go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 h1:Oe2z/BCg5q7k4iXC3cqJxKYg0ieRiOqF0cecFYdPTwk=
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0/go.mod h1:ZQM5lAJpOsKnYagGg/zV2krVqTtaVdYdDkhMoX6Oalg=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 h1:aTL7F04bJHUlztTsNGJ2l+6he8c+y/b//eR0jjjemT4=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0/go.mod h1:kldtb7jDTeol0l3ewcmd8SDvx3EmIE7lyvqbasU3QC4=
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0 h1:B/g+qde6Mkzxbry5ZZag0l7QrQBCtVm7lVjaLgmpje8=
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0/go.mod h1:mOJK8eMmgW6ocDJn6Bn11CcZ05gi3P8GylBXEkZtbgA=
go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNGgrM=
go.opentelemetry.io/otel/log v0.14.0/go.mod h1:5jRG92fEAgx0SU/vFPxmJvhIuDU9E1SUnEQrMlJpOno=
go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA=
go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI=
go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E=
go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg=
go.opentelemetry.io/otel/sdk/log v0.14.0 h1:JU/U3O7N6fsAXj0+CXz21Czg532dW2V4gG1HE/e8Zrg=
go.opentelemetry.io/otel/sdk/log v0.14.0/go.mod h1:imQvII+0ZylXfKU7/wtOND8Hn4OpT3YUoIgqJVksUkM=
go.opentelemetry.io/otel/sdk/log/logtest v0.14.0 h1:Ijbtz+JKXl8T2MngiwqBlPaHqc4YCaP/i13Qrow6gAM=
go.opentelemetry.io/otel/sdk/log/logtest v0.14.0/go.mod h1:dCU8aEL6q+L9cYTqcVOk8rM9Tp8WdnHOPLiBgp0SGOA=
go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM=
go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA=
go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE=
go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=
go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4=
go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE=
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=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=
golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY=
google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc=
google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4=
google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ=
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
@@ -232,17 +263,11 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI=
modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4=
modernc.org/libc v1.55.3 h1:AzcW1mhlPNrRtjS5sS+eW2ISCgSOLLNyFzRh/V3Qj/U=
modernc.org/libc v1.55.3/go.mod h1:qFXepLhz+JjFThQ4kzwzOjA/y/artDeg+pcYnY+Q83w=
modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU=
modernc.org/sqlite v1.34.1 h1:u3Yi6M0N8t9yKRDwhXcyp1eS5/ErhPTBggxWFuR6Hfk=
modernc.org/sqlite v1.34.1/go.mod h1:pXV2xHxhzXZsgT/RtTFAPY6JJDEvOTcTdwADQCCWD4k=
modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
modernc.org/libc v1.66.3 h1:cfCbjTUcdsKyyZZfEUKfoHcP3S0Wkvz3jgSzByEWVCQ=
modernc.org/libc v1.66.3/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=
modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
modernc.org/sqlite v1.38.2 h1:Aclu7+tgjgcQVShZqim41Bbw9Cho0y/7WzYptXqkEek=
modernc.org/sqlite v1.38.2/go.mod h1:cPTJYSlgg3Sfg046yBShXENNtPrWrDX8bsbAQBzgQ5E=
+54
View File
@@ -0,0 +1,54 @@
package graph
import (
"encoding/json"
"fmt"
"gitlab.com/unboundsoftware/schemas/graph/model"
)
// GenerateCosmoRouterConfig generates a Cosmo Router execution config from subgraphs
func GenerateCosmoRouterConfig(subGraphs []*model.SubGraph) (string, error) {
// Build the Cosmo router config structure
// This is a simplified version - you may need to adjust based on actual Cosmo requirements
config := map[string]interface{}{
"version": "1",
"subgraphs": convertSubGraphsToCosmo(subGraphs),
// Add other Cosmo-specific configuration as needed
}
// Marshal to JSON
configJSON, err := json.MarshalIndent(config, "", " ")
if err != nil {
return "", fmt.Errorf("marshal cosmo config: %w", err)
}
return string(configJSON), nil
}
func convertSubGraphsToCosmo(subGraphs []*model.SubGraph) []map[string]interface{} {
cosmoSubgraphs := make([]map[string]interface{}, 0, len(subGraphs))
for _, sg := range subGraphs {
cosmoSg := map[string]interface{}{
"name": sg.Service,
"sdl": sg.Sdl,
}
if sg.URL != nil {
cosmoSg["routing_url"] = *sg.URL
}
if sg.WsURL != nil {
cosmoSg["subscription"] = map[string]interface{}{
"url": *sg.WsURL,
"protocol": "ws",
"websocket_subprotocol": "graphql-ws",
}
}
cosmoSubgraphs = append(cosmoSubgraphs, cosmoSg)
}
return cosmoSubgraphs
}
+258
View File
@@ -0,0 +1,258 @@
package graph
import (
"encoding/json"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gitlab.com/unboundsoftware/schemas/graph/model"
)
func TestGenerateCosmoRouterConfig(t *testing.T) {
tests := []struct {
name string
subGraphs []*model.SubGraph
wantErr bool
validate func(t *testing.T, config string)
}{
{
name: "single subgraph with all fields",
subGraphs: []*model.SubGraph{
{
Service: "test-service",
URL: stringPtr("http://localhost:4001/query"),
WsURL: stringPtr("ws://localhost:4001/query"),
Sdl: "type Query { test: String }",
},
},
wantErr: false,
validate: func(t *testing.T, config string) {
var result map[string]interface{}
err := json.Unmarshal([]byte(config), &result)
require.NoError(t, err, "Config should be valid JSON")
assert.Equal(t, "1", result["version"], "Version should be 1")
subgraphs, ok := result["subgraphs"].([]interface{})
require.True(t, ok, "subgraphs should be an array")
require.Len(t, subgraphs, 1, "Should have 1 subgraph")
sg := subgraphs[0].(map[string]interface{})
assert.Equal(t, "test-service", sg["name"])
assert.Equal(t, "http://localhost:4001/query", sg["routing_url"])
assert.Equal(t, "type Query { test: String }", sg["sdl"])
subscription, ok := sg["subscription"].(map[string]interface{})
require.True(t, ok, "Should have subscription config")
assert.Equal(t, "ws://localhost:4001/query", subscription["url"])
assert.Equal(t, "ws", subscription["protocol"])
assert.Equal(t, "graphql-ws", subscription["websocket_subprotocol"])
},
},
{
name: "multiple subgraphs",
subGraphs: []*model.SubGraph{
{
Service: "service-1",
URL: stringPtr("http://localhost:4001/query"),
Sdl: "type Query { field1: String }",
},
{
Service: "service-2",
URL: stringPtr("http://localhost:4002/query"),
Sdl: "type Query { field2: String }",
},
{
Service: "service-3",
URL: stringPtr("http://localhost:4003/query"),
WsURL: stringPtr("ws://localhost:4003/query"),
Sdl: "type Subscription { updates: String }",
},
},
wantErr: false,
validate: func(t *testing.T, config string) {
var result map[string]interface{}
err := json.Unmarshal([]byte(config), &result)
require.NoError(t, err)
subgraphs := result["subgraphs"].([]interface{})
assert.Len(t, subgraphs, 3, "Should have 3 subgraphs")
// Check first service has no subscription
sg1 := subgraphs[0].(map[string]interface{})
assert.Equal(t, "service-1", sg1["name"])
_, hasSubscription := sg1["subscription"]
assert.False(t, hasSubscription, "service-1 should not have subscription config")
// Check third service has subscription
sg3 := subgraphs[2].(map[string]interface{})
assert.Equal(t, "service-3", sg3["name"])
subscription, hasSubscription := sg3["subscription"]
assert.True(t, hasSubscription, "service-3 should have subscription config")
assert.NotNil(t, subscription)
},
},
{
name: "subgraph with no URL",
subGraphs: []*model.SubGraph{
{
Service: "test-service",
URL: nil,
WsURL: nil,
Sdl: "type Query { test: String }",
},
},
wantErr: false,
validate: func(t *testing.T, config string) {
var result map[string]interface{}
err := json.Unmarshal([]byte(config), &result)
require.NoError(t, err)
subgraphs := result["subgraphs"].([]interface{})
sg := subgraphs[0].(map[string]interface{})
// Should not have routing_url or subscription fields if URLs are nil
_, hasRoutingURL := sg["routing_url"]
assert.False(t, hasRoutingURL, "Should not have routing_url when URL is nil")
_, hasSubscription := sg["subscription"]
assert.False(t, hasSubscription, "Should not have subscription when WsURL is nil")
},
},
{
name: "empty subgraphs",
subGraphs: []*model.SubGraph{},
wantErr: false,
validate: func(t *testing.T, config string) {
var result map[string]interface{}
err := json.Unmarshal([]byte(config), &result)
require.NoError(t, err)
subgraphs := result["subgraphs"].([]interface{})
assert.Len(t, subgraphs, 0, "Should have empty subgraphs array")
},
},
{
name: "nil subgraphs",
subGraphs: nil,
wantErr: false,
validate: func(t *testing.T, config string) {
var result map[string]interface{}
err := json.Unmarshal([]byte(config), &result)
require.NoError(t, err)
subgraphs := result["subgraphs"].([]interface{})
assert.Len(t, subgraphs, 0, "Should handle nil subgraphs as empty array")
},
},
{
name: "complex SDL with multiple types",
subGraphs: []*model.SubGraph{
{
Service: "complex-service",
URL: stringPtr("http://localhost:4001/query"),
Sdl: `
type Query {
user(id: ID!): User
users: [User!]!
}
type User {
id: ID!
name: String!
email: String!
}
`,
},
},
wantErr: false,
validate: func(t *testing.T, config string) {
var result map[string]interface{}
err := json.Unmarshal([]byte(config), &result)
require.NoError(t, err)
subgraphs := result["subgraphs"].([]interface{})
sg := subgraphs[0].(map[string]interface{})
sdl := sg["sdl"].(string)
assert.Contains(t, sdl, "type Query")
assert.Contains(t, sdl, "type User")
assert.Contains(t, sdl, "email: String!")
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
config, err := GenerateCosmoRouterConfig(tt.subGraphs)
if tt.wantErr {
assert.Error(t, err)
return
}
require.NoError(t, err)
assert.NotEmpty(t, config, "Config should not be empty")
if tt.validate != nil {
tt.validate(t, config)
}
})
}
}
func TestConvertSubGraphsToCosmo(t *testing.T) {
tests := []struct {
name string
subGraphs []*model.SubGraph
wantLen int
validate func(t *testing.T, result []map[string]interface{})
}{
{
name: "preserves subgraph order",
subGraphs: []*model.SubGraph{
{Service: "alpha", URL: stringPtr("http://a"), Sdl: "a"},
{Service: "beta", URL: stringPtr("http://b"), Sdl: "b"},
{Service: "gamma", URL: stringPtr("http://c"), Sdl: "c"},
},
wantLen: 3,
validate: func(t *testing.T, result []map[string]interface{}) {
assert.Equal(t, "alpha", result[0]["name"])
assert.Equal(t, "beta", result[1]["name"])
assert.Equal(t, "gamma", result[2]["name"])
},
},
{
name: "includes SDL exactly as provided",
subGraphs: []*model.SubGraph{
{
Service: "test",
URL: stringPtr("http://test"),
Sdl: "type Query { special: String! }",
},
},
wantLen: 1,
validate: func(t *testing.T, result []map[string]interface{}) {
assert.Equal(t, "type Query { special: String! }", result[0]["sdl"])
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := convertSubGraphsToCosmo(tt.subGraphs)
assert.Len(t, result, tt.wantLen)
if tt.validate != nil {
tt.validate(t, result)
}
})
}
}
// Helper function for tests
func stringPtr(s string) *string {
return &s
}
+1562 -2169
View File
File diff suppressed because it is too large Load Diff
+10
View File
@@ -49,6 +49,13 @@ type Organization struct {
type Query struct {
}
type SchemaUpdate struct {
Ref string `json:"ref"`
ID string `json:"id"`
SubGraphs []*SubGraph `json:"subGraphs"`
CosmoRouterConfig *string `json:"cosmoRouterConfig,omitempty"`
}
type SubGraph struct {
ID string `json:"id"`
Service string `json:"service"`
@@ -68,6 +75,9 @@ type SubGraphs struct {
func (SubGraphs) IsSupergraph() {}
type Subscription struct {
}
type Unchanged struct {
ID string `json:"id"`
MinDelaySeconds int `json:"minDelaySeconds"`
+66
View File
@@ -0,0 +1,66 @@
package graph
import (
"sync"
"gitlab.com/unboundsoftware/schemas/graph/model"
)
// PubSub handles publishing schema updates to subscribers
type PubSub struct {
mu sync.RWMutex
subscribers map[string][]chan *model.SchemaUpdate
}
func NewPubSub() *PubSub {
return &PubSub{
subscribers: make(map[string][]chan *model.SchemaUpdate),
}
}
// Subscribe creates a new subscription channel for a given schema ref
func (ps *PubSub) Subscribe(ref string) chan *model.SchemaUpdate {
ps.mu.Lock()
defer ps.mu.Unlock()
ch := make(chan *model.SchemaUpdate, 10)
ps.subscribers[ref] = append(ps.subscribers[ref], ch)
return ch
}
// Unsubscribe removes a subscription channel
func (ps *PubSub) Unsubscribe(ref string, ch chan *model.SchemaUpdate) {
ps.mu.Lock()
defer ps.mu.Unlock()
subs := ps.subscribers[ref]
for i, sub := range subs {
if sub == ch {
// Remove this subscriber
ps.subscribers[ref] = append(subs[:i], subs[i+1:]...)
close(sub)
break
}
}
// Clean up empty subscriber lists
if len(ps.subscribers[ref]) == 0 {
delete(ps.subscribers, ref)
}
}
// Publish sends a schema update to all subscribers of a given ref
func (ps *PubSub) Publish(ref string, update *model.SchemaUpdate) {
ps.mu.RLock()
defer ps.mu.RUnlock()
for _, ch := range ps.subscribers[ref] {
// Non-blocking send - if subscriber is slow, skip
select {
case ch <- update:
default:
// Channel full, subscriber is too slow - skip this update
}
}
}
+256
View File
@@ -0,0 +1,256 @@
package graph
import (
"sync"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gitlab.com/unboundsoftware/schemas/graph/model"
)
func TestPubSub_SubscribeAndPublish(t *testing.T) {
ps := NewPubSub()
ref := "Test@dev"
// Subscribe
ch := ps.Subscribe(ref)
require.NotNil(t, ch, "Subscribe should return a channel")
// Publish
update := &model.SchemaUpdate{
Ref: ref,
ID: "test-id-1",
SubGraphs: []*model.SubGraph{
{
ID: "sg1",
Service: "test-service",
Sdl: "type Query { test: String }",
},
},
}
go ps.Publish(ref, update)
// Receive
select {
case received := <-ch:
assert.Equal(t, update.Ref, received.Ref, "Ref should match")
assert.Equal(t, update.ID, received.ID, "ID should match")
assert.Equal(t, len(update.SubGraphs), len(received.SubGraphs), "SubGraphs count should match")
case <-time.After(1 * time.Second):
t.Fatal("Timeout waiting for published update")
}
}
func TestPubSub_MultipleSubscribers(t *testing.T) {
ps := NewPubSub()
ref := "Test@dev"
// Create multiple subscribers
ch1 := ps.Subscribe(ref)
ch2 := ps.Subscribe(ref)
ch3 := ps.Subscribe(ref)
update := &model.SchemaUpdate{
Ref: ref,
ID: "test-id-2",
}
// Publish once
ps.Publish(ref, update)
// All subscribers should receive the update
var wg sync.WaitGroup
wg.Add(3)
checkReceived := func(ch <-chan *model.SchemaUpdate, name string) {
defer wg.Done()
select {
case received := <-ch:
assert.Equal(t, update.ID, received.ID, "%s should receive correct update", name)
case <-time.After(1 * time.Second):
t.Errorf("%s: Timeout waiting for update", name)
}
}
go checkReceived(ch1, "Subscriber 1")
go checkReceived(ch2, "Subscriber 2")
go checkReceived(ch3, "Subscriber 3")
wg.Wait()
}
func TestPubSub_DifferentRefs(t *testing.T) {
ps := NewPubSub()
ref1 := "Test1@dev"
ref2 := "Test2@dev"
ch1 := ps.Subscribe(ref1)
ch2 := ps.Subscribe(ref2)
update1 := &model.SchemaUpdate{Ref: ref1, ID: "id1"}
update2 := &model.SchemaUpdate{Ref: ref2, ID: "id2"}
// Publish to ref1
ps.Publish(ref1, update1)
// Only ch1 should receive
select {
case received := <-ch1:
assert.Equal(t, "id1", received.ID)
case <-time.After(100 * time.Millisecond):
t.Fatal("ch1 should have received update")
}
// ch2 should not receive ref1's update
select {
case <-ch2:
t.Fatal("ch2 should not receive ref1's update")
case <-time.After(100 * time.Millisecond):
// Expected - no update
}
// Publish to ref2
ps.Publish(ref2, update2)
// Now ch2 should receive
select {
case received := <-ch2:
assert.Equal(t, "id2", received.ID)
case <-time.After(100 * time.Millisecond):
t.Fatal("ch2 should have received update")
}
}
func TestPubSub_Unsubscribe(t *testing.T) {
ps := NewPubSub()
ref := "Test@dev"
ch := ps.Subscribe(ref)
// Unsubscribe
ps.Unsubscribe(ref, ch)
// Channel should be closed
_, ok := <-ch
assert.False(t, ok, "Channel should be closed after unsubscribe")
// Publishing after unsubscribe should not panic
assert.NotPanics(t, func() {
ps.Publish(ref, &model.SchemaUpdate{Ref: ref})
})
}
func TestPubSub_BufferedChannel(t *testing.T) {
ps := NewPubSub()
ref := "Test@dev"
ch := ps.Subscribe(ref)
// Publish multiple updates quickly (up to buffer size of 10)
for i := 0; i < 10; i++ {
update := &model.SchemaUpdate{
Ref: ref,
ID: string(rune('a' + i)),
}
ps.Publish(ref, update)
}
// All 10 should be buffered and receivable
received := 0
timeout := time.After(1 * time.Second)
for received < 10 {
select {
case <-ch:
received++
case <-timeout:
t.Fatalf("Only received %d out of 10 updates", received)
}
}
assert.Equal(t, 10, received, "Should receive all buffered updates")
}
func TestPubSub_SlowSubscriber(t *testing.T) {
ps := NewPubSub()
ref := "Test@dev"
ch := ps.Subscribe(ref)
// Fill the buffer (10 items)
for i := 0; i < 10; i++ {
ps.Publish(ref, &model.SchemaUpdate{Ref: ref})
}
// Publish one more - this should be dropped (channel full, non-blocking send)
ps.Publish(ref, &model.SchemaUpdate{Ref: ref, ID: "should-be-dropped"})
// Drain the channel
count := 0
timeout := time.After(500 * time.Millisecond)
drainLoop:
for {
select {
case update := <-ch:
count++
// Should not receive the dropped update
assert.NotEqual(t, "should-be-dropped", update.ID, "Should not receive dropped update")
case <-timeout:
break drainLoop
}
}
// Should have received exactly 10 (the buffer size), not 11
assert.Equal(t, 10, count, "Should only receive buffered updates, not the dropped one")
}
func TestPubSub_ConcurrentPublish(t *testing.T) {
ps := NewPubSub()
ref := "Test@dev"
ch := ps.Subscribe(ref)
numPublishers := 10
updatesPerPublisher := 10
var wg sync.WaitGroup
wg.Add(numPublishers)
// Multiple goroutines publishing concurrently
for i := 0; i < numPublishers; i++ {
go func(publisherID int) {
defer wg.Done()
for j := 0; j < updatesPerPublisher; j++ {
ps.Publish(ref, &model.SchemaUpdate{
Ref: ref,
ID: string(rune('a' + publisherID)),
})
}
}(i)
}
wg.Wait()
// Should not panic and subscriber should receive updates
// (exact count may vary due to buffer and timing)
timeout := time.After(1 * time.Second)
received := 0
receiveLoop:
for {
select {
case <-ch:
received++
case <-timeout:
break receiveLoop
}
}
assert.Greater(t, received, 0, "Should have received some updates")
}
+3 -2
View File
@@ -3,8 +3,8 @@ package graph
import (
"context"
"fmt"
"log/slog"
"github.com/apex/log"
"gitlab.com/unboundsoftware/eventsourced/eventsourced"
"gitlab.com/unboundsoftware/schemas/cache"
@@ -26,8 +26,9 @@ type Publisher interface {
type Resolver struct {
EventStore eventsourced.EventStore
Publisher Publisher
Logger log.Interface
Logger *slog.Logger
Cache *cache.Cache
PubSub *PubSub
}
func (r *Resolver) apiKeyCanAccessRef(ctx context.Context, ref string, publish bool) (string, error) {
+11
View File
@@ -9,6 +9,10 @@ type Mutation {
updateSubGraph(input: InputSubGraph!): SubGraph! @auth(organization: true)
}
type Subscription {
schemaUpdates(ref: String!): SchemaUpdate! @auth(organization: true)
}
type Organization {
id: ID!
name: String!
@@ -54,6 +58,13 @@ type SubGraph {
changedAt: Time!
}
type SchemaUpdate {
ref: String!
id: ID!
subGraphs: [SubGraph!]!
cosmoRouterConfig: String
}
input InputAPIKey {
name: String!
organizationId: ID!
+102 -3
View File
@@ -9,7 +9,6 @@ import (
"fmt"
"strings"
"github.com/wundergraph/graphql-go-tools/pkg/federation/sdlmerge"
"gitlab.com/unboundsoftware/eventsourced/eventsourced"
"gitlab.com/unboundsoftware/schemas/domain"
@@ -17,6 +16,7 @@ import (
"gitlab.com/unboundsoftware/schemas/graph/model"
"gitlab.com/unboundsoftware/schemas/middleware"
"gitlab.com/unboundsoftware/schemas/rand"
"gitlab.com/unboundsoftware/schemas/sdlmerge"
)
// AddOrganization is the resolver for the addOrganization field.
@@ -119,6 +119,44 @@ func (r *mutationResolver) UpdateSubGraph(ctx context.Context, input model.Input
if err != nil {
return nil, err
}
// Publish schema update to subscribers
go func() {
services, lastUpdate := r.Cache.Services(orgId, input.Ref, "")
subGraphs := make([]*model.SubGraph, len(services))
for i, id := range services {
sg, err := r.fetchSubGraph(context.Background(), id)
if err != nil {
r.Logger.Error("fetch subgraph for update notification", "error", err)
continue
}
subGraphs[i] = &model.SubGraph{
ID: sg.ID.String(),
Service: sg.Service,
URL: sg.Url,
WsURL: sg.WSUrl,
Sdl: sg.Sdl,
ChangedBy: sg.ChangedBy,
ChangedAt: sg.ChangedAt,
}
}
// Generate Cosmo router config
cosmoConfig, err := GenerateCosmoRouterConfig(subGraphs)
if err != nil {
r.Logger.Error("generate cosmo config for update", "error", err)
cosmoConfig = "" // Send empty if generation fails
}
// Publish to all subscribers of this ref
r.PubSub.Publish(input.Ref, &model.SchemaUpdate{
Ref: input.Ref,
ID: lastUpdate,
SubGraphs: subGraphs,
CosmoRouterConfig: &cosmoConfig,
})
}()
return r.toGqlSubGraph(subGraph), nil
}
@@ -184,13 +222,74 @@ func (r *queryResolver) Supergraph(ctx context.Context, ref string, isAfter *str
}, nil
}
// SchemaUpdates is the resolver for the schemaUpdates field.
func (r *subscriptionResolver) SchemaUpdates(ctx context.Context, ref string) (<-chan *model.SchemaUpdate, error) {
orgId := middleware.OrganizationFromContext(ctx)
_, err := r.apiKeyCanAccessRef(ctx, ref, false)
if err != nil {
return nil, err
}
// Subscribe to updates for this ref
ch := r.PubSub.Subscribe(ref)
// Send initial state immediately
go func() {
services, lastUpdate := r.Cache.Services(orgId, ref, "")
subGraphs := make([]*model.SubGraph, len(services))
for i, id := range services {
sg, err := r.fetchSubGraph(ctx, id)
if err != nil {
r.Logger.Error("fetch subgraph for initial update", "error", err)
continue
}
subGraphs[i] = &model.SubGraph{
ID: sg.ID.String(),
Service: sg.Service,
URL: sg.Url,
WsURL: sg.WSUrl,
Sdl: sg.Sdl,
ChangedBy: sg.ChangedBy,
ChangedAt: sg.ChangedAt,
}
}
// Generate Cosmo router config
cosmoConfig, err := GenerateCosmoRouterConfig(subGraphs)
if err != nil {
r.Logger.Error("generate cosmo config", "error", err)
cosmoConfig = "" // Send empty if generation fails
}
// Send initial update
ch <- &model.SchemaUpdate{
Ref: ref,
ID: lastUpdate,
SubGraphs: subGraphs,
CosmoRouterConfig: &cosmoConfig,
}
}()
// Clean up subscription when context is done
go func() {
<-ctx.Done()
r.PubSub.Unsubscribe(ref, ch)
}()
return ch, nil
}
// Mutation returns generated.MutationResolver implementation.
func (r *Resolver) Mutation() generated.MutationResolver { return &mutationResolver{r} }
// Query returns generated.QueryResolver implementation.
func (r *Resolver) Query() generated.QueryResolver { return &queryResolver{r} }
// Subscription returns generated.SubscriptionResolver implementation.
func (r *Resolver) Subscription() generated.SubscriptionResolver { return &subscriptionResolver{r} }
type (
mutationResolver struct{ *Resolver }
queryResolver struct{ *Resolver }
mutationResolver struct{ *Resolver }
queryResolver struct{ *Resolver }
subscriptionResolver struct{ *Resolver }
)
-1
View File
@@ -1,5 +1,4 @@
//go:build tools
// +build tools
package graph
+1 -1
View File
@@ -2,7 +2,7 @@ apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
labels:
app: schemas
app.kubernetes.io/name: schemas
name: schemas
spec:
scaleTargetRef:
+7
View File
@@ -0,0 +1,7 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: schemas
data:
LOG_FORMAT: "otel"
ENVIRONMENT: "production"
+6
View File
@@ -0,0 +1,6 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: schemas
data:
ENVIRONMENT: "development"
+11 -11
View File
@@ -7,7 +7,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: schemas
app.kubernetes.io/name: schemas
name: schemas
annotations:
kubernetes.io/change-cause: "${TIMESTAMP} Deployed commit id: ${COMMIT}"
@@ -15,7 +15,7 @@ spec:
replicas: 1
selector:
matchLabels:
app: schemas
app.kubernetes.io/name: schemas
strategy:
rollingUpdate:
maxSurge: 1
@@ -24,7 +24,7 @@ spec:
template:
metadata:
labels:
app: schemas
app.kubernetes.io/name: schemas
spec:
affinity:
podAntiAffinity:
@@ -33,7 +33,7 @@ spec:
podAffinityTerm:
labelSelector:
matchExpressions:
- key: "app"
- key: "app.kubernetes.io/name"
operator: In
values:
- schemas
@@ -41,11 +41,8 @@ spec:
containers:
- name: schemas
resources:
limits:
cpu: "500m"
memory: "100Mi"
requests:
cpu: "10m"
cpu: "20m"
memory: "20Mi"
readinessProbe:
httpGet:
@@ -59,11 +56,14 @@ spec:
ports:
- name: api
containerPort: 8080
env:
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://k8s-monitoring-alloy-receiver.monitoring.svc.cluster.local:4318
envFrom:
- secretRef:
- configMapRef:
name: schemas
- secretRef:
name: rabbitmq
name: schemas
restartPolicy: Always
serviceAccountName: schemas
---
@@ -79,5 +79,5 @@ spec:
protocol: TCP
targetPort: 8080
selector:
app: schemas
app.kubernetes.io/name: schemas
type: NodePort
+9
View File
@@ -0,0 +1,9 @@
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: schemas-pdb
spec:
minAvailable: 1
selector:
matchLabels:
app.kubernetes.io/name: schemas
+1
View File
@@ -5,3 +5,4 @@ metadata:
stringData:
API_KEY: supersecret123!
POSTGRES_URL: "postgres://postgres:postgres@postgres:5432/schemas?sslmode=disable"
AMQP_URL: "amqp://user:password@rabbitmq:5672/"
+5 -4
View File
@@ -1,8 +1,7 @@
apiVersion: external-secrets.io/v1beta1
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: schemas
namespace: default
spec:
refreshInterval: 1h
secretStoreRef:
@@ -11,13 +10,15 @@ spec:
target:
creationPolicy: Owner
template:
mergePolicy: Merge
engineVersion: 'v2'
data:
POSTGRES_URL: "postgres://{{ .DB_USERNAME }}:{{ .DB_PASSWORD }}@{{ .DB_HOST }}:{{ .DB_PORT }}/schemas?sslmode=disable"
API_KEY: "{{ .API_KEY }}"
SENTRY_DSN: "{{ .SENTRY_DSN }}"
SENTRY_ENVIRONMENT: "{{ .SENTRY_ENVIRONMENT }}"
dataFrom:
- extract:
key: services/schemas
- extract:
key: rds/postgres/prod-psql
- extract:
key: mq/rabbit/prod
+65
View File
@@ -0,0 +1,65 @@
package logging
import (
"context"
"log/slog"
"os"
"go.opentelemetry.io/contrib/bridges/otelslog"
)
type Logger interface {
Info(msg string, args ...any)
Warn(msg string, args ...any)
Error(msg string, args ...any)
}
var defaultLogger *slog.Logger
type contextKey string
const loggerKey = contextKey("logger")
func SetupLogger(logLevel, logFormat, serviceName, buildVersion string) *slog.Logger {
var leveler slog.LevelVar
err := leveler.UnmarshalText([]byte(logLevel))
handlerOpts := &slog.HandlerOptions{
AddSource: false,
Level: leveler.Level(),
ReplaceAttr: nil,
}
var handler slog.Handler
switch logFormat {
case "json":
handler = slog.NewJSONHandler(os.Stdout, handlerOpts)
case "text":
handler = slog.NewTextHandler(os.Stdout, handlerOpts)
case "otel":
handler = otelslog.NewHandler(serviceName,
otelslog.WithVersion(buildVersion))
}
defaultLogger = slog.New(handler).With("service", serviceName).With("version", buildVersion)
if err != nil {
defaultLogger.With("err", err).Error("Failed to parse log level")
os.Exit(1)
}
slog.SetDefault(defaultLogger)
return defaultLogger
}
// ContextWithLogger returns a new Context with the logger attached
func ContextWithLogger(ctx context.Context, logger *slog.Logger) context.Context {
return context.WithValue(ctx, loggerKey, logger)
}
// LoggerFromContext returns a logger from the passed context or the default logger
func LoggerFromContext(ctx context.Context) *slog.Logger {
logger := ctx.Value(loggerKey)
if l, ok := logger.(*slog.Logger); ok {
return l
}
return defaultLogger
}
+48
View File
@@ -0,0 +1,48 @@
package logging
import (
"bytes"
"log/slog"
"strings"
"testing"
"github.com/stretchr/testify/assert"
)
func NewMockLogger() *MockLogger {
logged := &bytes.Buffer{}
return &MockLogger{
logged: logged,
logger: slog.New(slog.NewTextHandler(logged, &slog.HandlerOptions{
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
if a.Key == "time" {
return slog.Attr{}
}
return a
},
})),
}
}
type MockLogger struct {
logger *slog.Logger
logged *bytes.Buffer
}
func (m *MockLogger) Logger() *slog.Logger {
return m.logger
}
func (m *MockLogger) Check(t testing.TB, wantLogged []string) {
var gotLogged []string
if m.logged.String() != "" {
gotLogged = strings.Split(m.logged.String(), "\n")
gotLogged = gotLogged[:len(gotLogged)-1]
}
if len(wantLogged) == 0 {
assert.Empty(t, gotLogged)
return
}
assert.Equal(t, wantLogged, gotLogged)
}
+41
View File
@@ -0,0 +1,41 @@
package monitoring
import (
"context"
"fmt"
"github.com/99designs/gqlgen/graphql"
"go.opentelemetry.io/otel/trace"
)
func AroundOperations(ctx context.Context, next graphql.OperationHandler) graphql.ResponseHandler {
op := graphql.GetOperationContext(ctx)
spanName := fmt.Sprintf("graphql:operation:%s", op.OperationName)
// Span always injected in the http handler above
sp := trace.SpanFromContext(ctx)
if sp != nil {
sp.SetName(spanName)
}
return next(ctx)
}
func AroundRootFields(ctx context.Context, next graphql.RootResolver) graphql.Marshaler {
oc := graphql.GetRootFieldContext(ctx)
spanCtx, span := StartSpan(ctx, fmt.Sprintf("graphql:rootfield:%s", oc.Field.Name))
defer span.Finish()
return next(spanCtx)
}
func AroundFields(ctx context.Context, next graphql.Resolver) (res any, err error) {
oc := graphql.GetFieldContext(ctx)
var span Span
if oc.IsResolver {
ctx, span = StartSpan(ctx, fmt.Sprintf("graphql:field:%s", oc.Field.Name))
}
defer func() {
if span != nil {
span.Finish()
}
}()
return next(ctx)
}
+100
View File
@@ -0,0 +1,100 @@
package monitoring
import (
"context"
"errors"
"fmt"
"net/http"
"os"
"time"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
"go.opentelemetry.io/otel/exporters/stdout/stdoutlog"
"go.opentelemetry.io/otel/log/global"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/log"
"go.opentelemetry.io/otel/sdk/metric"
"go.opentelemetry.io/otel/sdk/trace"
)
// SetupOTelSDK bootstraps the OpenTelemetry pipeline.
func SetupOTelSDK(ctx context.Context, enabled bool, serviceName, buildVersion, environment string) (func(context.Context) error, error) {
if os.Getenv("OTEL_RESOURCE_ATTRIBUTES") == "" {
if err := os.Setenv("OTEL_RESOURCE_ATTRIBUTES", fmt.Sprintf("service.name=%s,service.version=%s,service.environment=%s", serviceName, buildVersion, environment)); err != nil {
return func(context.Context) error {
return nil
}, err
}
}
var shutdownFuncs []func(context.Context) error
if !enabled {
return func(context.Context) error {
return nil
}, nil
}
shutdown := func(ctx context.Context) error {
var err error
for _, fn := range shutdownFuncs {
err = errors.Join(err, fn(ctx))
}
shutdownFuncs = nil
return err
}
// handleErr calls shutdown for cleanup and makes sure that all errors are returned.
handleErr := func(inErr error) (func(context.Context) error, error) {
return nil, errors.Join(inErr, shutdown(ctx))
}
// Set up the propagator.
prop := propagation.NewCompositeTextMapPropagator(
propagation.TraceContext{},
propagation.Baggage{},
)
otel.SetTextMapPropagator(prop)
traceExporter, err := otlptracehttp.New(ctx)
if err != nil {
return handleErr(err)
}
shutdownFuncs = append(shutdownFuncs, traceExporter.Shutdown)
tracerProvider := trace.NewTracerProvider(
trace.WithBatcher(traceExporter,
trace.WithBatchTimeout(5*time.Second)),
)
shutdownFuncs = append(shutdownFuncs, tracerProvider.Shutdown)
otel.SetTracerProvider(tracerProvider)
logExporter, err := stdoutlog.New()
if err != nil {
return handleErr(err)
}
processor := log.NewSimpleProcessor(logExporter)
logProvider := log.NewLoggerProvider(log.WithProcessor(processor))
global.SetLoggerProvider(logProvider)
shutdownFuncs = append(shutdownFuncs, logProvider.Shutdown)
exp, err := otlpmetrichttp.New(ctx)
if err != nil {
return handleErr(err)
}
meterProvider := metric.NewMeterProvider(metric.WithReader(metric.NewPeriodicReader(exp)))
shutdownFuncs = append(shutdownFuncs, meterProvider.Shutdown)
otel.SetMeterProvider(meterProvider)
return shutdown, err
}
func Handler(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
ctx := otel.GetTextMapPropagator().Extract(r.Context(), propagation.HeaderCarrier(r.Header))
spanCtx, s := StartSpan(ctx, "http")
defer s.Finish()
h.ServeHTTP(w, r.WithContext(spanCtx))
})
}
+46
View File
@@ -0,0 +1,46 @@
package monitoring
import (
"context"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/trace"
)
type Span interface {
Context() context.Context
Finish()
}
type span struct {
otelSpan trace.Span
ctx context.Context
}
func (s *span) Finish() {
s.otelSpan.End()
}
func (s *span) Context() context.Context {
return s.ctx
}
func StartSpan(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, Span) {
ctx, otelSpan := otel.Tracer("").Start(ctx, name, opts...)
return ctx, &span{
otelSpan: otelSpan,
ctx: ctx,
}
}
type TraceHandlerFunc func(ctx context.Context, name string) (context.Context, func())
func (t TraceHandlerFunc) Trace(tx context.Context, name string) (context.Context, func()) {
return t(tx, name)
}
func Trace(ctx context.Context, name string) (context.Context, func()) {
ctx, s := StartSpan(ctx, name)
return ctx, s.Finish
}
+6
View File
@@ -12,6 +12,12 @@
"registry.gitlab.com/unboundsoftware/schemas"
],
"enabled": false
},
{
"groupName": "Eventsourced",
"matchPackageNames": [
"gitlab.com/unboundsoftware/eventsourced/**"
]
}
]
}
+61
View File
@@ -0,0 +1,61 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
type collectEntitiesVisitor struct {
*astvisitor.Walker
document *ast.Document
collectedEntities entitySet
}
func newCollectEntitiesVisitor(collectedEntities entitySet) *collectEntitiesVisitor {
return &collectEntitiesVisitor{
collectedEntities: collectedEntities,
}
}
func (c *collectEntitiesVisitor) Register(walker *astvisitor.Walker) {
c.Walker = walker
walker.RegisterEnterDocumentVisitor(c)
walker.RegisterEnterInterfaceTypeDefinitionVisitor(c)
walker.RegisterEnterObjectTypeDefinitionVisitor(c)
}
func (c *collectEntitiesVisitor) EnterDocument(operation, _ *ast.Document) {
c.document = operation
}
func (c *collectEntitiesVisitor) EnterInterfaceTypeDefinition(ref int) {
interfaceType := c.document.InterfaceTypeDefinitions[ref]
name := c.document.InterfaceTypeDefinitionNameString(ref)
if err := c.resolvePotentialEntity(name, interfaceType.Directives.Refs); err != nil {
c.StopWithExternalErr(*err)
}
}
func (c *collectEntitiesVisitor) EnterObjectTypeDefinition(ref int) {
objectType := c.document.ObjectTypeDefinitions[ref]
name := c.document.ObjectTypeDefinitionNameString(ref)
if err := c.resolvePotentialEntity(name, objectType.Directives.Refs); err != nil {
c.StopWithExternalErr(*err)
}
}
func (c *collectEntitiesVisitor) resolvePotentialEntity(name string, directiveRefs []int) *operationreport.ExternalError {
if _, exists := c.collectedEntities[name]; exists {
err := operationreport.ErrEntitiesMustNotBeDuplicated(name)
return &err
}
for _, directiveRef := range directiveRefs {
if c.document.DirectiveNameString(directiveRef) != "key" {
continue
}
c.collectedEntities[name] = struct{}{}
return nil
}
return nil
}
+50
View File
@@ -0,0 +1,50 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
type extendEnumTypeDefinitionVisitor struct {
*astvisitor.Walker
document *ast.Document
}
func newExtendEnumTypeDefinition() *extendEnumTypeDefinitionVisitor {
return &extendEnumTypeDefinitionVisitor{}
}
func (e *extendEnumTypeDefinitionVisitor) Register(walker *astvisitor.Walker) {
e.Walker = walker
walker.RegisterEnterDocumentVisitor(e)
walker.RegisterEnterEnumTypeExtensionVisitor(e)
}
func (e *extendEnumTypeDefinitionVisitor) EnterDocument(operation, _ *ast.Document) {
e.document = operation
}
func (e *extendEnumTypeDefinitionVisitor) EnterEnumTypeExtension(ref int) {
nodes, exists := e.document.Index.NodesByNameBytes(e.document.EnumTypeExtensionNameBytes(ref))
if !exists {
return
}
hasExtended := false
for i := range nodes {
if nodes[i].Kind != ast.NodeKindEnumTypeDefinition {
continue
}
if hasExtended {
e.StopWithExternalErr(operationreport.ErrSharedTypesMustNotBeExtended(e.document.EnumTypeExtensionNameString(ref)))
return
}
e.document.ExtendEnumTypeDefinitionByEnumTypeExtension(nodes[i].Ref, ref)
hasExtended = true
}
if !hasExtended {
e.StopWithExternalErr(operationreport.ErrExtensionOrphansMustResolveInSupergraph(e.document.EnumTypeExtensionNameBytes(ref)))
}
}
+50
View File
@@ -0,0 +1,50 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
func newExtendInputObjectTypeDefinition() *extendInputObjectTypeDefinitionVisitor {
return &extendInputObjectTypeDefinitionVisitor{}
}
type extendInputObjectTypeDefinitionVisitor struct {
*astvisitor.Walker
document *ast.Document
}
func (e *extendInputObjectTypeDefinitionVisitor) Register(walker *astvisitor.Walker) {
e.Walker = walker
walker.RegisterEnterDocumentVisitor(e)
walker.RegisterEnterInputObjectTypeExtensionVisitor(e)
}
func (e *extendInputObjectTypeDefinitionVisitor) EnterDocument(operation, _ *ast.Document) {
e.document = operation
}
func (e *extendInputObjectTypeDefinitionVisitor) EnterInputObjectTypeExtension(ref int) {
nodes, exists := e.document.Index.NodesByNameBytes(e.document.InputObjectTypeExtensionNameBytes(ref))
if !exists {
return
}
hasExtended := false
for i := range nodes {
if nodes[i].Kind != ast.NodeKindInputObjectTypeDefinition {
continue
}
if hasExtended {
e.StopWithExternalErr(operationreport.ErrSharedTypesMustNotBeExtended(e.document.InputObjectTypeExtensionNameString(ref)))
return
}
e.document.ExtendInputObjectTypeDefinitionByInputObjectTypeExtension(nodes[i].Ref, ref)
hasExtended = true
}
if !hasExtended {
e.StopWithExternalErr(operationreport.ErrExtensionOrphansMustResolveInSupergraph(e.document.InputObjectTypeExtensionNameBytes(ref)))
}
}
+63
View File
@@ -0,0 +1,63 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
func newExtendInterfaceTypeDefinition(collectedEntities entitySet) *extendInterfaceTypeDefinitionVisitor {
return &extendInterfaceTypeDefinitionVisitor{
collectedEntities: collectedEntities,
}
}
type extendInterfaceTypeDefinitionVisitor struct {
*astvisitor.Walker
document *ast.Document
collectedEntities entitySet
}
func (e *extendInterfaceTypeDefinitionVisitor) Register(walker *astvisitor.Walker) {
e.Walker = walker
walker.RegisterEnterDocumentVisitor(e)
walker.RegisterEnterInterfaceTypeExtensionVisitor(e)
}
func (e *extendInterfaceTypeDefinitionVisitor) EnterDocument(operation, _ *ast.Document) {
e.document = operation
}
func (e *extendInterfaceTypeDefinitionVisitor) EnterInterfaceTypeExtension(ref int) {
nameBytes := e.document.InterfaceTypeExtensionNameBytes(ref)
nodes, exists := e.document.Index.NodesByNameBytes(nameBytes)
if !exists {
return
}
var nodeToExtend *ast.Node
isEntity := false
for i := range nodes {
if nodes[i].Kind != ast.NodeKindInterfaceTypeDefinition {
continue
}
if nodeToExtend != nil {
e.StopWithExternalErr(*multipleExtensionError(isEntity, nameBytes))
return
}
var err *operationreport.ExternalError
extension := e.document.InterfaceTypeExtensions[ref]
if isEntity, err = e.collectedEntities.isExtensionForEntity(nameBytes, extension.Directives.Refs, e.document); err != nil {
e.StopWithExternalErr(*err)
return
}
nodeToExtend = &nodes[i]
}
if nodeToExtend == nil {
e.StopWithExternalErr(operationreport.ErrExtensionOrphansMustResolveInSupergraph(e.document.InterfaceTypeExtensionNameBytes(ref)))
return
}
e.document.ExtendInterfaceTypeDefinitionByInterfaceTypeExtension(nodeToExtend.Ref, ref)
}
+62
View File
@@ -0,0 +1,62 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
type mergeDuplicatedFieldsVisitor struct {
*astvisitor.Walker
document *ast.Document
}
func newMergeDuplicatedFieldsVisitor() *mergeDuplicatedFieldsVisitor {
return &mergeDuplicatedFieldsVisitor{
nil,
nil,
}
}
func (m *mergeDuplicatedFieldsVisitor) Register(walker *astvisitor.Walker) {
m.Walker = walker
walker.RegisterEnterDocumentVisitor(m)
walker.RegisterLeaveObjectTypeDefinitionVisitor(m)
}
func (m *mergeDuplicatedFieldsVisitor) EnterDocument(document, _ *ast.Document) {
m.document = document
}
func (m *mergeDuplicatedFieldsVisitor) LeaveObjectTypeDefinition(ref int) {
var refsForDeletion []int
fieldByTypeRefSet := make(map[string]int)
for _, fieldRef := range m.document.ObjectTypeDefinitions[ref].FieldsDefinition.Refs {
fieldName := m.document.FieldDefinitionNameString(fieldRef)
newTypeRef := m.document.FieldDefinitions[fieldRef].Type
if oldTypeRef, ok := fieldByTypeRefSet[fieldName]; ok {
if m.document.TypesAreEqualDeep(oldTypeRef, newTypeRef) {
refsForDeletion = append(refsForDeletion, fieldRef)
continue
}
oldFieldTypeNameBytes, err := m.document.PrintTypeBytes(oldTypeRef, nil)
if err != nil {
m.StopWithInternalErr(err)
return
}
newFieldTypeNameBytes, err := m.document.PrintTypeBytes(newTypeRef, nil)
if err != nil {
m.StopWithInternalErr(err)
return
}
m.StopWithExternalErr(operationreport.ErrDuplicateFieldsMustBeIdentical(
fieldName, m.document.ObjectTypeDefinitionNameString(ref), string(oldFieldTypeNameBytes), string(newFieldTypeNameBytes),
))
return
}
fieldByTypeRefSet[fieldName] = newTypeRef
}
m.document.RemoveFieldDefinitionsFromObjectTypeDefinition(refsForDeletion, ref)
}
+66
View File
@@ -0,0 +1,66 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
func newExtendObjectTypeDefinition(collectedEntities entitySet) *extendObjectTypeDefinitionVisitor {
return &extendObjectTypeDefinitionVisitor{
collectedEntities: collectedEntities,
}
}
type extendObjectTypeDefinitionVisitor struct {
*astvisitor.Walker
document *ast.Document
collectedEntities entitySet
}
func (e *extendObjectTypeDefinitionVisitor) Register(walker *astvisitor.Walker) {
e.Walker = walker
walker.RegisterEnterDocumentVisitor(e)
walker.RegisterEnterObjectTypeExtensionVisitor(e)
}
func (e *extendObjectTypeDefinitionVisitor) EnterDocument(operation, _ *ast.Document) {
e.document = operation
}
func (e *extendObjectTypeDefinitionVisitor) EnterObjectTypeExtension(ref int) {
nameBytes := e.document.ObjectTypeExtensionNameBytes(ref)
nodes, exists := e.document.Index.NodesByNameBytes(nameBytes)
if !exists {
return
}
var nodeToExtend *ast.Node
isEntity := false
for i := range nodes {
if nodes[i].Kind != ast.NodeKindObjectTypeDefinition {
continue
}
if nodeToExtend != nil {
e.StopWithExternalErr(*multipleExtensionError(isEntity, nameBytes))
return
}
var err *operationreport.ExternalError
extension := e.document.ObjectTypeExtensions[ref]
if isEntity, err = e.collectedEntities.isExtensionForEntity(nameBytes, extension.Directives.Refs, e.document); err != nil {
e.StopWithExternalErr(*err)
return
}
nodeToExtend = &nodes[i]
if ast.IsRootType(nameBytes) {
break
}
}
if nodeToExtend == nil {
e.StopWithExternalErr(operationreport.ErrExtensionOrphansMustResolveInSupergraph(nameBytes))
return
}
e.document.ExtendObjectTypeDefinitionByObjectTypeExtension(nodeToExtend.Ref, ref)
}
@@ -0,0 +1,107 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
type removeDuplicateFieldedSharedTypesVisitor struct {
*astvisitor.Walker
document *ast.Document
sharedTypeSet map[string]fieldedSharedType
rootNodesToRemove []ast.Node
lastInputRef int
lastInterfaceRef int
lastObjectRef int
}
func newRemoveDuplicateFieldedSharedTypesVisitor() *removeDuplicateFieldedSharedTypesVisitor {
return &removeDuplicateFieldedSharedTypesVisitor{
nil,
nil,
make(map[string]fieldedSharedType),
nil,
ast.InvalidRef,
ast.InvalidRef,
ast.InvalidRef,
}
}
func (r *removeDuplicateFieldedSharedTypesVisitor) Register(walker *astvisitor.Walker) {
r.Walker = walker
walker.RegisterEnterDocumentVisitor(r)
walker.RegisterEnterInputObjectTypeDefinitionVisitor(r)
walker.RegisterEnterInterfaceTypeDefinitionVisitor(r)
walker.RegisterEnterObjectTypeDefinitionVisitor(r)
walker.RegisterLeaveDocumentVisitor(r)
}
func (r *removeDuplicateFieldedSharedTypesVisitor) EnterDocument(operation, _ *ast.Document) {
r.document = operation
}
func (r *removeDuplicateFieldedSharedTypesVisitor) EnterInputObjectTypeDefinition(ref int) {
if ref <= r.lastInputRef {
return
}
name := r.document.InputObjectTypeDefinitionNameString(ref)
refs := r.document.InputObjectTypeDefinitions[ref].InputFieldsDefinition.Refs
input, exists := r.sharedTypeSet[name]
if exists {
if !input.areFieldsIdentical(refs) {
r.StopWithExternalErr(operationreport.ErrSharedTypesMustBeIdenticalToFederate(name))
return
}
r.rootNodesToRemove = append(r.rootNodesToRemove, ast.Node{Kind: ast.NodeKindInputObjectTypeDefinition, Ref: ref})
} else {
r.sharedTypeSet[name] = newFieldedSharedType(r.document, ast.NodeKindInputValueDefinition, refs)
}
r.lastInputRef = ref
}
func (r *removeDuplicateFieldedSharedTypesVisitor) EnterInterfaceTypeDefinition(ref int) {
if ref <= r.lastInterfaceRef {
return
}
name := r.document.InterfaceTypeDefinitionNameString(ref)
interfaceType := r.document.InterfaceTypeDefinitions[ref]
refs := interfaceType.FieldsDefinition.Refs
iFace, exists := r.sharedTypeSet[name]
if exists {
if !iFace.areFieldsIdentical(refs) {
r.StopWithExternalErr(operationreport.ErrSharedTypesMustBeIdenticalToFederate(name))
return
}
r.rootNodesToRemove = append(r.rootNodesToRemove, ast.Node{Kind: ast.NodeKindInterfaceTypeDefinition, Ref: ref})
} else {
r.sharedTypeSet[name] = newFieldedSharedType(r.document, ast.NodeKindFieldDefinition, refs)
}
r.lastInterfaceRef = ref
}
func (r *removeDuplicateFieldedSharedTypesVisitor) EnterObjectTypeDefinition(ref int) {
if ref <= r.lastObjectRef {
return
}
name := r.document.ObjectTypeDefinitionNameString(ref)
objectType := r.document.ObjectTypeDefinitions[ref]
refs := objectType.FieldsDefinition.Refs
object, exists := r.sharedTypeSet[name]
if exists {
if !object.areFieldsIdentical(refs) {
r.StopWithExternalErr(operationreport.ErrSharedTypesMustBeIdenticalToFederate(name))
return
}
r.rootNodesToRemove = append(r.rootNodesToRemove, ast.Node{Kind: ast.NodeKindObjectTypeDefinition, Ref: ref})
} else {
r.sharedTypeSet[name] = newFieldedSharedType(r.document, ast.NodeKindFieldDefinition, refs)
}
r.lastObjectRef = ref
}
func (r *removeDuplicateFieldedSharedTypesVisitor) LeaveDocument(_, _ *ast.Document) {
if r.rootNodesToRemove != nil {
r.document.DeleteRootNodes(r.rootNodesToRemove)
}
}
@@ -0,0 +1,98 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
type removeDuplicateFieldlessSharedTypesVisitor struct {
*astvisitor.Walker
document *ast.Document
sharedTypeSet map[string]fieldlessSharedType
rootNodesToRemove []ast.Node
lastEnumRef int
lastUnionRef int
lastScalarRef int
}
func newRemoveDuplicateFieldlessSharedTypesVisitor() *removeDuplicateFieldlessSharedTypesVisitor {
return &removeDuplicateFieldlessSharedTypesVisitor{
nil,
nil,
make(map[string]fieldlessSharedType),
nil,
ast.InvalidRef,
ast.InvalidRef,
ast.InvalidRef,
}
}
func (r *removeDuplicateFieldlessSharedTypesVisitor) Register(walker *astvisitor.Walker) {
r.Walker = walker
walker.RegisterEnterDocumentVisitor(r)
walker.RegisterEnterEnumTypeDefinitionVisitor(r)
walker.RegisterEnterScalarTypeDefinitionVisitor(r)
walker.RegisterEnterUnionTypeDefinitionVisitor(r)
walker.RegisterLeaveDocumentVisitor(r)
}
func (r *removeDuplicateFieldlessSharedTypesVisitor) EnterDocument(operation, _ *ast.Document) {
r.document = operation
}
func (r *removeDuplicateFieldlessSharedTypesVisitor) EnterEnumTypeDefinition(ref int) {
if ref <= r.lastEnumRef {
return
}
name := r.document.EnumTypeDefinitionNameString(ref)
enum, exists := r.sharedTypeSet[name]
if exists {
if !enum.areValuesIdentical(r.document.EnumTypeDefinitions[ref].EnumValuesDefinition.Refs) {
r.StopWithExternalErr(operationreport.ErrSharedTypesMustBeIdenticalToFederate(name))
return
}
r.rootNodesToRemove = append(r.rootNodesToRemove, ast.Node{Kind: ast.NodeKindEnumTypeDefinition, Ref: ref})
} else {
r.sharedTypeSet[name] = newEnumSharedType(r.document, ref)
}
r.lastEnumRef = ref
}
func (r *removeDuplicateFieldlessSharedTypesVisitor) EnterScalarTypeDefinition(ref int) {
if ref <= r.lastScalarRef {
return
}
name := r.document.ScalarTypeDefinitionNameString(ref)
_, exists := r.sharedTypeSet[name]
if exists {
r.rootNodesToRemove = append(r.rootNodesToRemove, ast.Node{Kind: ast.NodeKindScalarTypeDefinition, Ref: ref})
} else {
r.sharedTypeSet[name] = scalarSharedType{}
}
r.lastScalarRef = ref
}
func (r *removeDuplicateFieldlessSharedTypesVisitor) EnterUnionTypeDefinition(ref int) {
if ref <= r.lastUnionRef {
return
}
name := r.document.UnionTypeDefinitionNameString(ref)
union, exists := r.sharedTypeSet[name]
if exists {
if !union.areValuesIdentical(r.document.UnionTypeDefinitions[ref].UnionMemberTypes.Refs) {
r.StopWithExternalErr(operationreport.ErrSharedTypesMustBeIdenticalToFederate(name))
return
}
r.rootNodesToRemove = append(r.rootNodesToRemove, ast.Node{Kind: ast.NodeKindUnionTypeDefinition, Ref: ref})
} else {
r.sharedTypeSet[name] = newUnionSharedType(r.document, ref)
}
r.lastUnionRef = ref
}
func (r *removeDuplicateFieldlessSharedTypesVisitor) LeaveDocument(_, _ *ast.Document) {
if r.rootNodesToRemove != nil {
r.document.DeleteRootNodes(r.rootNodesToRemove)
}
}
@@ -0,0 +1,32 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
)
func newRemoveEmptyObjectTypeDefinition() *removeEmptyObjectTypeDefinition {
return &removeEmptyObjectTypeDefinition{}
}
type removeEmptyObjectTypeDefinition struct{}
func (r *removeEmptyObjectTypeDefinition) Register(walker *astvisitor.Walker) {
walker.RegisterLeaveDocumentVisitor(r)
}
func (r *removeEmptyObjectTypeDefinition) LeaveDocument(operation, _ *ast.Document) {
for ref := range operation.ObjectTypeDefinitions {
if operation.ObjectTypeDefinitions[ref].HasFieldDefinitions {
continue
}
name := operation.ObjectTypeDefinitionNameString(ref)
node, ok := operation.Index.FirstNodeByNameStr(name)
if !ok {
return
}
operation.RemoveRootNode(node)
}
}
@@ -0,0 +1,46 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
)
func newRemoveFieldDefinitions(directives ...string) *removeFieldDefinitionByDirective {
directivesSet := make(map[string]struct{}, len(directives))
for _, directive := range directives {
directivesSet[directive] = struct{}{}
}
return &removeFieldDefinitionByDirective{
directives: directivesSet,
}
}
type removeFieldDefinitionByDirective struct {
operation *ast.Document
directives map[string]struct{}
}
func (r *removeFieldDefinitionByDirective) Register(walker *astvisitor.Walker) {
walker.RegisterEnterDocumentVisitor(r)
walker.RegisterLeaveObjectTypeDefinitionVisitor(r)
}
func (r *removeFieldDefinitionByDirective) EnterDocument(operation, _ *ast.Document) {
r.operation = operation
}
func (r *removeFieldDefinitionByDirective) LeaveObjectTypeDefinition(ref int) {
var refsForDeletion []int
// select fields for deletion
for _, fieldRef := range r.operation.ObjectTypeDefinitions[ref].FieldsDefinition.Refs {
for _, directiveRef := range r.operation.FieldDefinitions[fieldRef].Directives.Refs {
directiveName := r.operation.DirectiveNameString(directiveRef)
if _, ok := r.directives[directiveName]; ok {
refsForDeletion = append(refsForDeletion, fieldRef)
}
}
}
// delete fields
r.operation.RemoveFieldDefinitionsFromObjectTypeDefinition(refsForDeletion, ref)
}
@@ -0,0 +1,44 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
)
func newRemoveFieldDefinitionDirective(directives ...string) *removeFieldDefinitionDirective {
directivesSet := make(map[string]struct{}, len(directives))
for _, directive := range directives {
directivesSet[directive] = struct{}{}
}
return &removeFieldDefinitionDirective{
directives: directivesSet,
}
}
type removeFieldDefinitionDirective struct {
operation *ast.Document
directives map[string]struct{}
}
func (r *removeFieldDefinitionDirective) Register(walker *astvisitor.Walker) {
walker.RegisterEnterDocumentVisitor(r)
walker.RegisterEnterFieldDefinitionVisitor(r)
}
func (r *removeFieldDefinitionDirective) EnterDocument(operation, _ *ast.Document) {
r.operation = operation
}
func (r *removeFieldDefinitionDirective) EnterFieldDefinition(ref int) {
var refsForDeletion []int
// select directives for deletion
for _, directiveRef := range r.operation.FieldDefinitions[ref].Directives.Refs {
directiveName := r.operation.DirectiveNameString(directiveRef)
if _, ok := r.directives[directiveName]; ok {
refsForDeletion = append(refsForDeletion, directiveRef)
}
}
// delete directives
r.operation.RemoveDirectivesFromNode(ast.Node{Kind: ast.NodeKindFieldDefinition, Ref: ref}, refsForDeletion)
}
@@ -0,0 +1,45 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
)
func newRemoveInterfaceDefinitionDirective(directives ...string) *removeInterfaceDefinitionDirective {
directivesSet := make(map[string]struct{}, len(directives))
for _, directive := range directives {
directivesSet[directive] = struct{}{}
}
return &removeInterfaceDefinitionDirective{
directives: directivesSet,
}
}
type removeInterfaceDefinitionDirective struct {
*astvisitor.Walker
operation *ast.Document
directives map[string]struct{}
}
func (r *removeInterfaceDefinitionDirective) Register(walker *astvisitor.Walker) {
walker.RegisterEnterDocumentVisitor(r)
walker.RegisterEnterInterfaceTypeDefinitionVisitor(r)
}
func (r *removeInterfaceDefinitionDirective) EnterDocument(operation, _ *ast.Document) {
r.operation = operation
}
func (r *removeInterfaceDefinitionDirective) EnterInterfaceTypeDefinition(ref int) {
var refsForDeletion []int
// select fields for deletion
for _, directiveRef := range r.operation.InterfaceTypeDefinitions[ref].Directives.Refs {
directiveName := r.operation.DirectiveNameString(directiveRef)
if _, ok := r.directives[directiveName]; ok {
refsForDeletion = append(refsForDeletion, directiveRef)
}
}
// delete directives
r.operation.RemoveDirectivesFromNode(ast.Node{Kind: ast.NodeKindInterfaceTypeDefinition, Ref: ref}, refsForDeletion)
}
@@ -0,0 +1,44 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
)
func newRemoveObjectTypeDefinitionDirective(directives ...string) *removeObjectTypeDefinitionDirective {
directivesSet := make(map[string]struct{}, len(directives))
for _, directive := range directives {
directivesSet[directive] = struct{}{}
}
return &removeObjectTypeDefinitionDirective{
directives: directivesSet,
}
}
type removeObjectTypeDefinitionDirective struct {
operation *ast.Document
directives map[string]struct{}
}
func (r *removeObjectTypeDefinitionDirective) Register(walker *astvisitor.Walker) {
walker.RegisterEnterDocumentVisitor(r)
walker.RegisterEnterObjectTypeDefinitionVisitor(r)
}
func (r *removeObjectTypeDefinitionDirective) EnterDocument(operation, _ *ast.Document) {
r.operation = operation
}
func (r *removeObjectTypeDefinitionDirective) EnterObjectTypeDefinition(ref int) {
var refsForDeletion []int
// select fields for deletion
for _, directiveRef := range r.operation.ObjectTypeDefinitions[ref].Directives.Refs {
directiveName := r.operation.DirectiveNameString(directiveRef)
if _, ok := r.directives[directiveName]; ok {
refsForDeletion = append(refsForDeletion, directiveRef)
}
}
// delete directives
r.operation.RemoveDirectivesFromNode(ast.Node{Kind: ast.NodeKindObjectTypeDefinition, Ref: ref}, refsForDeletion)
}
+20
View File
@@ -0,0 +1,20 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
)
func newRemoveMergedTypeExtensions() *removeMergedTypeExtensionsVisitor {
return &removeMergedTypeExtensionsVisitor{}
}
type removeMergedTypeExtensionsVisitor struct{}
func (r *removeMergedTypeExtensionsVisitor) Register(walker *astvisitor.Walker) {
walker.RegisterLeaveDocumentVisitor(r)
}
func (r *removeMergedTypeExtensionsVisitor) LeaveDocument(operation, definition *ast.Document) {
operation.RemoveMergedTypeExtensions()
}
+49
View File
@@ -0,0 +1,49 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
func newExtendScalarTypeDefinition() *extendScalarTypeDefinitionVisitor {
return &extendScalarTypeDefinitionVisitor{}
}
type extendScalarTypeDefinitionVisitor struct {
*astvisitor.Walker
document *ast.Document
}
func (e *extendScalarTypeDefinitionVisitor) Register(walker *astvisitor.Walker) {
e.Walker = walker
walker.RegisterEnterDocumentVisitor(e)
walker.RegisterEnterScalarTypeExtensionVisitor(e)
}
func (e *extendScalarTypeDefinitionVisitor) EnterDocument(operation, _ *ast.Document) {
e.document = operation
}
func (e *extendScalarTypeDefinitionVisitor) EnterScalarTypeExtension(ref int) {
nodes, exists := e.document.Index.NodesByNameBytes(e.document.ScalarTypeExtensionNameBytes(ref))
if !exists {
return
}
hasExtended := false
for i := range nodes {
if nodes[i].Kind != ast.NodeKindScalarTypeDefinition {
continue
}
if hasExtended {
e.StopWithExternalErr(operationreport.ErrSharedTypesMustNotBeExtended(e.document.ScalarTypeExtensionNameString(ref)))
return
}
e.document.ExtendScalarTypeDefinitionByScalarTypeExtension(nodes[i].Ref, ref)
hasExtended = true
}
if !hasExtended {
e.StopWithExternalErr(operationreport.ErrExtensionOrphansMustResolveInSupergraph(e.document.ScalarTypeExtensionNameBytes(ref)))
}
}
+205
View File
@@ -0,0 +1,205 @@
package sdlmerge
import (
"fmt"
"strings"
"github.com/wundergraph/graphql-go-tools/v2/pkg/asttransform"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvalidation"
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astnormalization"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astparser"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astprinter"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
const (
rootOperationTypeDefinitions = `
type Query {}
type Mutation {}
type Subscription {}
`
parseDocumentError = "parse graphql document string: %w"
)
type Visitor interface {
Register(walker *astvisitor.Walker)
}
func MergeAST(ast *ast.Document) error {
normalizer := normalizer{}
normalizer.setupWalkers()
return normalizer.normalize(ast)
}
func MergeSDLs(SDLs ...string) (string, error) {
rawDocs := make([]string, 0, len(SDLs)+1)
rawDocs = append(rawDocs, rootOperationTypeDefinitions)
rawDocs = append(rawDocs, SDLs...)
if validationError := validateSubgraphs(rawDocs[1:]); validationError != nil {
return "", validationError
}
if normalizationError := normalizeSubgraphs(rawDocs[1:]); normalizationError != nil {
return "", normalizationError
}
doc, report := astparser.ParseGraphqlDocumentString(strings.Join(rawDocs, "\n"))
if report.HasErrors() {
return "", fmt.Errorf("parse graphql document string: %w", report)
}
astnormalization.NormalizeSubgraphSDL(&doc, &report)
if report.HasErrors() {
return "", fmt.Errorf("merge ast: %w", report)
}
if err := MergeAST(&doc); err != nil {
return "", fmt.Errorf("merge ast: %w", err)
}
out, err := astprinter.PrintString(&doc)
if err != nil {
return "", fmt.Errorf("stringify schema: %w", err)
}
return out, nil
}
func validateSubgraphs(subgraphs []string) error {
validator := astvalidation.NewDefinitionValidator(
astvalidation.PopulatedTypeBodies(), astvalidation.KnownTypeNames(),
)
for _, subgraph := range subgraphs {
doc, report := astparser.ParseGraphqlDocumentString(subgraph)
if err := asttransform.MergeDefinitionWithBaseSchema(&doc); err != nil {
return err
}
if report.HasErrors() {
return fmt.Errorf(parseDocumentError, report)
}
validator.Validate(&doc, &report)
if report.HasErrors() {
return fmt.Errorf("validate schema: %w", report)
}
}
return nil
}
func normalizeSubgraphs(subgraphs []string) error {
subgraphNormalizer := astnormalization.NewSubgraphDefinitionNormalizer()
for i, subgraph := range subgraphs {
doc, report := astparser.ParseGraphqlDocumentString(subgraph)
if report.HasErrors() {
return fmt.Errorf(parseDocumentError, report)
}
subgraphNormalizer.NormalizeDefinition(&doc, &report)
if report.HasErrors() {
return fmt.Errorf("normalize schema: %w", report)
}
out, err := astprinter.PrintString(&doc)
if err != nil {
return fmt.Errorf("stringify schema: %w", err)
}
subgraphs[i] = out
}
return nil
}
type normalizer struct {
walkers []*astvisitor.Walker
}
type entitySet map[string]struct{}
func (m *normalizer) setupWalkers() {
collectedEntities := make(entitySet)
visitorGroups := [][]Visitor{
{
newCollectEntitiesVisitor(collectedEntities),
},
{
newExtendEnumTypeDefinition(),
newExtendInputObjectTypeDefinition(),
newExtendInterfaceTypeDefinition(collectedEntities),
newExtendScalarTypeDefinition(),
newExtendUnionTypeDefinition(),
newExtendObjectTypeDefinition(collectedEntities),
newRemoveEmptyObjectTypeDefinition(),
newRemoveMergedTypeExtensions(),
},
// visitors for cleaning up federated duplicated fields and directives
{
newRemoveFieldDefinitions("external"),
newRemoveDuplicateFieldedSharedTypesVisitor(),
newRemoveDuplicateFieldlessSharedTypesVisitor(),
newMergeDuplicatedFieldsVisitor(),
newRemoveInterfaceDefinitionDirective("key"),
newRemoveObjectTypeDefinitionDirective("key"),
newRemoveFieldDefinitionDirective("provides", "requires"),
},
}
for _, visitorGroup := range visitorGroups {
walker := astvisitor.NewWalker(48)
for _, visitor := range visitorGroup {
visitor.Register(&walker)
m.walkers = append(m.walkers, &walker)
}
}
}
func (m *normalizer) normalize(operation *ast.Document) error {
report := operationreport.Report{}
for _, walker := range m.walkers {
walker.Walk(operation, nil, &report)
if report.HasErrors() {
return fmt.Errorf("walk: %w", report)
}
}
return nil
}
func (e entitySet) isExtensionForEntity(nameBytes []byte, directiveRefs []int, document *ast.Document) (bool, *operationreport.ExternalError) {
name := string(nameBytes)
hasDirectives := len(directiveRefs) > 0
if _, exists := e[name]; !exists {
if !hasDirectives || !isEntityExtension(directiveRefs, document) {
return false, nil
}
err := operationreport.ErrExtensionWithKeyDirectiveMustExtendEntity(name)
return false, &err
}
if !hasDirectives {
err := operationreport.ErrEntityExtensionMustHaveKeyDirective(name)
return false, &err
}
if isEntityExtension(directiveRefs, document) {
return true, nil
}
err := operationreport.ErrEntityExtensionMustHaveKeyDirective(name)
return false, &err
}
func isEntityExtension(directiveRefs []int, document *ast.Document) bool {
for _, directiveRef := range directiveRefs {
if document.DirectiveNameString(directiveRef) == "key" {
return true
}
}
return false
}
func multipleExtensionError(isEntity bool, nameBytes []byte) *operationreport.ExternalError {
if isEntity {
err := operationreport.ErrEntitiesMustNotBeDuplicated(string(nameBytes))
return &err
}
err := operationreport.ErrSharedTypesMustNotBeExtended(string(nameBytes))
return &err
}
+167
View File
@@ -0,0 +1,167 @@
package sdlmerge
import "github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
type fieldlessSharedType interface {
areValuesIdentical(valueRefsToCompare []int) bool
valueRefs() []int
valueName(ref int) string
}
func createValueSet(f fieldlessSharedType) map[string]bool {
valueSet := make(map[string]bool)
for _, valueRef := range f.valueRefs() {
valueSet[f.valueName(valueRef)] = true
}
return valueSet
}
type fieldedSharedType struct {
document *ast.Document
fieldKind ast.NodeKind
fieldRefs []int
fieldSet map[string]int
}
func newFieldedSharedType(document *ast.Document, fieldKind ast.NodeKind, fieldRefs []int) fieldedSharedType {
f := fieldedSharedType{
document,
fieldKind,
fieldRefs,
nil,
}
f.createFieldSet()
return f
}
func (f fieldedSharedType) areFieldsIdentical(fieldRefsToCompare []int) bool {
if len(f.fieldRefs) != len(fieldRefsToCompare) {
return false
}
for _, fieldRef := range fieldRefsToCompare {
actualFieldName := f.fieldName(fieldRef)
expectedTypeRef, exists := f.fieldSet[actualFieldName]
if !exists {
return false
}
actualTypeRef := f.fieldTypeRef(fieldRef)
if !f.document.TypesAreCompatibleDeep(expectedTypeRef, actualTypeRef) {
return false
}
}
return true
}
func (f *fieldedSharedType) createFieldSet() {
fieldSet := make(map[string]int)
for _, fieldRef := range f.fieldRefs {
fieldSet[f.fieldName(fieldRef)] = f.fieldTypeRef(fieldRef)
}
f.fieldSet = fieldSet
}
func (f fieldedSharedType) fieldName(ref int) string {
switch f.fieldKind {
case ast.NodeKindInputValueDefinition:
return f.document.InputValueDefinitionNameString(ref)
default:
return f.document.FieldDefinitionNameString(ref)
}
}
func (f fieldedSharedType) fieldTypeRef(ref int) int {
switch f.fieldKind {
case ast.NodeKindInputValueDefinition:
return f.document.InputValueDefinitions[ref].Type
default:
return f.document.FieldDefinitions[ref].Type
}
}
type enumSharedType struct {
*ast.EnumTypeDefinition
document *ast.Document
valueSet map[string]bool
}
func newEnumSharedType(document *ast.Document, ref int) enumSharedType {
e := enumSharedType{
&document.EnumTypeDefinitions[ref],
document,
nil,
}
e.valueSet = createValueSet(e)
return e
}
func (e enumSharedType) areValuesIdentical(valueRefsToCompare []int) bool {
if len(e.valueRefs()) != len(valueRefsToCompare) {
return false
}
for _, valueRefToCompare := range valueRefsToCompare {
name := e.valueName(valueRefToCompare)
if !e.valueSet[name] {
return false
}
}
return true
}
func (e enumSharedType) valueRefs() []int {
return e.EnumValuesDefinition.Refs
}
func (e enumSharedType) valueName(ref int) string {
return e.document.EnumValueDefinitionNameString(ref)
}
type unionSharedType struct {
*ast.UnionTypeDefinition
document *ast.Document
valueSet map[string]bool
}
func newUnionSharedType(document *ast.Document, ref int) unionSharedType {
u := unionSharedType{
&document.UnionTypeDefinitions[ref],
document,
nil,
}
u.valueSet = createValueSet(u)
return u
}
func (u unionSharedType) areValuesIdentical(valueRefsToCompare []int) bool {
if len(u.valueRefs()) != len(valueRefsToCompare) {
return false
}
for _, refToCompare := range valueRefsToCompare {
name := u.valueName(refToCompare)
if !u.valueSet[name] {
return false
}
}
return true
}
func (u unionSharedType) valueRefs() []int {
return u.UnionMemberTypes.Refs
}
func (u unionSharedType) valueName(ref int) string {
return u.document.TypeNameString(ref)
}
type scalarSharedType struct{}
func (scalarSharedType) areValuesIdentical(_ []int) bool {
return true
}
func (scalarSharedType) valueRefs() []int {
return nil
}
func (scalarSharedType) valueName(_ int) string {
return ""
}
+50
View File
@@ -0,0 +1,50 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
func newExtendUnionTypeDefinition() *extendUnionTypeDefinitionVisitor {
return &extendUnionTypeDefinitionVisitor{}
}
type extendUnionTypeDefinitionVisitor struct {
*astvisitor.Walker
document *ast.Document
}
func (e *extendUnionTypeDefinitionVisitor) Register(walker *astvisitor.Walker) {
e.Walker = walker
walker.RegisterEnterDocumentVisitor(e)
walker.RegisterEnterUnionTypeExtensionVisitor(e)
}
func (e *extendUnionTypeDefinitionVisitor) EnterDocument(operation, _ *ast.Document) {
e.document = operation
}
func (e *extendUnionTypeDefinitionVisitor) EnterUnionTypeExtension(ref int) {
nodes, exists := e.document.Index.NodesByNameBytes(e.document.UnionTypeExtensionNameBytes(ref))
if !exists {
return
}
hasExtended := false
for i := range nodes {
if nodes[i].Kind != ast.NodeKindUnionTypeDefinition {
continue
}
if hasExtended {
e.StopWithExternalErr(operationreport.ErrSharedTypesMustNotBeExtended(e.document.UnionTypeExtensionNameString(ref)))
return
}
e.document.ExtendUnionTypeDefinitionByUnionTypeExtension(nodes[i].Ref, ref)
hasExtended = true
}
if !hasExtended {
e.StopWithExternalErr(operationreport.ErrExtensionOrphansMustResolveInSupergraph(e.document.UnionTypeExtensionNameBytes(ref)))
}
}