diff --git a/go.mod b/go.mod
index a9ae90ac162..093a162a3ae 100644
--- a/go.mod
+++ b/go.mod
@@ -7,9 +7,9 @@ require (
github.com/XSAM/otelsql v0.23.0
github.com/alexedwards/scs/redisstore v0.0.0-20221223131519-238b052508b6
github.com/alexedwards/scs/v2 v2.8.0
- github.com/aws/aws-sdk-go-v2 v1.27.2
+ github.com/aws/aws-sdk-go-v2 v1.30.1
github.com/aws/aws-sdk-go-v2/config v1.27.14
- github.com/aws/aws-sdk-go-v2/credentials v1.17.14
+ github.com/aws/aws-sdk-go-v2/credentials v1.17.23
github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.4.6
github.com/aws/aws-sdk-go-v2/service/cloudwatchevents v1.23.6
github.com/aws/aws-sdk-go-v2/service/ecr v1.28.1
@@ -18,8 +18,8 @@ require (
github.com/aws/aws-sdk-go-v2/service/s3 v1.55.1
github.com/aws/aws-sdk-go-v2/service/ses v1.22.7
github.com/aws/aws-sdk-go-v2/service/ssm v1.50.2
- github.com/aws/aws-sdk-go-v2/service/sts v1.28.8
- github.com/aws/smithy-go v1.20.2
+ github.com/aws/aws-sdk-go-v2/service/sts v1.30.1
+ github.com/aws/smithy-go v1.20.3
github.com/benbjohnson/clock v1.3.5
github.com/codegangsta/gin v0.0.0-20211113050330-71f90109db02
github.com/disintegration/imaging v1.6.2
@@ -30,12 +30,12 @@ require (
github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df
github.com/go-logr/zapr v1.3.0
github.com/go-openapi/errors v0.22.0
- github.com/go-openapi/loads v0.21.5
+ github.com/go-openapi/loads v0.22.0
github.com/go-openapi/runtime v0.27.0
- github.com/go-openapi/spec v0.20.14
- github.com/go-openapi/strfmt v0.22.0
+ github.com/go-openapi/spec v0.21.0
+ github.com/go-openapi/strfmt v0.23.0
github.com/go-openapi/swag v0.23.0
- github.com/go-openapi/validate v0.23.0
+ github.com/go-openapi/validate v0.24.0
github.com/go-playground/validator/v10 v10.21.0
github.com/go-swagger/go-swagger v0.30.5
github.com/gobuffalo/envy v1.10.2
@@ -73,30 +73,30 @@ require (
github.com/tiaguinho/gosoap v1.4.4
github.com/vektra/mockery/v2 v2.33.2
github.com/xuri/excelize/v2 v2.8.1
- go.flipt.io/flipt/rpc/flipt v1.25.0
+ go.flipt.io/flipt/rpc/flipt v1.38.0
go.flipt.io/flipt/sdk/go v0.5.0
go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352
go.opentelemetry.io/contrib/detectors/aws/ecs v1.18.0
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.43.0
go.opentelemetry.io/contrib/instrumentation/runtime v0.43.0
go.opentelemetry.io/contrib/propagators/aws v1.18.0
- go.opentelemetry.io/otel v1.18.0
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.40.0
+ go.opentelemetry.io/otel v1.28.0
+ go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.18.0
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.40.0
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.17.0
- go.opentelemetry.io/otel/metric v1.18.0
- go.opentelemetry.io/otel/sdk v1.18.0
- go.opentelemetry.io/otel/sdk/metric v0.40.0
- go.opentelemetry.io/otel/trace v1.18.0
+ go.opentelemetry.io/otel/metric v1.28.0
+ go.opentelemetry.io/otel/sdk v1.28.0
+ go.opentelemetry.io/otel/sdk/metric v1.28.0
+ go.opentelemetry.io/otel/trace v1.28.0
go.uber.org/zap v1.26.0
- golang.org/x/crypto v0.23.0
- golang.org/x/net v0.25.0
+ golang.org/x/crypto v0.24.0
+ golang.org/x/net v0.26.0
golang.org/x/oauth2 v0.20.0
golang.org/x/text v0.16.0
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d
- google.golang.org/grpc v1.62.0
+ google.golang.org/grpc v1.64.0
gopkg.in/dnaeon/go-vcr.v3 v3.2.0
gotest.tools/gotestsum v1.12.0
pault.ag/go/pksigner v1.0.2
@@ -105,7 +105,7 @@ require (
require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/bitfield/gotestdox v0.2.2 // indirect
- github.com/cenkalti/backoff/v4 v4.2.1 // indirect
+ github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/lestrrat-go/backoff/v2 v2.0.8 // indirect
@@ -135,17 +135,17 @@ require (
github.com/Masterminds/sprig/v3 v3.2.3 // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect
- github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.2 // indirect
- github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.9 // indirect
- github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.9 // indirect
+ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.9 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.13 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.13 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.9 // indirect
- github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.11 // indirect
- github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.11 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.15 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.9 // indirect
- github.com/aws/aws-sdk-go-v2/service/sso v1.20.7 // indirect
- github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.1 // indirect
+ github.com/aws/aws-sdk-go-v2/service/sso v1.22.1 // indirect
+ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.1 // indirect
github.com/aymerick/douceur v0.2.0 // indirect
github.com/brunoscheufler/aws-ecs-metadata-go v0.0.0-20221221133751-67e37ae746cd // indirect
github.com/chigopher/pathlib v1.0.0 // indirect
@@ -159,12 +159,12 @@ require (
github.com/fatih/structs v1.1.0 // indirect
github.com/frankban/quicktest v1.14.6 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
- github.com/go-logr/logr v1.4.1 // indirect
+ github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
- github.com/go-openapi/analysis v0.22.2 // indirect
+ github.com/go-openapi/analysis v0.23.0 // indirect
github.com/go-openapi/inflect v0.19.0 // indirect
- github.com/go-openapi/jsonpointer v0.20.2 // indirect
- github.com/go-openapi/jsonreference v0.20.4 // indirect
+ github.com/go-openapi/jsonpointer v0.21.0 // indirect
+ github.com/go-openapi/jsonreference v0.21.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-sql-driver/mysql v1.8.1 // indirect
@@ -188,7 +188,7 @@ require (
github.com/gorilla/handlers v1.5.1 // indirect
github.com/gorilla/securecookie v1.1.1 // indirect
github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hhrutter/lzw v1.0.0 // indirect
github.com/hhrutter/tiff v1.0.1 // indirect
@@ -251,20 +251,19 @@ require (
github.com/urfave/cli v1.22.10 // indirect
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
go.flipt.io/flipt/errors v1.19.3 // indirect
- go.mongodb.org/mongo-driver v1.13.1 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.40.0 // indirect
- go.opentelemetry.io/proto/otlp v1.0.0 // indirect
+ go.mongodb.org/mongo-driver v1.14.0 // indirect
+ go.opentelemetry.io/proto/otlp v1.3.1 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/exp v0.0.0-20230905200255-921286631fa9
golang.org/x/image v0.18.0 // indirect
golang.org/x/mod v0.17.0 // indirect
golang.org/x/sync v0.7.0 // indirect
- golang.org/x/sys v0.20.0 // indirect
- golang.org/x/term v0.20.0 // indirect
+ golang.org/x/sys v0.21.0 // indirect
+ golang.org/x/term v0.21.0 // indirect
google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect
- google.golang.org/protobuf v1.33.0 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect
+ google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
diff --git a/go.sum b/go.sum
index c623c951c15..141fa917263 100644
--- a/go.sum
+++ b/go.sum
@@ -42,22 +42,22 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk=
-github.com/aws/aws-sdk-go-v2 v1.27.2 h1:pLsTXqX93rimAOZG2FIYraDQstZaaGVVN4tNw65v0h8=
-github.com/aws/aws-sdk-go-v2 v1.27.2/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM=
+github.com/aws/aws-sdk-go-v2 v1.30.1 h1:4y/5Dvfrhd1MxRDD77SrfsDaj8kUkkljU7XE83NPV+o=
+github.com/aws/aws-sdk-go-v2 v1.30.1/go.mod h1:nIQjQVp5sfpQcTc9mPSr1B0PaWK5ByX9MOoDadSN4lc=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg=
github.com/aws/aws-sdk-go-v2/config v1.27.14 h1:QOg8Ud53rrmdjBHX080AaYUBhG2ER28kP/yjE7afF/0=
github.com/aws/aws-sdk-go-v2/config v1.27.14/go.mod h1:CLgU27opbIwnjwH++zQPvF4qsEIqviKL6l8b1AtRImc=
-github.com/aws/aws-sdk-go-v2/credentials v1.17.14 h1:0y1IAEldTO2ZA3Lcq7u7y4Q2tUQlB3At2LZQijUHu3U=
-github.com/aws/aws-sdk-go-v2/credentials v1.17.14/go.mod h1:En2zXCfDZJgtbp2UnzHDgKMz+mSRc4pA3Ka+jxoJvaA=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.2 h1:HTAQSEibYaSioHzjOQssUJnE8itwVP9SzmdR6lqC38g=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.2/go.mod h1:NjUtmUEIimOc5tPw//xqKNK/spUqCTSbxjwzCrnsj8U=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.23 h1:G1CfmLVoO2TdQ8z9dW+JBc/r8+MqyPQhXCafNZcXVZo=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.23/go.mod h1:V/DvSURn6kKgcuKEk4qwSwb/fZ2d++FFARtWSbXnLqY=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.9 h1:Aznqksmd6Rfv2HQN9cpqIV/lQRMaIpJkLLaJ1ZI76no=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.9/go.mod h1:WQr3MY7AxGNxaqAtsDWn+fBxmd4XvLkzeqQ8P1VM0/w=
github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.4.6 h1:oooec6yfvcyH11bYJoCyUyogSW+3OElzkSs1drdBW3A=
github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.4.6/go.mod h1:fmGX8e+24AMyHWDj+UnKDHT15Zx14ebJRC1LF0RZjGo=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.9 h1:cy8ahBJuhtM8GTTSyOkfy6WVPV1IE+SS5/wfXUYuulw=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.9/go.mod h1:CZBXGLaJnEZI6EVNcPd7a6B5IC5cA/GkRWtu9fp3S6Y=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.9 h1:A4SYk07ef04+vxZToz9LWvAXl9LW0NClpPpMsi31cz0=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.9/go.mod h1:5jJcHuwDagxN+ErjQ3PU3ocf6Ylc/p9x+BLO/+X4iXw=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.13 h1:5SAoZ4jYpGH4721ZNoS1znQrhOfZinOhc4XuTXx/nVc=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.13/go.mod h1:+rdA6ZLpaSeM7tSg/B0IEDinCIBJGmW8rKDFkYpP04g=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.13 h1:WIijqeaAO7TYFLbhsZmi2rgLEAtWOC1LhxCAVTJlSKw=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.13/go.mod h1:i+kbfa76PQbWw/ULoWnp51EYVWH4ENln76fLQE3lXT8=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.9 h1:vHyZxoLVOgrI8GqX7OMHLXp4YYoxeEsrjweXKpye+ds=
@@ -68,12 +68,12 @@ github.com/aws/aws-sdk-go-v2/service/ecr v1.28.1 h1:tfeJG1axeFZX0O5HLOXMyq3W48zL
github.com/aws/aws-sdk-go-v2/service/ecr v1.28.1/go.mod h1:nGdQW8PlRj4S6mOxVlzT2iT9jIob+UDSvodzwc6DFhc=
github.com/aws/aws-sdk-go-v2/service/ecs v1.41.11 h1:/27vG0bgOsJmMqSbjCuF4UdEWZyRqPF9gQ4MYGiIEYc=
github.com/aws/aws-sdk-go-v2/service/ecs v1.41.11/go.mod h1:ixRB9qcKi35waDtPb6uw31Eb7Df+MOcjtpWxxPO5XvI=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 h1:dT3MqvGhSoaIhRseqw2I0yH81l7wiR2vjs57O51EAm8=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3/go.mod h1:GlAeCkHwugxdHaueRr4nhPuY+WW+gR8UjlcqzPr1SPI=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.11 h1:4vt9Sspk59EZyHCAEMaktHKiq0C09noRTQorXD/qV+s=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.11/go.mod h1:5jHR79Tv+Ccq6rwYh+W7Nptmw++WiFafMfR42XhwNl8=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.11 h1:o4T+fKxA3gTMcluBNZZXE9DNaMkJuUL1O3mffCUjoJo=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.11/go.mod h1:84oZdJ+VjuJKs9v1UTC9NaodRZRseOXCTgku+vQJWR8=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.15 h1:I9zMeF107l0rJrpnHpjEiiTSCKYAIw8mALiXcPsGBiA=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.15/go.mod h1:9xWJ3Q/S6Ojusz1UIkfycgD1mGirJfLLKqq3LPT7WN8=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.9 h1:TE2i0A9ErH1YfRSvXfCr2SQwfnqsoJT9nPQ9kj0lkxM=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.9/go.mod h1:9TzXX3MehQNGPwCZ3ka4CpwQsoAMWSF48/b+De9rfVM=
github.com/aws/aws-sdk-go-v2/service/rds v1.78.2 h1:xrRLjWcGzeayJT66aP9qnMrn1iKXYaK/+efukoitIXs=
@@ -84,14 +84,14 @@ github.com/aws/aws-sdk-go-v2/service/ses v1.22.7 h1:9Ytj+pcI/hOjX4m8bpjkbL05XB6G
github.com/aws/aws-sdk-go-v2/service/ses v1.22.7/go.mod h1:sn88fSJSI5LdRbjilmxp2TYs12A6619qj0z1D0fcbuE=
github.com/aws/aws-sdk-go-v2/service/ssm v1.50.2 h1:NgeX1fhHrhMqVgF9tydI7WIFDsqReuodPk9bgtQBHoM=
github.com/aws/aws-sdk-go-v2/service/ssm v1.50.2/go.mod h1:wuQ2iPrhZKnQ+beksnaWfmQPwSMLGtsLVVbb8MHvyYU=
-github.com/aws/aws-sdk-go-v2/service/sso v1.20.7 h1:sdPpNCoUijc0ntu024ZdjrXh3mB9rud5SjmE7djIfK4=
-github.com/aws/aws-sdk-go-v2/service/sso v1.20.7/go.mod h1:8RMeDMFTkkDQ5LvaaAykdkNVVR0eQxGWm8CD6uBvd1M=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.1 h1:/vljM1ZswUEIRHWVxEqDhLzOSGmDcstW2zeTt23Ipf0=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.1/go.mod h1:XhJksmKh1RYjMbWHf3ZwQF0UYJjlqrm45NVvDe54SOU=
-github.com/aws/aws-sdk-go-v2/service/sts v1.28.8 h1:FCYhQETaff4Skb2Hz9WoUqJAesr4MIQ9+TQ9ypjz7Ic=
-github.com/aws/aws-sdk-go-v2/service/sts v1.28.8/go.mod h1:s+7oFIwiOegfrF00xNowWwLAtRiA9xhvm1UpZdJ0aus=
-github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q=
-github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E=
+github.com/aws/aws-sdk-go-v2/service/sso v1.22.1 h1:p1GahKIjyMDZtiKoIn0/jAj/TkMzfzndDv5+zi2Mhgc=
+github.com/aws/aws-sdk-go-v2/service/sso v1.22.1/go.mod h1:/vWdhoIoYA5hYoPZ6fm7Sv4d8701PiG5VKe8/pPJL60=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.1 h1:lCEv9f8f+zJ8kcFeAjRZsekLd/x5SAm96Cva+VbUdo8=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.1/go.mod h1:xyFHA4zGxgYkdD73VeezHt3vSKEG9EmFnGwoKlP00u4=
+github.com/aws/aws-sdk-go-v2/service/sts v1.30.1 h1:+woJ607dllHJQtsnJLi52ycuqHMwlW+Wqm2Ppsfp4nQ=
+github.com/aws/aws-sdk-go-v2/service/sts v1.30.1/go.mod h1:jiNR3JqT15Dm+QWq2SRgh0x0bCNSRP2L25+CqPNpJlQ=
+github.com/aws/smithy-go v1.20.3 h1:ryHwveWzPV5BIof6fyDvor6V3iUL7nTfiTKXHiW05nE=
+github.com/aws/smithy-go v1.20.3/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E=
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
@@ -101,8 +101,8 @@ github.com/bitfield/gotestdox v0.2.2/go.mod h1:D+gwtS0urjBrzguAkTM2wodsTQYFHdpx8
github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/brunoscheufler/aws-ecs-metadata-go v0.0.0-20221221133751-67e37ae746cd h1:C0dfBzAdNMqxokqWUysk2KTJSMmqvh9cNW1opdy5+0Q=
github.com/brunoscheufler/aws-ecs-metadata-go v0.0.0-20221221133751-67e37ae746cd/go.mod h1:CeKhh8xSs3WZAc50xABMxu+FlfAAd5PNumo7NfOv7EE=
-github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
-github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
+github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
+github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/chigopher/pathlib v1.0.0 h1:SbsCrFX4vDf4M2d8mT/RTzuVlKOjTKoPHK0HidsQFak=
github.com/chigopher/pathlib v1.0.0/go.mod h1:3+YPPV21mU9vyw8Mjp+F33CyCfE6iOzinpiqBcccv7I=
@@ -169,34 +169,34 @@ github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df/go.mod h1:GJr+FCS
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
-github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/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-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg=
-github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0=
-github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo=
+github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU=
+github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo=
github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w=
github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE=
github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4=
github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4=
-github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q=
-github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs=
-github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU=
-github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4=
-github.com/go-openapi/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0=
-github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8=
+github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
+github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
+github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
+github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
+github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco=
+github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs=
github.com/go-openapi/runtime v0.27.0 h1:ukHSkyGp8gtDkwE1Mue2FofNh8kLfYv3xkCXWeLr0hM=
github.com/go-openapi/runtime v0.27.0/go.mod h1:fijeJEiEclyS8BRurYE1DE5TLb9/KZl6eAdbzjsrlLU=
-github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do=
-github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw=
-github.com/go-openapi/strfmt v0.22.0 h1:Ew9PnEYc246TwrEspvBdDHS4BVKXy/AOVsfqGDgAcaI=
-github.com/go-openapi/strfmt v0.22.0/go.mod h1:HzJ9kokGIju3/K6ap8jL+OlGAbjpSv27135Yr9OivU4=
+github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
+github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
+github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c=
+github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4=
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
-github.com/go-openapi/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw=
-github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSaEpHTJHtN5cbE=
+github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58=
+github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
@@ -261,15 +261,12 @@ github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68=
-github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
-github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/gomodule/redigo v1.8.0/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
github.com/gomodule/redigo v1.9.2 h1:HrutZBLhSIU8abiSfW8pj8mPhOyMYjZT/wcA4/L9L9s=
github.com/gomodule/redigo v1.9.2/go.mod h1:KsU3hiK/Ay8U42qpaJk+kuNa3C+spxapWpM+ywhcgtw=
@@ -278,7 +275,6 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
@@ -307,8 +303,8 @@ github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyC
github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1 h1:LSsiG61v9IzzxMkqEr6nrix4miJI62xlRjwT7BYD2SM=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1/go.mod h1:Hbb13e3/WtqQ8U5hLGkek9gJvBLasHuPFI0UEGfnQ10=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hhrutter/lzw v1.0.0 h1:laL89Llp86W3rRs83LvKbwYRx6INE8gDn0XNb1oXtm0=
@@ -402,7 +398,6 @@ github.com/jung-kurt/gofpdf v1.16.2/go.mod h1:1hl7y57EsiPAkLbOwzpzqgx1A30nQCk/Ym
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.0.10/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
@@ -503,7 +498,6 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
-github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/namsral/flag v1.7.4-pre h1:b2ScHhoCUkbsq0d2C15Mv+VU8bl8hAXV8arnWiOHNZs=
github.com/namsral/flag v1.7.4-pre/go.mod h1:OXldTctbM6SWH1K899kPZcf65KxJiD7MsceFUpB5yDo=
github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
@@ -638,9 +632,6 @@ github.com/urfave/cli v1.22.10 h1:p8Fspmz3iTctJstry1PYS3HVdllxnEzTEsgIgtxTrCk=
github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/vektra/mockery/v2 v2.33.2 h1:znIUwQ3FxnA5jvPy8irYBoiIqMZhuOJhoPOJYNoTJqU=
github.com/vektra/mockery/v2 v2.33.2/go.mod h1:9lREs4VEeQiUS3rizYQx1saxHu2JiIhThP0q9+fDegM=
-github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
-github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
-github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
@@ -650,18 +641,17 @@ github.com/xuri/excelize/v2 v2.8.1 h1:pZLMEwK8ep+CLIUWpWmvW8IWE/yxqG0I1xcN6cVMGu
github.com/xuri/excelize/v2 v2.8.1/go.mod h1:oli1E4C3Pa5RXg1TBXn4ENCXDV5JUMlBluUhG7c+CEE=
github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 h1:qhbILQo1K3mphbwKh1vNm4oGezE1eF9fQWmNiIpSfI4=
github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
-github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
go.flipt.io/flipt/errors v1.19.3 h1:mgQrT3XdambAdu4UykYZ3gm1NG7Ilri5Gt+nLafbJHY=
go.flipt.io/flipt/errors v1.19.3/go.mod h1:I2loVwHUoXy+yT7suRx7+pDiSyO1G7CHu6bby9DywyA=
-go.flipt.io/flipt/rpc/flipt v1.25.0 h1:BkIYs3kro8rK1yXK3+jStRXvAzq8eO/7+JeioHNxoq0=
-go.flipt.io/flipt/rpc/flipt v1.25.0/go.mod h1:H/P7nl/5lMo8uWiXyYGFX5LcOGL0ycWnlcLx3eaxJG4=
+go.flipt.io/flipt/rpc/flipt v1.38.0 h1:ukHaGzcZv2jcH6w05wOfwsLodL3EvpHXjbn1kV1VU7Y=
+go.flipt.io/flipt/rpc/flipt v1.38.0/go.mod h1:SyWdUD3mIgBC501vFp9jAZSX2tYpGJQHVV+MvOtqC5I=
go.flipt.io/flipt/sdk/go v0.5.0 h1:HiFUJ403rMWchlvFjCUyZHrQTgr7x+2ArPiTczAvGk4=
go.flipt.io/flipt/sdk/go v0.5.0/go.mod h1:XF9JWsiK41mNg5aDT3b7bzFxWUsc3Te3Gy5Ok3aijHc=
-go.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk=
-go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo=
+go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=
+go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 h1:CCriYyAfq1Br1aIYettdHZTy8mBTIPo7We18TuO/bak=
go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk=
go.opentelemetry.io/contrib/detectors/aws/ecs v1.18.0 h1:orZCNoMPHeYfDo0QFdSK29yYF8n7YoY9eSoZpPT7g/Y=
@@ -672,12 +662,10 @@ go.opentelemetry.io/contrib/instrumentation/runtime v0.43.0 h1:NunhgxcK14rU7Hw2g
go.opentelemetry.io/contrib/instrumentation/runtime v0.43.0/go.mod h1:rwb7icgpDjIhhHqv1qPGw6dDjAdAR7IKAe4PQdzBbsg=
go.opentelemetry.io/contrib/propagators/aws v1.18.0 h1:8SFScyYfxZK/MaW1iW17h/RhHNogbDtpwNJ6Ce95h0A=
go.opentelemetry.io/contrib/propagators/aws v1.18.0/go.mod h1:0ssYM4GfgGWeoJKLcXduZowVIbIlWd8zCY0CdQqYA0w=
-go.opentelemetry.io/otel v1.18.0 h1:TgVozPGZ01nHyDZxK5WGPFB9QexeTMXEH7+tIClWfzs=
-go.opentelemetry.io/otel v1.18.0/go.mod h1:9lWqYO0Db579XzVuCKFNPDl4s73Voa+zEck3wHaAYQI=
-go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.40.0 h1:MZbjiZeMmn5wFMORhozpouGKDxj9POHTuU5UA8msBQk=
-go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.40.0/go.mod h1:C7tOYVCJmrDTCwxNny0MuUtnDIR3032vFHYke0F2ZrU=
-go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.40.0 h1:q3FNPi8FLQVjLlmV+WWHQfH9ZCCtQIS0O/+dn1+4cJ4=
-go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.40.0/go.mod h1:rmx4n0uSIAkKBeQYkygcv9dENAlL2/tv3OSq68h1JAo=
+go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
+go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
+go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk=
+go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0 h1:IAtl+7gua134xcV3NieDhJHjjOVeJhXAnYf/0hswjUY=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0/go.mod h1:w+pXobnBzh95MNIkeIuAKcHe/Uu/CX2PKIvBP6ipKRA=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.18.0 h1:yE32ay7mJG2leczfREEhoW3VfSZIvHaB+gvVo1o8DQ8=
@@ -686,16 +674,16 @@ go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.40.0 h1:hf7JSONqAuXT1P
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.40.0/go.mod h1:IxD5qbw/XcnFB7i5k4d7J1aW5iBU2h4DgSxtk4YqR4c=
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.17.0 h1:Ut6hgtYcASHwCzRHkXEtSsM251cXJPW+Z9DyLwEn6iI=
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.17.0/go.mod h1:TYeE+8d5CjrgBa0ZuRaDeMpIC1xZ7atg4g+nInjuSjc=
-go.opentelemetry.io/otel/metric v1.18.0 h1:JwVzw94UYmbx3ej++CwLUQZxEODDj/pOuTCvzhtRrSQ=
-go.opentelemetry.io/otel/metric v1.18.0/go.mod h1:nNSpsVDjWGfb7chbRLUNW+PBNdcSTHD4Uu5pfFMOI0k=
-go.opentelemetry.io/otel/sdk v1.18.0 h1:e3bAB0wB3MljH38sHzpV/qWrOTCFrdZF2ct9F8rBkcY=
-go.opentelemetry.io/otel/sdk v1.18.0/go.mod h1:1RCygWV7plY2KmdskZEDDBs4tJeHG92MdHZIluiYs/M=
-go.opentelemetry.io/otel/sdk/metric v0.40.0 h1:qOM29YaGcxipWjL5FzpyZDpCYrDREvX0mVlmXdOjCHU=
-go.opentelemetry.io/otel/sdk/metric v0.40.0/go.mod h1:dWxHtdzdJvg+ciJUKLTKwrMe5P6Dv3FyDbh8UkfgkVs=
-go.opentelemetry.io/otel/trace v1.18.0 h1:NY+czwbHbmndxojTEKiSMHkG2ClNH2PwmcHrdo0JY10=
-go.opentelemetry.io/otel/trace v1.18.0/go.mod h1:T2+SGJGuYZY3bjj5rgh/hN7KIrlpWC5nS8Mjvzckz+0=
-go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=
-go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=
+go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q=
+go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
+go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE=
+go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
+go.opentelemetry.io/otel/sdk/metric v1.28.0 h1:OkuaKgKrgAbYrrY0t92c+cC+2F6hsFNnCQArXCKlg08=
+go.opentelemetry.io/otel/sdk/metric v1.28.0/go.mod h1:cWPjykihLAPvXKi4iZc1dpER3Jdq2Z0YLse3moQUCpg=
+go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
+go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
+go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
+go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
@@ -724,7 +712,6 @@ golang.org/x/crypto v0.0.0-20201217014255-9d1352758620/go.mod h1:jdWPYTVW3xRLrWP
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
@@ -732,8 +719,8 @@ golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIi
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
-golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
-golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
+golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI=
+golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
@@ -782,8 +769,8 @@ golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
-golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
-golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
+golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
+golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo=
@@ -840,8 +827,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
-golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
+golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -857,15 +844,14 @@ golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
-golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
-golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
+golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA=
+golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0=
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.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
@@ -909,19 +895,19 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=
google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=
-google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=
-google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
+google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 h1:0+ozOGcrp+Y8Aq8TLNN2Aliibms5LEzsq99ZZmAGYm0=
+google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094/go.mod h1:fJ/e3If/Q67Mj99hin0hMhiNyCRmt6BQ2aWIJshUSJw=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 h1:BwIjyKYGsK9dMCBOorzRri8MQwmi7mT9rGHsCEinZkA=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
-google.golang.org/grpc v1.62.0 h1:HQKZ/fa1bXkX1oFOvSjmZEUL8wLSaZTjCcLAlmZRtdk=
-google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE=
-google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
-google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
+google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY=
+google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg=
+google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
+google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/pkg/gen/ghcapi/embedded_spec.go b/pkg/gen/ghcapi/embedded_spec.go
index 9713a05d4c8..87525f338d1 100644
--- a/pkg/gen/ghcapi/embedded_spec.go
+++ b/pkg/gen/ghcapi/embedded_spec.go
@@ -8095,6 +8095,9 @@ func init() {
},
"Move": {
"properties": {
+ "additionalDocuments": {
+ "$ref": "#/definitions/Document"
+ },
"approvalsRequestedAt": {
"description": "The time at which a move is sent back to the TOO becuase the prime added a new service item for approval",
"type": "string",
@@ -8423,6 +8426,77 @@ func init() {
}
}
},
+ "MovePayload": {
+ "type": "object",
+ "required": [
+ "id",
+ "orders_id",
+ "locator",
+ "created_at",
+ "updated_at",
+ "eTag"
+ ],
+ "properties": {
+ "additionalDocuments": {
+ "$ref": "#/definitions/Document"
+ },
+ "cancel_reason": {
+ "type": "string",
+ "x-nullable": true,
+ "example": "Change of orders"
+ },
+ "closeout_office": {
+ "$ref": "#/definitions/TransportationOffice"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "eTag": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string",
+ "format": "uuid",
+ "example": "c56a4180-65aa-42ec-a945-5fd21dec0538"
+ },
+ "locator": {
+ "type": "string",
+ "example": "12432"
+ },
+ "mto_shipments": {
+ "$ref": "#/definitions/MTOShipments"
+ },
+ "orders_id": {
+ "type": "string",
+ "format": "uuid",
+ "example": "c56a4180-65aa-42ec-a945-5fd21dec0538"
+ },
+ "primeCounselingCompletedAt": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true
+ },
+ "service_member_id": {
+ "type": "string",
+ "format": "uuid",
+ "readOnly": true,
+ "example": "c56a4180-65aa-42ec-a945-5fd21dec0538"
+ },
+ "status": {
+ "$ref": "#/definitions/MoveStatus"
+ },
+ "submitted_at": {
+ "type": "string",
+ "format": "date-time",
+ "x-nullable": true
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
"MoveStatus": {
"type": "string",
"enum": [
@@ -21764,6 +21838,9 @@ func init() {
},
"Move": {
"properties": {
+ "additionalDocuments": {
+ "$ref": "#/definitions/Document"
+ },
"approvalsRequestedAt": {
"description": "The time at which a move is sent back to the TOO becuase the prime added a new service item for approval",
"type": "string",
@@ -22092,6 +22169,77 @@ func init() {
}
}
},
+ "MovePayload": {
+ "type": "object",
+ "required": [
+ "id",
+ "orders_id",
+ "locator",
+ "created_at",
+ "updated_at",
+ "eTag"
+ ],
+ "properties": {
+ "additionalDocuments": {
+ "$ref": "#/definitions/Document"
+ },
+ "cancel_reason": {
+ "type": "string",
+ "x-nullable": true,
+ "example": "Change of orders"
+ },
+ "closeout_office": {
+ "$ref": "#/definitions/TransportationOffice"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "eTag": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string",
+ "format": "uuid",
+ "example": "c56a4180-65aa-42ec-a945-5fd21dec0538"
+ },
+ "locator": {
+ "type": "string",
+ "example": "12432"
+ },
+ "mto_shipments": {
+ "$ref": "#/definitions/MTOShipments"
+ },
+ "orders_id": {
+ "type": "string",
+ "format": "uuid",
+ "example": "c56a4180-65aa-42ec-a945-5fd21dec0538"
+ },
+ "primeCounselingCompletedAt": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true
+ },
+ "service_member_id": {
+ "type": "string",
+ "format": "uuid",
+ "readOnly": true,
+ "example": "c56a4180-65aa-42ec-a945-5fd21dec0538"
+ },
+ "status": {
+ "$ref": "#/definitions/MoveStatus"
+ },
+ "submitted_at": {
+ "type": "string",
+ "format": "date-time",
+ "x-nullable": true
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
"MoveStatus": {
"type": "string",
"enum": [
diff --git a/pkg/gen/ghcmessages/move.go b/pkg/gen/ghcmessages/move.go
index 03c1d58a2e4..0225f95e673 100644
--- a/pkg/gen/ghcmessages/move.go
+++ b/pkg/gen/ghcmessages/move.go
@@ -19,6 +19,9 @@ import (
// swagger:model Move
type Move struct {
+ // additional documents
+ AdditionalDocuments *Document `json:"additionalDocuments,omitempty"`
+
// The time at which a move is sent back to the TOO becuase the prime added a new service item for approval
// Format: date-time
ApprovalsRequestedAt *strfmt.DateTime `json:"approvalsRequestedAt,omitempty"`
@@ -129,6 +132,10 @@ type Move struct {
func (m *Move) Validate(formats strfmt.Registry) error {
var res []error
+ if err := m.validateAdditionalDocuments(formats); err != nil {
+ res = append(res, err)
+ }
+
if err := m.validateApprovalsRequestedAt(formats); err != nil {
res = append(res, err)
}
@@ -219,6 +226,25 @@ func (m *Move) Validate(formats strfmt.Registry) error {
return nil
}
+func (m *Move) validateAdditionalDocuments(formats strfmt.Registry) error {
+ if swag.IsZero(m.AdditionalDocuments) { // not required
+ return nil
+ }
+
+ if m.AdditionalDocuments != nil {
+ if err := m.AdditionalDocuments.Validate(formats); err != nil {
+ if ve, ok := err.(*errors.Validation); ok {
+ return ve.ValidateName("additionalDocuments")
+ } else if ce, ok := err.(*errors.CompositeError); ok {
+ return ce.ValidateName("additionalDocuments")
+ }
+ return err
+ }
+ }
+
+ return nil
+}
+
func (m *Move) validateApprovalsRequestedAt(formats strfmt.Registry) error {
if swag.IsZero(m.ApprovalsRequestedAt) { // not required
return nil
@@ -513,6 +539,10 @@ func (m *Move) validateUpdatedAt(formats strfmt.Registry) error {
func (m *Move) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
var res []error
+ if err := m.contextValidateAdditionalDocuments(ctx, formats); err != nil {
+ res = append(res, err)
+ }
+
if err := m.contextValidateCloseoutOffice(ctx, formats); err != nil {
res = append(res, err)
}
@@ -551,6 +581,27 @@ func (m *Move) ContextValidate(ctx context.Context, formats strfmt.Registry) err
return nil
}
+func (m *Move) contextValidateAdditionalDocuments(ctx context.Context, formats strfmt.Registry) error {
+
+ if m.AdditionalDocuments != nil {
+
+ if swag.IsZero(m.AdditionalDocuments) { // not required
+ return nil
+ }
+
+ if err := m.AdditionalDocuments.ContextValidate(ctx, formats); err != nil {
+ if ve, ok := err.(*errors.Validation); ok {
+ return ve.ValidateName("additionalDocuments")
+ } else if ce, ok := err.(*errors.CompositeError); ok {
+ return ce.ValidateName("additionalDocuments")
+ }
+ return err
+ }
+ }
+
+ return nil
+}
+
func (m *Move) contextValidateCloseoutOffice(ctx context.Context, formats strfmt.Registry) error {
if m.CloseoutOffice != nil {
diff --git a/pkg/gen/ghcmessages/move_payload.go b/pkg/gen/ghcmessages/move_payload.go
new file mode 100644
index 00000000000..16962a7a619
--- /dev/null
+++ b/pkg/gen/ghcmessages/move_payload.go
@@ -0,0 +1,467 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package ghcmessages
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+ "context"
+
+ "github.com/go-openapi/errors"
+ "github.com/go-openapi/strfmt"
+ "github.com/go-openapi/swag"
+ "github.com/go-openapi/validate"
+)
+
+// MovePayload move payload
+//
+// swagger:model MovePayload
+type MovePayload struct {
+
+ // additional documents
+ AdditionalDocuments *Document `json:"additionalDocuments,omitempty"`
+
+ // cancel reason
+ // Example: Change of orders
+ CancelReason *string `json:"cancel_reason,omitempty"`
+
+ // closeout office
+ CloseoutOffice *TransportationOffice `json:"closeout_office,omitempty"`
+
+ // created at
+ // Required: true
+ // Format: date-time
+ CreatedAt *strfmt.DateTime `json:"created_at"`
+
+ // e tag
+ // Required: true
+ ETag *string `json:"eTag"`
+
+ // id
+ // Example: c56a4180-65aa-42ec-a945-5fd21dec0538
+ // Required: true
+ // Format: uuid
+ ID *strfmt.UUID `json:"id"`
+
+ // locator
+ // Example: 12432
+ // Required: true
+ Locator *string `json:"locator"`
+
+ // mto shipments
+ MtoShipments MTOShipments `json:"mto_shipments,omitempty"`
+
+ // orders id
+ // Example: c56a4180-65aa-42ec-a945-5fd21dec0538
+ // Required: true
+ // Format: uuid
+ OrdersID *strfmt.UUID `json:"orders_id"`
+
+ // prime counseling completed at
+ // Read Only: true
+ // Format: date-time
+ PrimeCounselingCompletedAt strfmt.DateTime `json:"primeCounselingCompletedAt,omitempty"`
+
+ // service member id
+ // Example: c56a4180-65aa-42ec-a945-5fd21dec0538
+ // Read Only: true
+ // Format: uuid
+ ServiceMemberID strfmt.UUID `json:"service_member_id,omitempty"`
+
+ // status
+ Status MoveStatus `json:"status,omitempty"`
+
+ // submitted at
+ // Format: date-time
+ SubmittedAt *strfmt.DateTime `json:"submitted_at,omitempty"`
+
+ // updated at
+ // Required: true
+ // Format: date-time
+ UpdatedAt *strfmt.DateTime `json:"updated_at"`
+}
+
+// Validate validates this move payload
+func (m *MovePayload) Validate(formats strfmt.Registry) error {
+ var res []error
+
+ if err := m.validateAdditionalDocuments(formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.validateCloseoutOffice(formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.validateCreatedAt(formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.validateETag(formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.validateID(formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.validateLocator(formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.validateMtoShipments(formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.validateOrdersID(formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.validatePrimeCounselingCompletedAt(formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.validateServiceMemberID(formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.validateStatus(formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.validateSubmittedAt(formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.validateUpdatedAt(formats); err != nil {
+ res = append(res, err)
+ }
+
+ if len(res) > 0 {
+ return errors.CompositeValidationError(res...)
+ }
+ return nil
+}
+
+func (m *MovePayload) validateAdditionalDocuments(formats strfmt.Registry) error {
+ if swag.IsZero(m.AdditionalDocuments) { // not required
+ return nil
+ }
+
+ if m.AdditionalDocuments != nil {
+ if err := m.AdditionalDocuments.Validate(formats); err != nil {
+ if ve, ok := err.(*errors.Validation); ok {
+ return ve.ValidateName("additionalDocuments")
+ } else if ce, ok := err.(*errors.CompositeError); ok {
+ return ce.ValidateName("additionalDocuments")
+ }
+ return err
+ }
+ }
+
+ return nil
+}
+
+func (m *MovePayload) validateCloseoutOffice(formats strfmt.Registry) error {
+ if swag.IsZero(m.CloseoutOffice) { // not required
+ return nil
+ }
+
+ if m.CloseoutOffice != nil {
+ if err := m.CloseoutOffice.Validate(formats); err != nil {
+ if ve, ok := err.(*errors.Validation); ok {
+ return ve.ValidateName("closeout_office")
+ } else if ce, ok := err.(*errors.CompositeError); ok {
+ return ce.ValidateName("closeout_office")
+ }
+ return err
+ }
+ }
+
+ return nil
+}
+
+func (m *MovePayload) validateCreatedAt(formats strfmt.Registry) error {
+
+ if err := validate.Required("created_at", "body", m.CreatedAt); err != nil {
+ return err
+ }
+
+ if err := validate.FormatOf("created_at", "body", "date-time", m.CreatedAt.String(), formats); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (m *MovePayload) validateETag(formats strfmt.Registry) error {
+
+ if err := validate.Required("eTag", "body", m.ETag); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (m *MovePayload) validateID(formats strfmt.Registry) error {
+
+ if err := validate.Required("id", "body", m.ID); err != nil {
+ return err
+ }
+
+ if err := validate.FormatOf("id", "body", "uuid", m.ID.String(), formats); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (m *MovePayload) validateLocator(formats strfmt.Registry) error {
+
+ if err := validate.Required("locator", "body", m.Locator); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (m *MovePayload) validateMtoShipments(formats strfmt.Registry) error {
+ if swag.IsZero(m.MtoShipments) { // not required
+ return nil
+ }
+
+ if err := m.MtoShipments.Validate(formats); err != nil {
+ if ve, ok := err.(*errors.Validation); ok {
+ return ve.ValidateName("mto_shipments")
+ } else if ce, ok := err.(*errors.CompositeError); ok {
+ return ce.ValidateName("mto_shipments")
+ }
+ return err
+ }
+
+ return nil
+}
+
+func (m *MovePayload) validateOrdersID(formats strfmt.Registry) error {
+
+ if err := validate.Required("orders_id", "body", m.OrdersID); err != nil {
+ return err
+ }
+
+ if err := validate.FormatOf("orders_id", "body", "uuid", m.OrdersID.String(), formats); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (m *MovePayload) validatePrimeCounselingCompletedAt(formats strfmt.Registry) error {
+ if swag.IsZero(m.PrimeCounselingCompletedAt) { // not required
+ return nil
+ }
+
+ if err := validate.FormatOf("primeCounselingCompletedAt", "body", "date-time", m.PrimeCounselingCompletedAt.String(), formats); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (m *MovePayload) validateServiceMemberID(formats strfmt.Registry) error {
+ if swag.IsZero(m.ServiceMemberID) { // not required
+ return nil
+ }
+
+ if err := validate.FormatOf("service_member_id", "body", "uuid", m.ServiceMemberID.String(), formats); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (m *MovePayload) validateStatus(formats strfmt.Registry) error {
+ if swag.IsZero(m.Status) { // not required
+ return nil
+ }
+
+ if err := m.Status.Validate(formats); err != nil {
+ if ve, ok := err.(*errors.Validation); ok {
+ return ve.ValidateName("status")
+ } else if ce, ok := err.(*errors.CompositeError); ok {
+ return ce.ValidateName("status")
+ }
+ return err
+ }
+
+ return nil
+}
+
+func (m *MovePayload) validateSubmittedAt(formats strfmt.Registry) error {
+ if swag.IsZero(m.SubmittedAt) { // not required
+ return nil
+ }
+
+ if err := validate.FormatOf("submitted_at", "body", "date-time", m.SubmittedAt.String(), formats); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (m *MovePayload) validateUpdatedAt(formats strfmt.Registry) error {
+
+ if err := validate.Required("updated_at", "body", m.UpdatedAt); err != nil {
+ return err
+ }
+
+ if err := validate.FormatOf("updated_at", "body", "date-time", m.UpdatedAt.String(), formats); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+// ContextValidate validate this move payload based on the context it is used
+func (m *MovePayload) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+ var res []error
+
+ if err := m.contextValidateAdditionalDocuments(ctx, formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.contextValidateCloseoutOffice(ctx, formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.contextValidateMtoShipments(ctx, formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.contextValidatePrimeCounselingCompletedAt(ctx, formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.contextValidateServiceMemberID(ctx, formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.contextValidateStatus(ctx, formats); err != nil {
+ res = append(res, err)
+ }
+
+ if len(res) > 0 {
+ return errors.CompositeValidationError(res...)
+ }
+ return nil
+}
+
+func (m *MovePayload) contextValidateAdditionalDocuments(ctx context.Context, formats strfmt.Registry) error {
+
+ if m.AdditionalDocuments != nil {
+
+ if swag.IsZero(m.AdditionalDocuments) { // not required
+ return nil
+ }
+
+ if err := m.AdditionalDocuments.ContextValidate(ctx, formats); err != nil {
+ if ve, ok := err.(*errors.Validation); ok {
+ return ve.ValidateName("additionalDocuments")
+ } else if ce, ok := err.(*errors.CompositeError); ok {
+ return ce.ValidateName("additionalDocuments")
+ }
+ return err
+ }
+ }
+
+ return nil
+}
+
+func (m *MovePayload) contextValidateCloseoutOffice(ctx context.Context, formats strfmt.Registry) error {
+
+ if m.CloseoutOffice != nil {
+
+ if swag.IsZero(m.CloseoutOffice) { // not required
+ return nil
+ }
+
+ if err := m.CloseoutOffice.ContextValidate(ctx, formats); err != nil {
+ if ve, ok := err.(*errors.Validation); ok {
+ return ve.ValidateName("closeout_office")
+ } else if ce, ok := err.(*errors.CompositeError); ok {
+ return ce.ValidateName("closeout_office")
+ }
+ return err
+ }
+ }
+
+ return nil
+}
+
+func (m *MovePayload) contextValidateMtoShipments(ctx context.Context, formats strfmt.Registry) error {
+
+ if err := m.MtoShipments.ContextValidate(ctx, formats); err != nil {
+ if ve, ok := err.(*errors.Validation); ok {
+ return ve.ValidateName("mto_shipments")
+ } else if ce, ok := err.(*errors.CompositeError); ok {
+ return ce.ValidateName("mto_shipments")
+ }
+ return err
+ }
+
+ return nil
+}
+
+func (m *MovePayload) contextValidatePrimeCounselingCompletedAt(ctx context.Context, formats strfmt.Registry) error {
+
+ if err := validate.ReadOnly(ctx, "primeCounselingCompletedAt", "body", strfmt.DateTime(m.PrimeCounselingCompletedAt)); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (m *MovePayload) contextValidateServiceMemberID(ctx context.Context, formats strfmt.Registry) error {
+
+ if err := validate.ReadOnly(ctx, "service_member_id", "body", strfmt.UUID(m.ServiceMemberID)); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (m *MovePayload) contextValidateStatus(ctx context.Context, formats strfmt.Registry) error {
+
+ if swag.IsZero(m.Status) { // not required
+ return nil
+ }
+
+ if err := m.Status.ContextValidate(ctx, formats); err != nil {
+ if ve, ok := err.(*errors.Validation); ok {
+ return ve.ValidateName("status")
+ } else if ce, ok := err.(*errors.CompositeError); ok {
+ return ce.ValidateName("status")
+ }
+ return err
+ }
+
+ return nil
+}
+
+// MarshalBinary interface implementation
+func (m *MovePayload) MarshalBinary() ([]byte, error) {
+ if m == nil {
+ return nil, nil
+ }
+ return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *MovePayload) UnmarshalBinary(b []byte) error {
+ var res MovePayload
+ if err := swag.ReadJSON(b, &res); err != nil {
+ return err
+ }
+ *m = res
+ return nil
+}
diff --git a/pkg/handlers/ghcapi/internal/payloads/model_to_payload.go b/pkg/handlers/ghcapi/internal/payloads/model_to_payload.go
index a092e25147e..f6b9f1561b8 100644
--- a/pkg/handlers/ghcapi/internal/payloads/model_to_payload.go
+++ b/pkg/handlers/ghcapi/internal/payloads/model_to_payload.go
@@ -52,9 +52,9 @@ func OfficeUser(officeUser *models.OfficeUser) *ghcmessages.LockedOfficeUser {
}
// Move payload
-func Move(move *models.Move) *ghcmessages.Move {
+func Move(move *models.Move, storer storage.FileStorer) (*ghcmessages.Move, error) {
if move == nil {
- return nil
+ return nil, nil
}
// Adds shipmentGBLOC to be used for TOO/TIO's origin GBLOC
var gbloc ghcmessages.GBLOC
@@ -64,6 +64,15 @@ func Move(move *models.Move) *ghcmessages.Move {
gbloc = ghcmessages.GBLOC(*move.Orders.OriginDutyLocationGBLOC)
}
+ var additionalDocumentsPayload *ghcmessages.Document
+ var err error
+ if move.AdditionalDocuments != nil {
+ additionalDocumentsPayload, err = PayloadForDocumentModel(storer, *move.AdditionalDocuments)
+ }
+ if err != nil {
+ return nil, err
+ }
+
payload := &ghcmessages.Move{
ID: strfmt.UUID(move.ID.String()),
AvailableToPrimeAt: handlers.FmtDateTimePtr(move.AvailableToPrimeAt),
@@ -92,9 +101,10 @@ func Move(move *models.Move) *ghcmessages.Move {
LockedByOfficeUserID: handlers.FmtUUIDPtr(move.LockedByOfficeUserID),
LockedByOfficeUser: OfficeUser(move.LockedByOfficeUser),
LockExpiresAt: handlers.FmtDateTimePtr(move.LockExpiresAt),
+ AdditionalDocuments: additionalDocumentsPayload,
}
- return payload
+ return payload, nil
}
// ListMove payload
@@ -1410,11 +1420,16 @@ func PaymentRequest(pr *models.PaymentRequest, storer storage.FileStorer) (*ghcm
}
}
+ move, err := Move(&pr.MoveTaskOrder, storer)
+ if err != nil {
+ return nil, err
+ }
+
return &ghcmessages.PaymentRequest{
ID: *handlers.FmtUUID(pr.ID),
IsFinal: &pr.IsFinal,
MoveTaskOrderID: *handlers.FmtUUID(pr.MoveTaskOrderID),
- MoveTaskOrder: Move(&pr.MoveTaskOrder),
+ MoveTaskOrder: move,
PaymentRequestNumber: pr.PaymentRequestNumber,
RecalculationOfPaymentRequestID: handlers.FmtUUIDPtr(pr.RecalculationOfPaymentRequestID),
RejectionReason: pr.RejectionReason,
diff --git a/pkg/handlers/ghcapi/internal/payloads/model_to_payload_test.go b/pkg/handlers/ghcapi/internal/payloads/model_to_payload_test.go
index 3dc0479bce7..071e410967f 100644
--- a/pkg/handlers/ghcapi/internal/payloads/model_to_payload_test.go
+++ b/pkg/handlers/ghcapi/internal/payloads/model_to_payload_test.go
@@ -9,6 +9,7 @@ import (
"github.com/transcom/mymove/pkg/gen/ghcmessages"
"github.com/transcom/mymove/pkg/handlers"
"github.com/transcom/mymove/pkg/models"
+ "github.com/transcom/mymove/pkg/storage/test"
)
func TestOrder(_ *testing.T) {
@@ -17,8 +18,11 @@ func TestOrder(_ *testing.T) {
}
// TestMove makes sure zero values/optional fields are handled
-func TestMove(_ *testing.T) {
- Move(&models.Move{})
+func TestMove(t *testing.T) {
+ _, err := Move(&models.Move{}, &test.FakeS3Storage{})
+ if err != nil {
+ t.Fail()
+ }
}
func (suite *PayloadsSuite) TestFetchPPMShipment() {
diff --git a/pkg/handlers/ghcapi/move.go b/pkg/handlers/ghcapi/move.go
index 2c75a267277..9bb4bd1b6aa 100644
--- a/pkg/handlers/ghcapi/move.go
+++ b/pkg/handlers/ghcapi/move.go
@@ -81,7 +81,10 @@ func (h GetMoveHandler) Handle(params moveop.GetMoveParams) middleware.Responder
appCtx.Logger().Error("Invalid permissions")
return moveop.NewGetMoveNotFound(), nil
} else {
- payload := payloads.Move(move)
+ payload, err := payloads.Move(move, h.FileStorer())
+ if err != nil {
+ return nil, err
+ }
return moveop.NewGetMoveOK().WithPayload(payload), nil
}
})
@@ -174,7 +177,10 @@ func (h SetFinancialReviewFlagHandler) Handle(params moveop.SetFinancialReviewFl
}
}
- payload := payloads.Move(move)
+ payload, err := payloads.Move(move, h.FileStorer())
+ if err != nil {
+ return nil, err
+ }
return moveop.NewSetFinancialReviewFlagOK().WithPayload(payload), nil
})
}
@@ -204,6 +210,10 @@ func (h UpdateMoveCloseoutOfficeHandler) Handle(params moveop.UpdateCloseoutOffi
}
}
- return moveop.NewUpdateCloseoutOfficeOK().WithPayload(payloads.Move(move)), nil
+ payload, err := payloads.Move(move, h.FileStorer())
+ if err != nil {
+ return nil, err
+ }
+ return moveop.NewUpdateCloseoutOfficeOK().WithPayload(payload), nil
})
}
diff --git a/pkg/handlers/ghcapi/move_task_order.go b/pkg/handlers/ghcapi/move_task_order.go
index 6a91e090487..2c9196b68be 100644
--- a/pkg/handlers/ghcapi/move_task_order.go
+++ b/pkg/handlers/ghcapi/move_task_order.go
@@ -123,7 +123,10 @@ func (h UpdateMoveTaskOrderStatusHandlerFunc) Handle(params movetaskorderops.Upd
}
}
- moveTaskOrderPayload := payloads.Move(mto)
+ moveTaskOrderPayload, err := payloads.Move(mto, h.FileStorer())
+ if err != nil {
+ return movetaskorderops.NewUpdateMoveTaskOrderStatusInternalServerError(), err
+ }
// Audit attempt to make MTO available to prime
_, err = audit.Capture(appCtx, mto, moveTaskOrderPayload, params.HTTPRequest)
@@ -198,7 +201,10 @@ func (h UpdateMTOStatusServiceCounselingCompletedHandlerFunc) Handle(params move
return handleError(err)
}
- moveTaskOrderPayload := payloads.Move(mto)
+ moveTaskOrderPayload, err := payloads.Move(mto, h.FileStorer())
+ if err != nil {
+ return movetaskorderops.NewUpdateMoveTaskOrderStatusInternalServerError(), err
+ }
// Audit
_, err = audit.Capture(appCtx, mto, moveTaskOrderPayload, params.HTTPRequest)
@@ -269,7 +275,10 @@ func (h UpdateMTOReviewedBillableWeightsAtHandlerFunc) Handle(params movetaskord
}
}
- moveTaskOrderPayload := payloads.Move(mto)
+ moveTaskOrderPayload, err := payloads.Move(mto, h.FileStorer())
+ if err != nil {
+ return movetaskorderops.NewUpdateMoveTaskOrderStatusInternalServerError(), err
+ }
// Audit
_, err = audit.Capture(appCtx, mto, moveTaskOrderPayload, params.HTTPRequest)
@@ -324,7 +333,10 @@ func (h UpdateMoveTIORemarksHandlerFunc) Handle(params movetaskorderops.UpdateMo
}
}
- moveTaskOrderPayload := payloads.Move(mto)
+ moveTaskOrderPayload, err := payloads.Move(mto, h.FileStorer())
+ if err != nil {
+ return movetaskorderops.NewUpdateMoveTaskOrderStatusInternalServerError(), err
+ }
// Audit
_, err = audit.Capture(appCtx, mto, moveTaskOrderPayload, params.HTTPRequest)
diff --git a/pkg/handlers/ghcapi/orders.go b/pkg/handlers/ghcapi/orders.go
index cf1d8d4c85f..90a9c56fbf1 100644
--- a/pkg/handlers/ghcapi/orders.go
+++ b/pkg/handlers/ghcapi/orders.go
@@ -579,7 +579,10 @@ func (h AcknowledgeExcessWeightRiskHandler) Handle(
h.triggerAcknowledgeExcessWeightRiskEvent(appCtx, updatedMove.ID, params)
- movePayload := payloads.Move(updatedMove)
+ movePayload, err := payloads.Move(updatedMove, h.FileStorer())
+ if err != nil {
+ return orderop.NewAcknowledgeExcessWeightRiskInternalServerError(), err
+ }
return orderop.NewAcknowledgeExcessWeightRiskOK().WithPayload(movePayload), nil
})
diff --git a/pkg/services/move/move_fetcher.go b/pkg/services/move/move_fetcher.go
index 69a798226f2..4095aca5dc4 100644
--- a/pkg/services/move/move_fetcher.go
+++ b/pkg/services/move/move_fetcher.go
@@ -7,6 +7,7 @@ import (
"github.com/transcom/mymove/pkg/appcontext"
"github.com/transcom/mymove/pkg/apperror"
+ "github.com/transcom/mymove/pkg/db/utilities"
"github.com/transcom/mymove/pkg/models"
"github.com/transcom/mymove/pkg/services"
)
@@ -23,7 +24,8 @@ func NewMoveFetcher() services.MoveFetcher {
func (f moveFetcher) FetchMove(appCtx appcontext.AppContext, locator string, searchParams *services.MoveFetcherParams) (*models.Move, error) {
move := &models.Move{}
query := appCtx.DB().
- EagerPreload("CloseoutOffice.Address", "Contractor", "ShipmentGBLOC", "LockedByOfficeUser", "LockedByOfficeUser.TransportationOffice").
+ EagerPreload("CloseoutOffice.Address", "Contractor", "ShipmentGBLOC", "LockedByOfficeUser", "LockedByOfficeUser.TransportationOffice", "AdditionalDocuments",
+ "AdditionalDocuments.UserUploads").
LeftJoin("move_to_gbloc", "move_to_gbloc.move_id = moves.id").
LeftJoin("office_users", "office_users.id = moves.locked_by").
Where("locator = $1", locator)
@@ -43,5 +45,17 @@ func (f moveFetcher) FetchMove(appCtx appcontext.AppContext, locator string, sea
}
}
+ if move.AdditionalDocumentsID != nil {
+ var additionalDocumentUploads models.UserUploads
+ err = appCtx.DB().Q().
+ Scope(utilities.ExcludeDeletedScope()).EagerPreload("Upload").
+ Where("document_id = ?", move.AdditionalDocumentsID).
+ All(&additionalDocumentUploads)
+ if err != nil {
+ return move, err
+ }
+ move.AdditionalDocuments.UserUploads = additionalDocumentUploads
+ }
+
return move, nil
}
diff --git a/src/components/Office/ServicesCounselingTabNav/ServicesCounselingTabNav.jsx b/src/components/Office/ServicesCounselingTabNav/ServicesCounselingTabNav.jsx
index 42f2789bbee..3dc4c9dadab 100644
--- a/src/components/Office/ServicesCounselingTabNav/ServicesCounselingTabNav.jsx
+++ b/src/components/Office/ServicesCounselingTabNav/ServicesCounselingTabNav.jsx
@@ -2,50 +2,78 @@ import React from 'react';
import { NavLink } from 'react-router-dom';
import { Tag } from '@trussworks/react-uswds';
import PropTypes from 'prop-types';
+import classnames from 'classnames';
+
+import styles from './ServicesCounselingTabNav.module.scss';
import 'styles/office.scss';
import TabNav from 'components/TabNav';
+import { isBooleanFlagEnabled } from 'utils/featureFlags';
const ServicesCounselingTabNav = ({ unapprovedShipmentCount = 0, moveCode }) => {
+ const [supportingDocsFF, setSupportingDocsFF] = React.useState(false);
+ React.useEffect(() => {
+ const fetchData = async () => {
+ setSupportingDocsFF(await isBooleanFlagEnabled('manage_supporting_docs'));
+ };
+ fetchData();
+ }, []);
+
+ const items = [
+ (isActive ? 'usa-current' : '')}
+ to={`/counseling/moves/${moveCode}/details`}
+ data-testid="MoveDetails-Tab"
+ >
+ Move details
+ {unapprovedShipmentCount > 0 && {unapprovedShipmentCount}}
+ ,
+ (isActive ? 'usa-current' : '')}
+ to={`/counseling/moves/${moveCode}/mto`}
+ data-testid="MoveTaskOrder-Tab"
+ >
+ Move Task Order
+ ,
+ (isActive ? 'usa-current' : '')}
+ to={`/counseling/moves/${moveCode}/customer-support-remarks`}
+ >
+ Customer support remarks
+ ,
+ (isActive ? 'usa-current' : '')}
+ to={`/counseling/moves/${moveCode}/history`}
+ data-testid="MoveHistory-Tab"
+ >
+ Move history
+ ,
+ ];
+
+ if (supportingDocsFF)
+ items.push(
+ (isActive ? 'usa-current' : '')}
+ to="supporting-documents"
+ data-testid="SupportingDocuments-Tab"
+ >
+ Supporting Documents
+ ,
+ );
+
return (
-
-
(isActive ? 'usa-current' : '')}
- to={`/counseling/moves/${moveCode}/details`}
- data-testid="MoveDetails-Tab"
- >
- Move details
- {unapprovedShipmentCount > 0 && {unapprovedShipmentCount}}
- ,
- (isActive ? 'usa-current' : '')}
- to={`/counseling/moves/${moveCode}/mto`}
- data-testid="MoveTaskOrder-Tab"
- >
- Move Task Order
- ,
- (isActive ? 'usa-current' : '')}
- to={`/counseling/moves/${moveCode}/customer-support-remarks`}
- >
- Customer support remarks
- ,
- (isActive ? 'usa-current' : '')}
- to={`/counseling/moves/${moveCode}/history`}
- data-testid="MoveHistory-Tab"
- >
- Move history
- ,
- ]}
- />
+
+
);
diff --git a/src/components/Office/ServicesCounselingTabNav/ServicesCounselingTabNav.module.scss b/src/components/Office/ServicesCounselingTabNav/ServicesCounselingTabNav.module.scss
new file mode 100644
index 00000000000..6f89ca0a8f4
--- /dev/null
+++ b/src/components/Office/ServicesCounselingTabNav/ServicesCounselingTabNav.module.scss
@@ -0,0 +1,3 @@
+.TabNav {
+ text-align: center;
+}
diff --git a/src/components/Office/ServicesCounselingTabNav/ServicesCounselingTabNav.test.jsx b/src/components/Office/ServicesCounselingTabNav/ServicesCounselingTabNav.test.jsx
index cff7451a1a3..095f63120bb 100644
--- a/src/components/Office/ServicesCounselingTabNav/ServicesCounselingTabNav.test.jsx
+++ b/src/components/Office/ServicesCounselingTabNav/ServicesCounselingTabNav.test.jsx
@@ -1,14 +1,21 @@
import React from 'react';
-import { render, screen, within } from '@testing-library/react';
+import { render, screen, within, waitFor } from '@testing-library/react';
import { MemoryRouter } from 'react-router-dom';
import ServicesCounselingTabNav from './ServicesCounselingTabNav';
+import { isBooleanFlagEnabled } from 'utils/featureFlags';
+
const basicNavProps = {
unapprovedShipmentCount: 0,
moveCode: 'TESTCO',
};
+jest.mock('utils/featureFlags', () => ({
+ ...jest.requireActual('utils/featureFlags'),
+ isBooleanFlagEnabled: jest.fn().mockImplementation(() => Promise.resolve(false)),
+}));
+
describe('Move details tag rendering', () => {
it('should render the move details tab container without a tag', () => {
render(, { wrapper: MemoryRouter });
@@ -38,6 +45,27 @@ describe('MTO tag rendering', () => {
});
});
+describe('Supporting Documents tag rendering', () => {
+ it('should render the Supporting Documents tab container without a tag IF the feature flag is turned on', async () => {
+ isBooleanFlagEnabled.mockImplementation(() => Promise.resolve(true));
+
+ render(, { wrapper: MemoryRouter });
+
+ await waitFor(() => {
+ const supportingDocumentsTab = screen.getByTestId('SupportingDocuments-Tab');
+ expect(within(supportingDocumentsTab).queryByTestId('tag')).not.toBeInTheDocument();
+ });
+ });
+
+ it('should not render the Supporting Documents tab if the feature flag is turned off', async () => {
+ render(, { wrapper: MemoryRouter });
+
+ await waitFor(() => {
+ expect(screen.queryByTestId('SupportingDocuments-Tab')).not.toBeInTheDocument();
+ });
+ });
+});
+
describe('Move history tab', () => {
it('should render the move history tab container without a tag', () => {
render(, { wrapper: MemoryRouter });
diff --git a/src/components/Office/TXOTabNav/TXOTabNav.jsx b/src/components/Office/TXOTabNav/TXOTabNav.jsx
index 15d9a3244f5..37583621370 100644
--- a/src/components/Office/TXOTabNav/TXOTabNav.jsx
+++ b/src/components/Office/TXOTabNav/TXOTabNav.jsx
@@ -2,10 +2,14 @@ import React from 'react';
import { NavLink } from 'react-router-dom';
import { Tag } from '@trussworks/react-uswds';
import PropTypes from 'prop-types';
+import classnames from 'classnames';
+
+import styles from './TXOTabNav.module.scss';
import 'styles/office.scss';
import TabNav from 'components/TabNav';
import { OrdersShape } from 'types/customerShapes';
+import { isBooleanFlagEnabled } from 'utils/featureFlags';
const TXOTabNav = ({
unapprovedShipmentCount,
@@ -18,6 +22,14 @@ const TXOTabNav = ({
order,
moveCode,
}) => {
+ const [supportingDocsFF, setSupportingDocsFF] = React.useState(false);
+ React.useEffect(() => {
+ const fetchData = async () => {
+ setSupportingDocsFF(await isBooleanFlagEnabled('manage_supporting_docs'));
+ };
+ fetchData();
+ }, []);
+
let moveDetailsTagCount = 0;
if (unapprovedShipmentCount > 0) {
moveDetailsTagCount += unapprovedShipmentCount;
@@ -43,59 +55,68 @@ const TXOTabNav = ({
moveTaskOrderTagCount += unapprovedSITAddressUpdateCount;
}
+ const items = [
+ (isActive ? 'usa-current' : '')}
+ to={`/moves/${moveCode}/details`}
+ data-testid="MoveDetails-Tab"
+ >
+ Move details
+ {moveDetailsTagCount > 0 && {moveDetailsTagCount}}
+ ,
+ (isActive ? 'usa-current' : '')}
+ to={`/moves/${moveCode}/mto`}
+ >
+ Move task order
+ {moveTaskOrderTagCount > 0 && {moveTaskOrderTagCount}}
+ ,
+ (isActive ? 'usa-current' : '')}
+ to={`/moves/${moveCode}/payment-requests`}
+ >
+ Payment requests
+ {pendingPaymentRequestCount > 0 && {pendingPaymentRequestCount}}
+ ,
+ (isActive ? 'usa-current' : '')}
+ to={`/moves/${moveCode}/customer-support-remarks`}
+ >
+ Customer support remarks
+ ,
+ (isActive ? 'usa-current' : '')} to={`/moves/${moveCode}/evaluation-reports`}>
+ Quality assurance
+ ,
+ (isActive ? 'usa-current' : '')} to={`/moves/${moveCode}/history`}>
+ Move history
+ ,
+ ];
+
+ if (supportingDocsFF)
+ items.push(
+ (isActive ? 'usa-current' : '')}
+ to="supporting-documents"
+ data-testid="SupportingDocuments-Tab"
+ >
+ Supporting Documents
+ ,
+ );
+
return (
-
-
(isActive ? 'usa-current' : '')}
- to={`/moves/${moveCode}/details`}
- data-testid="MoveDetails-Tab"
- >
- Move details
- {moveDetailsTagCount > 0 && {moveDetailsTagCount}}
- ,
- (isActive ? 'usa-current' : '')}
- to={`/moves/${moveCode}/mto`}
- >
- Move task order
- {moveTaskOrderTagCount > 0 && {moveTaskOrderTagCount}}
- ,
- (isActive ? 'usa-current' : '')}
- to={`/moves/${moveCode}/payment-requests`}
- >
- Payment requests
- {pendingPaymentRequestCount > 0 && {pendingPaymentRequestCount}}
- ,
- (isActive ? 'usa-current' : '')}
- to={`/moves/${moveCode}/customer-support-remarks`}
- >
- Customer support remarks
- ,
- (isActive ? 'usa-current' : '')}
- to={`/moves/${moveCode}/evaluation-reports`}
- >
- Quality assurance
- ,
- (isActive ? 'usa-current' : '')}
- to={`/moves/${moveCode}/history`}
- >
- Move history
- ,
- ]}
- />
+
+
);
diff --git a/src/components/Office/TXOTabNav/TXOTabNav.module.scss b/src/components/Office/TXOTabNav/TXOTabNav.module.scss
new file mode 100644
index 00000000000..7bedfe0fac6
--- /dev/null
+++ b/src/components/Office/TXOTabNav/TXOTabNav.module.scss
@@ -0,0 +1,5 @@
+.TabNav {
+ padding-left: 1rem;
+ padding-right: 1rem;
+ text-align: center;
+}
diff --git a/src/components/Office/TXOTabNav/TXOTabNav.test.jsx b/src/components/Office/TXOTabNav/TXOTabNav.test.jsx
index 37e374697d8..7298a9d4d08 100644
--- a/src/components/Office/TXOTabNav/TXOTabNav.test.jsx
+++ b/src/components/Office/TXOTabNav/TXOTabNav.test.jsx
@@ -1,14 +1,21 @@
import React from 'react';
-import { render, screen, within } from '@testing-library/react';
+import { render, screen, within, waitFor } from '@testing-library/react';
import { MemoryRouter } from 'react-router-dom';
import TXOTabNav from './TXOTabNav';
+import { isBooleanFlagEnabled } from 'utils/featureFlags';
+
const basicNavProps = {
order: {},
moveCode: 'TESTCO',
};
+jest.mock('utils/featureFlags', () => ({
+ ...jest.requireActual('utils/featureFlags'),
+ isBooleanFlagEnabled: jest.fn().mockImplementation(() => Promise.resolve(false)),
+}));
+
describe('Move details tag rendering', () => {
it('should render the move details tab container without a tag', () => {
render(, { wrapper: MemoryRouter });
@@ -117,3 +124,24 @@ describe('Move task order tag rendering', () => {
expect(within(moveTaskOrderTab).getByTestId('tag')).toHaveTextContent('2');
});
});
+
+describe('Supporting Documents tag rendering', () => {
+ it('should render the Supporting Documents tab container without a tag IF the feature flag is turned on', async () => {
+ isBooleanFlagEnabled.mockImplementation(() => Promise.resolve(true));
+
+ render(, { wrapper: MemoryRouter });
+
+ await waitFor(() => {
+ const supportingDocumentsTab = screen.getByTestId('SupportingDocuments-Tab');
+ expect(within(supportingDocumentsTab).queryByTestId('tag')).not.toBeInTheDocument();
+ });
+ });
+
+ it('should not render the Supporting Documents tab if the feature flag is turned off', async () => {
+ render(, { wrapper: MemoryRouter });
+
+ await waitFor(() => {
+ expect(screen.queryByTestId('SupportingDocuments-Tab')).not.toBeInTheDocument();
+ });
+ });
+});
diff --git a/src/constants/routes.js b/src/constants/routes.js
index aa4e36d5ec0..54cab12f54f 100644
--- a/src/constants/routes.js
+++ b/src/constants/routes.js
@@ -83,6 +83,7 @@ export const servicesCounselingRoutes = {
SHIPMENT_ADVANCE_PATH: 'shipments/:shipmentId/advance',
BASE_MOVE_HISTORY_PATH: `${BASE_COUNSELING_MOVE_PATH}/history`,
MOVE_HISTORY_PATH: 'history',
+ SUPPORTING_DOCUMENTS_PATH: 'supporting-documents',
BASE_MTO_PATH: `${BASE_COUNSELING_MOVE_PATH}/mto`,
MTO_PATH: 'mto',
BASE_CUSTOMER_SUPPORT_REMARKS_PATH: `${BASE_COUNSELING_MOVE_PATH}/customer-support-remarks`,
diff --git a/src/hooks/queries.js b/src/hooks/queries.js
index 9a57e3d623d..81d80bba82e 100644
--- a/src/hooks/queries.js
+++ b/src/hooks/queries.js
@@ -409,6 +409,31 @@ export const useMoveTaskOrderQueries = (moveCode) => {
};
};
+export const useGetDocumentQuery = (documentId) => {
+ const staleTime = 15 * 60000; // 15 * 60000 milliseconds = 15 mins
+ const cacheTime = staleTime;
+ const { data: { documents, uploads } = {}, ...documentsQuery } = useQuery(
+ [ORDERS_DOCUMENTS, documentId],
+ ({ queryKey }) => getDocument(...queryKey),
+ {
+ enabled: !!documentId,
+ staleTime,
+ cacheTime,
+ refetchOnWindowFocus: false,
+ },
+ );
+
+ const { isLoading, isError, isSuccess } = getQueriesStatus([documentsQuery]);
+
+ return {
+ documents,
+ uploads,
+ isLoading,
+ isError,
+ isSuccess,
+ };
+};
+
export const useOrdersDocumentQueries = (moveCode) => {
// Get the orders info so we can get the uploaded_orders_id (which is a document id)
const { data: move, ...moveQuery } = useQuery([MOVES, moveCode], ({ queryKey }) => getMove(...queryKey));
diff --git a/src/pages/Office/ServicesCounselingMoveInfo/ServicesCounselingMoveInfo.jsx b/src/pages/Office/ServicesCounselingMoveInfo/ServicesCounselingMoveInfo.jsx
index 007cd68751e..1feacd5bfd1 100644
--- a/src/pages/Office/ServicesCounselingMoveInfo/ServicesCounselingMoveInfo.jsx
+++ b/src/pages/Office/ServicesCounselingMoveInfo/ServicesCounselingMoveInfo.jsx
@@ -35,6 +35,7 @@ const ReviewDocuments = lazy(() => import('pages/Office/PPM/ReviewDocuments/Revi
const ServicesCounselingReviewShipmentWeights = lazy(() =>
import('pages/Office/ServicesCounselingReviewShipmentWeights/ServicesCounselingReviewShipmentWeights'),
);
+const SupportingDocuments = lazy(() => import('../SupportingDocuments/SupportingDocuments'));
const ServicesCounselingMoveInfo = () => {
const [unapprovedShipmentCount, setUnapprovedShipmentCount] = React.useState(0);
@@ -67,6 +68,15 @@ const ServicesCounselingMoveInfo = () => {
const { data } = useUserQueries();
const officeUserID = data?.office_user?.id;
+ const [supportingDocsFF, setSupportingDocsFF] = useState(false);
+
+ useEffect(() => {
+ const fetchData = async () => {
+ setSupportingDocsFF(await isBooleanFlagEnabled('manage_supporting_docs'));
+ };
+ fetchData();
+ }, []);
+
useEffect(() => {
const fetchData = async () => {
if (
@@ -236,6 +246,13 @@ const ServicesCounselingMoveInfo = () => {
}
/>
} />
+ {supportingDocsFF && (
+ }
+ />
+ )}
({
...jest.requireActual('utils/featureFlags'),
- isBooleanFlagEnabled: jest.fn().mockImplementation(() => Promise.resolve()),
+ isBooleanFlagEnabled: jest.fn().mockImplementation(() => Promise.resolve(false)),
}));
const testMoveCode = '1A5PM3';
@@ -68,6 +68,7 @@ mockPage('pages/Office/ServicesCounselingAddShipment/ServicesCounselingAddShipme
mockPage('pages/Office/CustomerSupportRemarks/CustomerSupportRemarks');
mockPage('pages/Office/MoveTaskOrder/MoveTaskOrder');
mockPage('pages/Office/MoveHistory/MoveHistory');
+mockPage('pages/Office/SupportingDocuments/SupportingDocuments');
mockPage('pages/Office/ServicesCounselingMoveDocumentWrapper/ServicesCounselingMoveDocumentWrapper');
mockPage('pages/Office/CustomerInfo/CustomerInfo');
mockPage('pages/Office/ServicesCounselingEditShipmentDetails/ServicesCounselingEditShipmentDetails');
@@ -191,4 +192,36 @@ describe('Services Counseling Move Info Container', () => {
expect(lockIcon).not.toBeInTheDocument();
});
});
+
+ it('should render the Supporting Documents component if the feature flag is enabled', async () => {
+ const componentName = 'Supporting Documents';
+ const nestedPath = 'supporting-documents';
+
+ isBooleanFlagEnabled.mockImplementation(() => Promise.resolve(true));
+
+ renderSCMoveInfo(nestedPath);
+
+ // Wait for loading to finish
+ await waitFor(() => expect(screen.queryByText('Loading, please wait...')).not.toBeInTheDocument());
+
+ // Assert that the mock component is rendered
+ await waitFor(() => {
+ expect(screen.getByText(`Mock ${componentName} Component`)).toBeInTheDocument();
+ });
+ });
+
+ it('should not render the Supporting Documents component if the feature flag is turned off', async () => {
+ const componentName = 'Supporting Documents';
+ const nestedPath = 'counseling/supporting-documents';
+
+ renderSCMoveInfo(nestedPath);
+
+ // Wait for loading to finish
+ await waitFor(() => expect(screen.queryByText('Loading, please wait...')).not.toBeInTheDocument());
+
+ // Assert that the mock component has not been rendered
+ await waitFor(() => {
+ expect(screen.queryByText(`Mock ${componentName} Component`)).not.toBeInTheDocument();
+ });
+ });
});
diff --git a/src/pages/Office/SupportingDocuments/SupportingDocuments.jsx b/src/pages/Office/SupportingDocuments/SupportingDocuments.jsx
new file mode 100644
index 00000000000..0bf06cfbde2
--- /dev/null
+++ b/src/pages/Office/SupportingDocuments/SupportingDocuments.jsx
@@ -0,0 +1,12 @@
+import React from 'react';
+
+import DocumentViewer from 'components/DocumentViewer/DocumentViewer';
+
+const SupportingDocuments = ({ uploads }) => {
+ if (!uploads || uploads.constructor !== Array || uploads?.length <= 0) {
+ return No supporting documents have been uploaded.
;
+ }
+ return ;
+};
+
+export default SupportingDocuments;
diff --git a/src/pages/Office/SupportingDocuments/SupportingDocuments.test.jsx b/src/pages/Office/SupportingDocuments/SupportingDocuments.test.jsx
new file mode 100644
index 00000000000..6519cd8abce
--- /dev/null
+++ b/src/pages/Office/SupportingDocuments/SupportingDocuments.test.jsx
@@ -0,0 +1,105 @@
+import React from 'react';
+import { render, screen, within } from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
+
+import SupportingDocuments from './SupportingDocuments';
+
+beforeEach(() => {
+ jest.clearAllMocks();
+});
+
+// prevents react-fileviewer from throwing errors without mocking relevant DOM elements
+jest.mock('components/DocumentViewer/Content/Content', () => {
+ const MockContent = () => Content
;
+ return MockContent;
+});
+
+const mockUploads = [
+ {
+ bytes: 1235030,
+ contentType: 'image/png',
+ createdAt: '2024-06-25T14:16:01.682Z',
+ filename: 'some_doc.png',
+ id: 'cfd9f68f-88e7-4bd1-a437-56f38a1e9c7f',
+ status: 'PROCESSING',
+ updatedAt: '2024-06-25T14:16:01.682Z',
+ url: '/a/fake/path',
+ },
+ {
+ bytes: 166930,
+ contentType: 'application/pdf',
+ createdAt: '2024-06-25T14:50:22.132Z',
+ filename: 'some_other_doc.pdf',
+ id: '1739c51a-f87e-4f09-a3ed-cf49dff31711',
+ status: 'PROCESSING',
+ updatedAt: '2024-06-25T14:50:22.132Z',
+ url: '/a/fake/path',
+ },
+];
+
+describe('Supporting Documents Viewer', () => {
+ describe('displays viewer', () => {
+ it('renders document viewer correctly on load', async () => {
+ render();
+ const docMenuButton = await screen.findByRole('button', { name: /open menu/i });
+ expect(docMenuButton).toBeInTheDocument();
+
+ // We don't really have a better way to grab the DocumentViewerMenu to check its visibility because css isn't
+ // loaded in the test environment. Instead, we'll grab it by its test id and check that it has the correct class.
+ const docViewer = screen.getByTestId('DocViewerMenu');
+ expect(docViewer).toHaveClass('collapsed');
+
+ expect(within(docViewer).getByRole('heading', { level: 3, name: 'Documents' })).toBeInTheDocument();
+
+ await userEvent.click(docMenuButton);
+
+ expect(docViewer).not.toHaveClass('collapsed');
+
+ const uploadList = within(docViewer).getByRole('list');
+ expect(uploadList).toBeInTheDocument();
+
+ expect(within(uploadList).getAllByRole('listitem').length).toBe(2);
+ expect(within(uploadList).getByRole('button', { name: /some_other_doc\.pdf.*/i })).toBeInTheDocument();
+ expect(within(uploadList).getByRole('button', { name: /some_doc\.png.*/i })).toBeInTheDocument();
+
+ expect(screen.getByRole('button', { name: /close menu/i })).toBeInTheDocument();
+ expect(screen.getByText('Download file')).toBeInTheDocument();
+ });
+
+ it('displays message if no files were uploaded', async () => {
+ render();
+ expect(screen.getByRole('heading', { name: /No supporting documents have been uploaded/i })).toBeInTheDocument();
+ const docMenuButton = await screen.queryByRole('button', { name: /open menu/i });
+ expect(docMenuButton).not.toBeInTheDocument();
+
+ expect(screen.queryByTestId('DocViewerMenu')).not.toBeInTheDocument();
+
+ expect(screen.queryByRole('button', { name: /close menu/i })).not.toBeInTheDocument();
+ expect(screen.queryByText('Download file')).not.toBeInTheDocument();
+ });
+
+ it('displays message if uploads variable is undefined', async () => {
+ render();
+ expect(screen.getByRole('heading', { name: /No supporting documents have been uploaded/i })).toBeInTheDocument();
+ const docMenuButton = await screen.queryByRole('button', { name: /open menu/i });
+ expect(docMenuButton).not.toBeInTheDocument();
+
+ expect(screen.queryByTestId('DocViewerMenu')).not.toBeInTheDocument();
+
+ expect(screen.queryByRole('button', { name: /close menu/i })).not.toBeInTheDocument();
+ expect(screen.queryByText('Download file')).not.toBeInTheDocument();
+ });
+
+ it('displays message if uploads variable is not an array', async () => {
+ render();
+ expect(screen.getByRole('heading', { name: /No supporting documents have been uploaded/i })).toBeInTheDocument();
+ const docMenuButton = await screen.queryByRole('button', { name: /open menu/i });
+ expect(docMenuButton).not.toBeInTheDocument();
+
+ expect(screen.queryByTestId('DocViewerMenu')).not.toBeInTheDocument();
+
+ expect(screen.queryByRole('button', { name: /close menu/i })).not.toBeInTheDocument();
+ expect(screen.queryByText('Download file')).not.toBeInTheDocument();
+ });
+ });
+});
diff --git a/src/pages/Office/TXOMoveInfo/TXOMoveInfo.jsx b/src/pages/Office/TXOMoveInfo/TXOMoveInfo.jsx
index bb75f5cd01a..a40e636c24f 100644
--- a/src/pages/Office/TXOMoveInfo/TXOMoveInfo.jsx
+++ b/src/pages/Office/TXOMoveInfo/TXOMoveInfo.jsx
@@ -28,6 +28,7 @@ const MoveHistory = lazy(() => import('pages/Office/MoveHistory/MoveHistory'));
const CustomerInfo = lazy(() => import('pages/Office/CustomerInfo/CustomerInfo'));
const MovePaymentRequests = lazy(() => import('pages/Office/MovePaymentRequests/MovePaymentRequests'));
const Forbidden = lazy(() => import('pages/Office/Forbidden/Forbidden'));
+const SupportingDocuments = lazy(() => import('../SupportingDocuments/SupportingDocuments'));
const TXOMoveInfo = () => {
const [unapprovedShipmentCount, setUnapprovedShipmentCount] = React.useState(0);
@@ -61,6 +62,15 @@ const TXOMoveInfo = () => {
fetchData();
}, [move, officeUserID, moveLockFlag]);
+ const [supportingDocsFF, setSupportingDocsFF] = useState(false);
+
+ useEffect(() => {
+ const fetchData = async () => {
+ setSupportingDocsFF(await isBooleanFlagEnabled('manage_supporting_docs'));
+ };
+ fetchData();
+ }, []);
+
const hideNav =
matchPath(
{
@@ -189,6 +199,13 @@ const TXOMoveInfo = () => {
/>
}
/>
+ {supportingDocsFF && (
+ }
+ />
+ )}
} />
({
+ ...jest.requireActual('utils/featureFlags'),
+ isBooleanFlagEnabled: jest.fn().mockImplementation(() => Promise.resolve(false)),
+}));
+
+beforeEach(() => {
+ jest.clearAllMocks();
+});
+
mockPage('pages/Office/MoveDetails/MoveDetails');
mockPage('pages/Office/MoveDocumentWrapper/MoveDocumentWrapper');
mockPage('pages/Office/MoveTaskOrder/MoveTaskOrder');
@@ -24,6 +33,7 @@ mockPage('pages/Office/EvaluationReport/EvaluationReport');
mockPage('pages/Office/EvaluationViolations/EvaluationViolations');
mockPage('pages/Office/MoveHistory/MoveHistory');
mockPage('pages/Office/MovePaymentRequests/MovePaymentRequests');
+mockPage('pages/Office/SupportingDocuments/SupportingDocuments');
mockPage('pages/Office/CustomerInfo/CustomerInfo');
mockPage('pages/Office/Forbidden/Forbidden');
@@ -57,7 +67,7 @@ jest.mock('hooks/queries', () => ({
jest.mock('utils/featureFlags', () => ({
...jest.requireActual('utils/featureFlags'),
- isBooleanFlagEnabled: jest.fn().mockImplementation(() => Promise.resolve()),
+ isBooleanFlagEnabled: jest.fn().mockImplementation(() => Promise.resolve(false)),
}));
const basicUseTXOMoveInfoQueriesValue = {
@@ -271,5 +281,39 @@ describe('TXO Move Info Container', () => {
// Assert that the mock component is rendered
await expect(screen.getByText(`Mock ${componentName} Component`)).toBeInTheDocument();
});
+
+ it('should render the Supporting Documents component if the feature flag is enabled', async () => {
+ const componentName = 'Supporting Documents';
+ const nestedPath = 'supporting-documents';
+
+ isBooleanFlagEnabled.mockImplementation(() => Promise.resolve(true));
+
+ renderTXOMoveInfo(nestedPath);
+
+ // Wait for loading to finish
+ await waitFor(() => expect(screen.queryByText('Loading, please wait...')).not.toBeInTheDocument());
+
+ // Assert that the mock component is rendered
+ await waitFor(() => {
+ expect(screen.getByText(`Mock ${componentName} Component`)).toBeInTheDocument();
+ });
+ });
+
+ it('should not render the Supporting Documents component if the feature flag is turned off', async () => {
+ const componentName = 'Supporting Documents';
+ const nestedPath = 'supporting-documents';
+
+ isBooleanFlagEnabled.mockImplementation(() => Promise.resolve(false));
+
+ renderTXOMoveInfo(nestedPath);
+
+ // Wait for loading to finish
+ await waitFor(() => expect(screen.queryByText('Loading, please wait...')).not.toBeInTheDocument());
+
+ // Assert that the mock component has not been rendered
+ await waitFor(() => {
+ expect(screen.queryByText(`Mock ${componentName} Component`)).not.toBeInTheDocument();
+ });
+ });
});
});
diff --git a/swagger-def/ghc.yaml b/swagger-def/ghc.yaml
index 4cf3f9cca2d..e06866b2647 100644
--- a/swagger-def/ghc.yaml
+++ b/swagger-def/ghc.yaml
@@ -3443,25 +3443,25 @@ paths:
$ref: '#/responses/ServerError'
/lines-of-accounting:
post:
- summary: "Fetch line of accounting"
- description: "Fetches a line of accounting based on provided service member affiliation, order issue date, and Transportation Accounting Code (TAC)."
+ summary: 'Fetch line of accounting'
+ description: 'Fetches a line of accounting based on provided service member affiliation, order issue date, and Transportation Accounting Code (TAC).'
operationId: requestLineOfAccounting
tags:
- linesOfAccounting
consumes:
- - "application/json"
+ - 'application/json'
produces:
- - "application/json"
+ - 'application/json'
parameters:
- - in: "body"
- name: "body"
- description: "Service member affiliation, order issue date, and TAC code."
+ - in: 'body'
+ name: 'body'
+ description: 'Service member affiliation, order issue date, and TAC code.'
required: true
schema:
$ref: '#/definitions/FetchLineOfAccountingPayload'
responses:
'200':
- description: "Successfully retrieved line of accounting"
+ description: 'Successfully retrieved line of accounting'
schema:
$ref: 'definitions/LineOfAccounting.yaml'
'400':
@@ -4076,7 +4076,7 @@ definitions:
ordersIssueDate:
type: string
format: date
- example: "2023-01-01"
+ example: '2023-01-01'
tacCode:
type: string
minLength: 4
@@ -4353,6 +4353,8 @@ definitions:
type: string
format: date-time
x-nullable: true
+ additionalDocuments:
+ $ref: 'definitions/Document.yaml'
MoveHistory:
properties:
id:
@@ -5316,7 +5318,7 @@ definitions:
format: zip
type: string
title: ZIP
- example: "90210"
+ example: '90210'
pattern: ^(\d{5})$
x-nullable: true
secondaryPickupAddress:
@@ -5331,7 +5333,7 @@ definitions:
format: zip
type: string
title: ZIP
- example: "90210"
+ example: '90210'
pattern: ^(\d{5})$
x-nullable: true
secondaryDestinationAddress:
@@ -6352,6 +6354,60 @@ definitions:
type: array
items:
$ref: 'definitions/TransportationOffice.yaml'
+ MovePayload:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ example: c56a4180-65aa-42ec-a945-5fd21dec0538
+ orders_id:
+ type: string
+ format: uuid
+ example: c56a4180-65aa-42ec-a945-5fd21dec0538
+ service_member_id:
+ type: string
+ format: uuid
+ example: c56a4180-65aa-42ec-a945-5fd21dec0538
+ readOnly: true
+ locator:
+ type: string
+ example: '12432'
+ status:
+ $ref: '#/definitions/MoveStatus'
+ created_at:
+ type: string
+ format: date-time
+ updated_at:
+ type: string
+ format: date-time
+ submitted_at:
+ type: string
+ format: date-time
+ x-nullable: true
+ mto_shipments:
+ $ref: '#/definitions/MTOShipments'
+ closeout_office:
+ $ref: '#/definitions/TransportationOffice'
+ cancel_reason:
+ type: string
+ example: Change of orders
+ x-nullable: true
+ eTag:
+ type: string
+ primeCounselingCompletedAt:
+ format: date-time
+ type: string
+ readOnly: true
+ additionalDocuments:
+ $ref: 'definitions/Document.yaml'
+ required:
+ - id
+ - orders_id
+ - locator
+ - created_at
+ - updated_at
+ - eTag
responses:
InvalidRequest:
description: The request payload is invalid
diff --git a/swagger/ghc.yaml b/swagger/ghc.yaml
index acb2f5e89b1..96d0a3cc76c 100644
--- a/swagger/ghc.yaml
+++ b/swagger/ghc.yaml
@@ -4519,6 +4519,8 @@ definitions:
type: string
format: date-time
x-nullable: true
+ additionalDocuments:
+ $ref: '#/definitions/Document'
MoveHistory:
properties:
id:
@@ -6594,6 +6596,60 @@ definitions:
type: array
items:
$ref: '#/definitions/TransportationOffice'
+ MovePayload:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ example: c56a4180-65aa-42ec-a945-5fd21dec0538
+ orders_id:
+ type: string
+ format: uuid
+ example: c56a4180-65aa-42ec-a945-5fd21dec0538
+ service_member_id:
+ type: string
+ format: uuid
+ example: c56a4180-65aa-42ec-a945-5fd21dec0538
+ readOnly: true
+ locator:
+ type: string
+ example: '12432'
+ status:
+ $ref: '#/definitions/MoveStatus'
+ created_at:
+ type: string
+ format: date-time
+ updated_at:
+ type: string
+ format: date-time
+ submitted_at:
+ type: string
+ format: date-time
+ x-nullable: true
+ mto_shipments:
+ $ref: '#/definitions/MTOShipments'
+ closeout_office:
+ $ref: '#/definitions/TransportationOffice'
+ cancel_reason:
+ type: string
+ example: Change of orders
+ x-nullable: true
+ eTag:
+ type: string
+ primeCounselingCompletedAt:
+ format: date-time
+ type: string
+ readOnly: true
+ additionalDocuments:
+ $ref: '#/definitions/Document'
+ required:
+ - id
+ - orders_id
+ - locator
+ - created_at
+ - updated_at
+ - eTag
Affiliation:
type: string
x-nullable: true
@@ -6855,6 +6911,76 @@ definitions:
WOUNDED_WARRIOR: Wounded Warrior
BLUEBARK: BLUEBARK
SAFETY: Safety
+ Upload:
+ description: An uploaded file.
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ example: c56a4180-65aa-42ec-a945-5fd21dec0538
+ readOnly: true
+ url:
+ type: string
+ format: uri
+ example: https://uploads.domain.test/dir/c56a4180-65aa-42ec-a945-5fd21dec0538
+ readOnly: true
+ filename:
+ type: string
+ example: filename.pdf
+ readOnly: true
+ contentType:
+ type: string
+ format: mime-type
+ example: application/pdf
+ readOnly: true
+ bytes:
+ type: integer
+ readOnly: true
+ status:
+ type: string
+ enum:
+ - INFECTED
+ - CLEAN
+ - PROCESSING
+ readOnly: true
+ createdAt:
+ type: string
+ format: date-time
+ readOnly: true
+ updatedAt:
+ type: string
+ format: date-time
+ readOnly: true
+ isWeightTicket:
+ type: boolean
+ required:
+ - id
+ - url
+ - filename
+ - contentType
+ - bytes
+ - createdAt
+ - updatedAt
+ Document:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ example: c56a4180-65aa-42ec-a945-5fd21dec0538
+ service_member_id:
+ type: string
+ format: uuid
+ title: The service member this document belongs to
+ uploads:
+ type: array
+ items:
+ $ref: '#/definitions/Upload'
+ required:
+ - id
+ - service_member_id
+ - uploads
NullableString:
type: string
x-go-type:
@@ -6990,57 +7116,6 @@ definitions:
- SUBMITTED
- APPROVED
- REJECTED
- Upload:
- description: An uploaded file.
- type: object
- properties:
- id:
- type: string
- format: uuid
- example: c56a4180-65aa-42ec-a945-5fd21dec0538
- readOnly: true
- url:
- type: string
- format: uri
- example: https://uploads.domain.test/dir/c56a4180-65aa-42ec-a945-5fd21dec0538
- readOnly: true
- filename:
- type: string
- example: filename.pdf
- readOnly: true
- contentType:
- type: string
- format: mime-type
- example: application/pdf
- readOnly: true
- bytes:
- type: integer
- readOnly: true
- status:
- type: string
- enum:
- - INFECTED
- - CLEAN
- - PROCESSING
- readOnly: true
- createdAt:
- type: string
- format: date-time
- readOnly: true
- updatedAt:
- type: string
- format: date-time
- readOnly: true
- isWeightTicket:
- type: boolean
- required:
- - id
- - url
- - filename
- - contentType
- - bytes
- - createdAt
- - updatedAt
ServiceRequestDocument:
type: object
properties:
@@ -7516,25 +7591,6 @@ definitions:
- EDITED
- RECEIVED
- NOT_RECEIVED
- Document:
- type: object
- properties:
- id:
- type: string
- format: uuid
- example: c56a4180-65aa-42ec-a945-5fd21dec0538
- service_member_id:
- type: string
- format: uuid
- title: The service member this document belongs to
- uploads:
- type: array
- items:
- $ref: '#/definitions/Upload'
- required:
- - id
- - service_member_id
- - uploads
OmittablePPMDocumentStatus:
description: Status of the PPM document.
type: string