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