diff --git a/Gopkg.lock b/Gopkg.lock index 6e941ff4cf..d616a6cc2e 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -9,6 +9,22 @@ revision = "debcad1964693daf8ef4bc06292d7e828e075130" version = "v0.31.0" +[[projects]] + digest = "1:bd3632deea7c224314b504dc51fbd244a59163e89c0cb730877d51bb13f5f74a" + name = "github.com/PuerkitoBio/purell" + packages = ["."] + pruneopts = "T" + revision = "44968752391892e1b0d0b821ee79e9a85fa13049" + version = "v1.1.1" + +[[projects]] + branch = "master" + digest = "1:c739832d67eb1e9cc478a19cc1a1ccd78df0397bf8a32978b759152e205f644b" + name = "github.com/PuerkitoBio/urlesc" + packages = ["."] + pruneopts = "T" + revision = "de5bf2ad457846296e2031421a34e2568e304e35" + [[projects]] branch = "master" digest = "1:95197dfe44157a59ca91bffb8faa59a14f220806a3ed394d35a39c72180f8e36" @@ -134,6 +150,38 @@ revision = "7536572e8d55209135cd5e7ccf7fce43dca217ab" version = "v0.1.0" +[[projects]] + digest = "1:701ec53dfa0182bf25e5c09e664906f11d697e779b59461a2607dbd4dc75a4f9" + name = "github.com/go-openapi/jsonpointer" + packages = ["."] + pruneopts = "T" + revision = "ef5f0afec364d3b9396b7b77b43dbe26bf1f8004" + version = "v0.18.0" + +[[projects]] + digest = "1:3f17ebd557845adeb347c9e398394e96ebc18e0ec94cc04972be87851a4679e0" + name = "github.com/go-openapi/jsonreference" + packages = ["."] + pruneopts = "T" + revision = "8483a886a90412cd6858df4ea3483dce9c8e35a3" + version = "v0.18.0" + +[[projects]] + digest = "1:aab0bf9ea37838fc396fa23a503c51f12335e3f571fe78e0025d35e498bf7689" + name = "github.com/go-openapi/spec" + packages = ["."] + pruneopts = "T" + revision = "5b6cdde3200976e3ecceb2868706ee39b6aff3e4" + version = "v0.18.0" + +[[projects]] + digest = "1:1b0d6468099d6a5b331ce46f5a398ef368abc6220d79825baf03a672f9d4e816" + name = "github.com/go-openapi/swag" + packages = ["."] + pruneopts = "T" + revision = "1d29f06aebd59ccdf11ae04aa0334ded96e2d909" + version = "v0.18.0" + [[projects]] digest = "1:883149c2b3962c5e30d79d7d717c341260cb579baef61202723745e8e23954e8" name = "github.com/gobuffalo/envy" @@ -310,6 +358,18 @@ revision = "5c8c8bd35d3832f5d134ae1e1e375b69a4d25242" version = "v1.0.1" +[[projects]] + branch = "master" + digest = "1:173c1a4b67a54fb4d76311e3fb7eb8a586df8146ab39ca054ec330b6cc72f0cb" + name = "github.com/mailru/easyjson" + packages = [ + "buffer", + "jlexer", + "jwriter", + ] + pruneopts = "T" + revision = "6243d8e04c3f819e79757e8bc3faa15c3cb27003" + [[projects]] digest = "1:3804a3a02964db8e6db3e5e7960ac1c1a9b12835642dd4f4ac4e56c749ec73eb" name = "github.com/markbates/inflect" @@ -412,7 +472,7 @@ revision = "cec6269883be26556e63500b6df19a0b6691992e" [[projects]] - digest = "1:c49c9300cc3bcc68bc1380ac1bad9ccc190f4f53c58dc208d805eda92c3b9279" + digest = "1:a6e8f781678c5936540153af83838657342f4a6d5478ad9c3f527ce864a8be0c" name = "github.com/openshift/cluster-api" packages = [ "pkg/apis", @@ -426,34 +486,41 @@ "pkg/client/clientset_generated/clientset/typed/machine/v1beta1", "pkg/controller/error", "pkg/controller/machine", + "pkg/controller/node", + "pkg/controller/noderefutil", "pkg/errors", "pkg/util", ] pruneopts = "T" - revision = "91fca585a85b163ddfd119fd09c128c9feadddca" + revision = "0c3e884db79556cf786aa8436f5be977ef10c211" [[projects]] - digest = "1:bb7392bb4b4067e08472994f84513caf955ba52742fa50d954e5f2e45d9dc956" + branch = "master" + digest = "1:eaea9bd99a16cae8d58a2c91d40c46b902deb76a1ab850ec4b75ce90ebdbc9f0" name = "github.com/openshift/cluster-api-actuator-pkg" packages = [ + "pkg/e2e", + "pkg/e2e/actuators", + "pkg/e2e/autoscaler", "pkg/e2e/framework", - "pkg/e2e/openshift", - "pkg/e2e/openshift/suites", + "pkg/e2e/infra", + "pkg/e2e/operators", "pkg/manifests", "pkg/types", ] - pruneopts = "T" - revision = "2620fd63480ea1155c71de87a022f1f564f09ff2" + pruneopts = "" + revision = "46c9e34b233ddc7e2f952e74226bb6af792748cc" [[projects]] - digest = "1:eb7058f08b175230d9e6a9a040696b909f7641278e9f394b7168f89b1c5a730d" + branch = "master" + digest = "1:431bada388129ea31e4997b196dc40730c5c9edd442b8df7b741d143b7b809c4" name = "github.com/openshift/cluster-autoscaler-operator" packages = [ "pkg/apis", "pkg/apis/autoscaling/v1alpha1", ] pruneopts = "T" - revision = "4bcabb30b24b7289ea2b935f5a9cf0b89784835d" + revision = "1df9eecb2d95391e36a0269669e199c2943fde66" [[projects]] branch = "master" @@ -723,6 +790,7 @@ "unicode/cldr", "unicode/norm", "unicode/rangetable", + "width", ] pruneopts = "T" revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" @@ -1046,7 +1114,10 @@ branch = "master" digest = "1:152cd19bedf58a86d6b8b9ca42a428e4f16a9415f81e248a800b6a46c77dc486" name = "k8s.io/kube-openapi" - packages = ["pkg/util/proto"] + packages = [ + "pkg/common", + "pkg/util/proto", + ] pruneopts = "T" revision = "72693cb1fadd73ae2742f6fe29af77d1aecdd8cd" @@ -1127,6 +1198,7 @@ input-imports = [ "github.com/aws/aws-sdk-go/aws", "github.com/aws/aws-sdk-go/aws/credentials", + "github.com/aws/aws-sdk-go/aws/request", "github.com/aws/aws-sdk-go/aws/session", "github.com/aws/aws-sdk-go/service/ec2", "github.com/aws/aws-sdk-go/service/ec2/ec2iface", @@ -1141,8 +1213,13 @@ "github.com/golang/mock/gomock", "github.com/onsi/ginkgo", "github.com/onsi/gomega", + "github.com/openshift/api/config/v1", + "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e", + "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/actuators", + "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/autoscaler", "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/framework", - "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/openshift", + "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/infra", + "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/operators", "github.com/openshift/cluster-api-actuator-pkg/pkg/manifests", "github.com/openshift/cluster-api-actuator-pkg/pkg/types", "github.com/openshift/cluster-api/pkg/apis", @@ -1150,6 +1227,7 @@ "github.com/openshift/cluster-api/pkg/controller/error", "github.com/openshift/cluster-api/pkg/controller/machine", "github.com/openshift/cluster-api/pkg/errors", + "github.com/openshift/cluster-autoscaler-operator/pkg/apis", "github.com/openshift/kubernetes-drain", "github.com/prometheus/common/log", "github.com/spf13/cobra", diff --git a/Gopkg.toml b/Gopkg.toml index b55257ccb3..31225db76c 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -13,12 +13,17 @@ required = [ "sigs.k8s.io/controller-runtime/pkg/source", "sigs.k8s.io/testing_frameworks/integration", # for integration testing "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1", - "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/openshift" + "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e", + "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/actuators", + "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/autoscaler", + "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/infra", + "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/operators", + "github.com/openshift/cluster-autoscaler-operator/pkg/apis", + "github.com/openshift/api/config/v1", + "github.com/onsi/ginkgo", + "github.com/onsi/gomega", ] -[prune] - go-tests = true - [[constraint]] name = "github.com/aws/aws-sdk-go" version = "v1.15.5" @@ -60,13 +65,15 @@ required = [ name="sigs.k8s.io/controller-tools" version="v0.1.1" +# For dependency below: Refer to issue https://github.com/golang/dep/issues/1799 + [[override]] + name = "gopkg.in/fsnotify.v1" + source = "https://github.com/fsnotify/fsnotify.git" + version="v1.4.7" -[[constraint]] - name = "github.com/openshift/cluster-api-actuator-pkg" - revision = "2620fd63480ea1155c71de87a022f1f564f09ff2" +[prune] + go-tests = true -# For dependency below: Refer to issue https://github.com/golang/dep/issues/1799 -[[override]] -name = "gopkg.in/fsnotify.v1" -source = "https://github.com/fsnotify/fsnotify.git" -version="v1.4.7" + [[prune.project]] + name = "github.com/openshift/cluster-api-actuator-pkg" + go-tests = false diff --git a/vendor/github.com/PuerkitoBio/purell/.gitignore b/vendor/github.com/PuerkitoBio/purell/.gitignore new file mode 100644 index 0000000000..748e4c8073 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/purell/.gitignore @@ -0,0 +1,5 @@ +*.sublime-* +.DS_Store +*.swp +*.swo +tags diff --git a/vendor/github.com/PuerkitoBio/purell/.travis.yml b/vendor/github.com/PuerkitoBio/purell/.travis.yml new file mode 100644 index 0000000000..cf31e6af6d --- /dev/null +++ b/vendor/github.com/PuerkitoBio/purell/.travis.yml @@ -0,0 +1,12 @@ +language: go + +go: + - 1.4.x + - 1.5.x + - 1.6.x + - 1.7.x + - 1.8.x + - 1.9.x + - "1.10.x" + - "1.11.x" + - tip diff --git a/vendor/github.com/PuerkitoBio/purell/LICENSE b/vendor/github.com/PuerkitoBio/purell/LICENSE new file mode 100644 index 0000000000..4b9986dea7 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/purell/LICENSE @@ -0,0 +1,12 @@ +Copyright (c) 2012, Martin Angers +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/PuerkitoBio/purell/README.md b/vendor/github.com/PuerkitoBio/purell/README.md new file mode 100644 index 0000000000..07de0c4986 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/purell/README.md @@ -0,0 +1,188 @@ +# Purell + +Purell is a tiny Go library to normalize URLs. It returns a pure URL. Pure-ell. Sanitizer and all. Yeah, I know... + +Based on the [wikipedia paper][wiki] and the [RFC 3986 document][rfc]. + +[![build status](https://travis-ci.org/PuerkitoBio/purell.svg?branch=master)](http://travis-ci.org/PuerkitoBio/purell) + +## Install + +`go get github.com/PuerkitoBio/purell` + +## Changelog + +* **v1.1.1** : Fix failing test due to Go1.12 changes (thanks to @ianlancetaylor). +* **2016-11-14 (v1.1.0)** : IDN: Conform to RFC 5895: Fold character width (thanks to @beeker1121). +* **2016-07-27 (v1.0.0)** : Normalize IDN to ASCII (thanks to @zenovich). +* **2015-02-08** : Add fix for relative paths issue ([PR #5][pr5]) and add fix for unnecessary encoding of reserved characters ([see issue #7][iss7]). +* **v0.2.0** : Add benchmarks, Attempt IDN support. +* **v0.1.0** : Initial release. + +## Examples + +From `example_test.go` (note that in your code, you would import "github.com/PuerkitoBio/purell", and would prefix references to its methods and constants with "purell."): + +```go +package purell + +import ( + "fmt" + "net/url" +) + +func ExampleNormalizeURLString() { + if normalized, err := NormalizeURLString("hTTp://someWEBsite.com:80/Amazing%3f/url/", + FlagLowercaseScheme|FlagLowercaseHost|FlagUppercaseEscapes); err != nil { + panic(err) + } else { + fmt.Print(normalized) + } + // Output: http://somewebsite.com:80/Amazing%3F/url/ +} + +func ExampleMustNormalizeURLString() { + normalized := MustNormalizeURLString("hTTpS://someWEBsite.com:443/Amazing%fa/url/", + FlagsUnsafeGreedy) + fmt.Print(normalized) + + // Output: http://somewebsite.com/Amazing%FA/url +} + +func ExampleNormalizeURL() { + if u, err := url.Parse("Http://SomeUrl.com:8080/a/b/.././c///g?c=3&a=1&b=9&c=0#target"); err != nil { + panic(err) + } else { + normalized := NormalizeURL(u, FlagsUsuallySafeGreedy|FlagRemoveDuplicateSlashes|FlagRemoveFragment) + fmt.Print(normalized) + } + + // Output: http://someurl.com:8080/a/c/g?c=3&a=1&b=9&c=0 +} +``` + +## API + +As seen in the examples above, purell offers three methods, `NormalizeURLString(string, NormalizationFlags) (string, error)`, `MustNormalizeURLString(string, NormalizationFlags) (string)` and `NormalizeURL(*url.URL, NormalizationFlags) (string)`. They all normalize the provided URL based on the specified flags. Here are the available flags: + +```go +const ( + // Safe normalizations + FlagLowercaseScheme NormalizationFlags = 1 << iota // HTTP://host -> http://host, applied by default in Go1.1 + FlagLowercaseHost // http://HOST -> http://host + FlagUppercaseEscapes // http://host/t%ef -> http://host/t%EF + FlagDecodeUnnecessaryEscapes // http://host/t%41 -> http://host/tA + FlagEncodeNecessaryEscapes // http://host/!"#$ -> http://host/%21%22#$ + FlagRemoveDefaultPort // http://host:80 -> http://host + FlagRemoveEmptyQuerySeparator // http://host/path? -> http://host/path + + // Usually safe normalizations + FlagRemoveTrailingSlash // http://host/path/ -> http://host/path + FlagAddTrailingSlash // http://host/path -> http://host/path/ (should choose only one of these add/remove trailing slash flags) + FlagRemoveDotSegments // http://host/path/./a/b/../c -> http://host/path/a/c + + // Unsafe normalizations + FlagRemoveDirectoryIndex // http://host/path/index.html -> http://host/path/ + FlagRemoveFragment // http://host/path#fragment -> http://host/path + FlagForceHTTP // https://host -> http://host + FlagRemoveDuplicateSlashes // http://host/path//a///b -> http://host/path/a/b + FlagRemoveWWW // http://www.host/ -> http://host/ + FlagAddWWW // http://host/ -> http://www.host/ (should choose only one of these add/remove WWW flags) + FlagSortQuery // http://host/path?c=3&b=2&a=1&b=1 -> http://host/path?a=1&b=1&b=2&c=3 + + // Normalizations not in the wikipedia article, required to cover tests cases + // submitted by jehiah + FlagDecodeDWORDHost // http://1113982867 -> http://66.102.7.147 + FlagDecodeOctalHost // http://0102.0146.07.0223 -> http://66.102.7.147 + FlagDecodeHexHost // http://0x42660793 -> http://66.102.7.147 + FlagRemoveUnnecessaryHostDots // http://.host../path -> http://host/path + FlagRemoveEmptyPortSeparator // http://host:/path -> http://host/path + + // Convenience set of safe normalizations + FlagsSafe NormalizationFlags = FlagLowercaseHost | FlagLowercaseScheme | FlagUppercaseEscapes | FlagDecodeUnnecessaryEscapes | FlagEncodeNecessaryEscapes | FlagRemoveDefaultPort | FlagRemoveEmptyQuerySeparator + + // For convenience sets, "greedy" uses the "remove trailing slash" and "remove www. prefix" flags, + // while "non-greedy" uses the "add (or keep) the trailing slash" and "add www. prefix". + + // Convenience set of usually safe normalizations (includes FlagsSafe) + FlagsUsuallySafeGreedy NormalizationFlags = FlagsSafe | FlagRemoveTrailingSlash | FlagRemoveDotSegments + FlagsUsuallySafeNonGreedy NormalizationFlags = FlagsSafe | FlagAddTrailingSlash | FlagRemoveDotSegments + + // Convenience set of unsafe normalizations (includes FlagsUsuallySafe) + FlagsUnsafeGreedy NormalizationFlags = FlagsUsuallySafeGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagRemoveWWW | FlagSortQuery + FlagsUnsafeNonGreedy NormalizationFlags = FlagsUsuallySafeNonGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagAddWWW | FlagSortQuery + + // Convenience set of all available flags + FlagsAllGreedy = FlagsUnsafeGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator + FlagsAllNonGreedy = FlagsUnsafeNonGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator +) +``` + +For convenience, the set of flags `FlagsSafe`, `FlagsUsuallySafe[Greedy|NonGreedy]`, `FlagsUnsafe[Greedy|NonGreedy]` and `FlagsAll[Greedy|NonGreedy]` are provided for the similarly grouped normalizations on [wikipedia's URL normalization page][wiki]. You can add (using the bitwise OR `|` operator) or remove (using the bitwise AND NOT `&^` operator) individual flags from the sets if required, to build your own custom set. + +The [full godoc reference is available on gopkgdoc][godoc]. + +Some things to note: + +* `FlagDecodeUnnecessaryEscapes`, `FlagEncodeNecessaryEscapes`, `FlagUppercaseEscapes` and `FlagRemoveEmptyQuerySeparator` are always implicitly set, because internally, the URL string is parsed as an URL object, which automatically decodes unnecessary escapes, uppercases and encodes necessary ones, and removes empty query separators (an unnecessary `?` at the end of the url). So this operation cannot **not** be done. For this reason, `FlagRemoveEmptyQuerySeparator` (as well as the other three) has been included in the `FlagsSafe` convenience set, instead of `FlagsUnsafe`, where Wikipedia puts it. + +* The `FlagDecodeUnnecessaryEscapes` decodes the following escapes (*from -> to*): + - %24 -> $ + - %26 -> & + - %2B-%3B -> +,-./0123456789:; + - %3D -> = + - %40-%5A -> @ABCDEFGHIJKLMNOPQRSTUVWXYZ + - %5F -> _ + - %61-%7A -> abcdefghijklmnopqrstuvwxyz + - %7E -> ~ + + +* When the `NormalizeURL` function is used (passing an URL object), this source URL object is modified (that is, after the call, the URL object will be modified to reflect the normalization). + +* The *replace IP with domain name* normalization (`http://208.77.188.166/ → http://www.example.com/`) is obviously not possible for a library without making some network requests. This is not implemented in purell. + +* The *remove unused query string parameters* and *remove default query parameters* are also not implemented, since this is a very case-specific normalization, and it is quite trivial to do with an URL object. + +### Safe vs Usually Safe vs Unsafe + +Purell allows you to control the level of risk you take while normalizing an URL. You can aggressively normalize, play it totally safe, or anything in between. + +Consider the following URL: + +`HTTPS://www.RooT.com/toto/t%45%1f///a/./b/../c/?z=3&w=2&a=4&w=1#invalid` + +Normalizing with the `FlagsSafe` gives: + +`https://www.root.com/toto/tE%1F///a/./b/../c/?z=3&w=2&a=4&w=1#invalid` + +With the `FlagsUsuallySafeGreedy`: + +`https://www.root.com/toto/tE%1F///a/c?z=3&w=2&a=4&w=1#invalid` + +And with `FlagsUnsafeGreedy`: + +`http://root.com/toto/tE%1F/a/c?a=4&w=1&w=2&z=3` + +## TODOs + +* Add a class/default instance to allow specifying custom directory index names? At the moment, removing directory index removes `(^|/)((?:default|index)\.\w{1,4})$`. + +## Thanks / Contributions + +@rogpeppe +@jehiah +@opennota +@pchristopher1275 +@zenovich +@beeker1121 + +## License + +The [BSD 3-Clause license][bsd]. + +[bsd]: http://opensource.org/licenses/BSD-3-Clause +[wiki]: http://en.wikipedia.org/wiki/URL_normalization +[rfc]: http://tools.ietf.org/html/rfc3986#section-6 +[godoc]: http://go.pkgdoc.org/github.com/PuerkitoBio/purell +[pr5]: https://github.com/PuerkitoBio/purell/pull/5 +[iss7]: https://github.com/PuerkitoBio/purell/issues/7 diff --git a/vendor/github.com/PuerkitoBio/purell/benchmarks/v0.1.0 b/vendor/github.com/PuerkitoBio/purell/benchmarks/v0.1.0 new file mode 100644 index 0000000000..3bbe7113c5 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/purell/benchmarks/v0.1.0 @@ -0,0 +1,9 @@ +PASS +BenchmarkSafe 500000 6131 ns/op +BenchmarkUsuallySafe 200000 7864 ns/op +BenchmarkUnsafe 100000 28560 ns/op +BenchmarkAllDWORD 50000 38722 ns/op +BenchmarkAllOctal 50000 40941 ns/op +BenchmarkAllHex 50000 44063 ns/op +BenchmarkAllCombined 50000 33613 ns/op +ok github.com/PuerkitoBio/purell 17.404s diff --git a/vendor/github.com/PuerkitoBio/purell/purell.go b/vendor/github.com/PuerkitoBio/purell/purell.go new file mode 100644 index 0000000000..6d0fc190a1 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/purell/purell.go @@ -0,0 +1,379 @@ +/* +Package purell offers URL normalization as described on the wikipedia page: +http://en.wikipedia.org/wiki/URL_normalization +*/ +package purell + +import ( + "bytes" + "fmt" + "net/url" + "regexp" + "sort" + "strconv" + "strings" + + "github.com/PuerkitoBio/urlesc" + "golang.org/x/net/idna" + "golang.org/x/text/unicode/norm" + "golang.org/x/text/width" +) + +// A set of normalization flags determines how a URL will +// be normalized. +type NormalizationFlags uint + +const ( + // Safe normalizations + FlagLowercaseScheme NormalizationFlags = 1 << iota // HTTP://host -> http://host, applied by default in Go1.1 + FlagLowercaseHost // http://HOST -> http://host + FlagUppercaseEscapes // http://host/t%ef -> http://host/t%EF + FlagDecodeUnnecessaryEscapes // http://host/t%41 -> http://host/tA + FlagEncodeNecessaryEscapes // http://host/!"#$ -> http://host/%21%22#$ + FlagRemoveDefaultPort // http://host:80 -> http://host + FlagRemoveEmptyQuerySeparator // http://host/path? -> http://host/path + + // Usually safe normalizations + FlagRemoveTrailingSlash // http://host/path/ -> http://host/path + FlagAddTrailingSlash // http://host/path -> http://host/path/ (should choose only one of these add/remove trailing slash flags) + FlagRemoveDotSegments // http://host/path/./a/b/../c -> http://host/path/a/c + + // Unsafe normalizations + FlagRemoveDirectoryIndex // http://host/path/index.html -> http://host/path/ + FlagRemoveFragment // http://host/path#fragment -> http://host/path + FlagForceHTTP // https://host -> http://host + FlagRemoveDuplicateSlashes // http://host/path//a///b -> http://host/path/a/b + FlagRemoveWWW // http://www.host/ -> http://host/ + FlagAddWWW // http://host/ -> http://www.host/ (should choose only one of these add/remove WWW flags) + FlagSortQuery // http://host/path?c=3&b=2&a=1&b=1 -> http://host/path?a=1&b=1&b=2&c=3 + + // Normalizations not in the wikipedia article, required to cover tests cases + // submitted by jehiah + FlagDecodeDWORDHost // http://1113982867 -> http://66.102.7.147 + FlagDecodeOctalHost // http://0102.0146.07.0223 -> http://66.102.7.147 + FlagDecodeHexHost // http://0x42660793 -> http://66.102.7.147 + FlagRemoveUnnecessaryHostDots // http://.host../path -> http://host/path + FlagRemoveEmptyPortSeparator // http://host:/path -> http://host/path + + // Convenience set of safe normalizations + FlagsSafe NormalizationFlags = FlagLowercaseHost | FlagLowercaseScheme | FlagUppercaseEscapes | FlagDecodeUnnecessaryEscapes | FlagEncodeNecessaryEscapes | FlagRemoveDefaultPort | FlagRemoveEmptyQuerySeparator + + // For convenience sets, "greedy" uses the "remove trailing slash" and "remove www. prefix" flags, + // while "non-greedy" uses the "add (or keep) the trailing slash" and "add www. prefix". + + // Convenience set of usually safe normalizations (includes FlagsSafe) + FlagsUsuallySafeGreedy NormalizationFlags = FlagsSafe | FlagRemoveTrailingSlash | FlagRemoveDotSegments + FlagsUsuallySafeNonGreedy NormalizationFlags = FlagsSafe | FlagAddTrailingSlash | FlagRemoveDotSegments + + // Convenience set of unsafe normalizations (includes FlagsUsuallySafe) + FlagsUnsafeGreedy NormalizationFlags = FlagsUsuallySafeGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagRemoveWWW | FlagSortQuery + FlagsUnsafeNonGreedy NormalizationFlags = FlagsUsuallySafeNonGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagAddWWW | FlagSortQuery + + // Convenience set of all available flags + FlagsAllGreedy = FlagsUnsafeGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator + FlagsAllNonGreedy = FlagsUnsafeNonGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator +) + +const ( + defaultHttpPort = ":80" + defaultHttpsPort = ":443" +) + +// Regular expressions used by the normalizations +var rxPort = regexp.MustCompile(`(:\d+)/?$`) +var rxDirIndex = regexp.MustCompile(`(^|/)((?:default|index)\.\w{1,4})$`) +var rxDupSlashes = regexp.MustCompile(`/{2,}`) +var rxDWORDHost = regexp.MustCompile(`^(\d+)((?:\.+)?(?:\:\d*)?)$`) +var rxOctalHost = regexp.MustCompile(`^(0\d*)\.(0\d*)\.(0\d*)\.(0\d*)((?:\.+)?(?:\:\d*)?)$`) +var rxHexHost = regexp.MustCompile(`^0x([0-9A-Fa-f]+)((?:\.+)?(?:\:\d*)?)$`) +var rxHostDots = regexp.MustCompile(`^(.+?)(:\d+)?$`) +var rxEmptyPort = regexp.MustCompile(`:+$`) + +// Map of flags to implementation function. +// FlagDecodeUnnecessaryEscapes has no action, since it is done automatically +// by parsing the string as an URL. Same for FlagUppercaseEscapes and FlagRemoveEmptyQuerySeparator. + +// Since maps have undefined traversing order, make a slice of ordered keys +var flagsOrder = []NormalizationFlags{ + FlagLowercaseScheme, + FlagLowercaseHost, + FlagRemoveDefaultPort, + FlagRemoveDirectoryIndex, + FlagRemoveDotSegments, + FlagRemoveFragment, + FlagForceHTTP, // Must be after remove default port (because https=443/http=80) + FlagRemoveDuplicateSlashes, + FlagRemoveWWW, + FlagAddWWW, + FlagSortQuery, + FlagDecodeDWORDHost, + FlagDecodeOctalHost, + FlagDecodeHexHost, + FlagRemoveUnnecessaryHostDots, + FlagRemoveEmptyPortSeparator, + FlagRemoveTrailingSlash, // These two (add/remove trailing slash) must be last + FlagAddTrailingSlash, +} + +// ... and then the map, where order is unimportant +var flags = map[NormalizationFlags]func(*url.URL){ + FlagLowercaseScheme: lowercaseScheme, + FlagLowercaseHost: lowercaseHost, + FlagRemoveDefaultPort: removeDefaultPort, + FlagRemoveDirectoryIndex: removeDirectoryIndex, + FlagRemoveDotSegments: removeDotSegments, + FlagRemoveFragment: removeFragment, + FlagForceHTTP: forceHTTP, + FlagRemoveDuplicateSlashes: removeDuplicateSlashes, + FlagRemoveWWW: removeWWW, + FlagAddWWW: addWWW, + FlagSortQuery: sortQuery, + FlagDecodeDWORDHost: decodeDWORDHost, + FlagDecodeOctalHost: decodeOctalHost, + FlagDecodeHexHost: decodeHexHost, + FlagRemoveUnnecessaryHostDots: removeUnncessaryHostDots, + FlagRemoveEmptyPortSeparator: removeEmptyPortSeparator, + FlagRemoveTrailingSlash: removeTrailingSlash, + FlagAddTrailingSlash: addTrailingSlash, +} + +// MustNormalizeURLString returns the normalized string, and panics if an error occurs. +// It takes an URL string as input, as well as the normalization flags. +func MustNormalizeURLString(u string, f NormalizationFlags) string { + result, e := NormalizeURLString(u, f) + if e != nil { + panic(e) + } + return result +} + +// NormalizeURLString returns the normalized string, or an error if it can't be parsed into an URL object. +// It takes an URL string as input, as well as the normalization flags. +func NormalizeURLString(u string, f NormalizationFlags) (string, error) { + parsed, err := url.Parse(u) + if err != nil { + return "", err + } + + if f&FlagLowercaseHost == FlagLowercaseHost { + parsed.Host = strings.ToLower(parsed.Host) + } + + // The idna package doesn't fully conform to RFC 5895 + // (https://tools.ietf.org/html/rfc5895), so we do it here. + // Taken from Go 1.8 cycle source, courtesy of bradfitz. + // TODO: Remove when (if?) idna package conforms to RFC 5895. + parsed.Host = width.Fold.String(parsed.Host) + parsed.Host = norm.NFC.String(parsed.Host) + if parsed.Host, err = idna.ToASCII(parsed.Host); err != nil { + return "", err + } + + return NormalizeURL(parsed, f), nil +} + +// NormalizeURL returns the normalized string. +// It takes a parsed URL object as input, as well as the normalization flags. +func NormalizeURL(u *url.URL, f NormalizationFlags) string { + for _, k := range flagsOrder { + if f&k == k { + flags[k](u) + } + } + return urlesc.Escape(u) +} + +func lowercaseScheme(u *url.URL) { + if len(u.Scheme) > 0 { + u.Scheme = strings.ToLower(u.Scheme) + } +} + +func lowercaseHost(u *url.URL) { + if len(u.Host) > 0 { + u.Host = strings.ToLower(u.Host) + } +} + +func removeDefaultPort(u *url.URL) { + if len(u.Host) > 0 { + scheme := strings.ToLower(u.Scheme) + u.Host = rxPort.ReplaceAllStringFunc(u.Host, func(val string) string { + if (scheme == "http" && val == defaultHttpPort) || (scheme == "https" && val == defaultHttpsPort) { + return "" + } + return val + }) + } +} + +func removeTrailingSlash(u *url.URL) { + if l := len(u.Path); l > 0 { + if strings.HasSuffix(u.Path, "/") { + u.Path = u.Path[:l-1] + } + } else if l = len(u.Host); l > 0 { + if strings.HasSuffix(u.Host, "/") { + u.Host = u.Host[:l-1] + } + } +} + +func addTrailingSlash(u *url.URL) { + if l := len(u.Path); l > 0 { + if !strings.HasSuffix(u.Path, "/") { + u.Path += "/" + } + } else if l = len(u.Host); l > 0 { + if !strings.HasSuffix(u.Host, "/") { + u.Host += "/" + } + } +} + +func removeDotSegments(u *url.URL) { + if len(u.Path) > 0 { + var dotFree []string + var lastIsDot bool + + sections := strings.Split(u.Path, "/") + for _, s := range sections { + if s == ".." { + if len(dotFree) > 0 { + dotFree = dotFree[:len(dotFree)-1] + } + } else if s != "." { + dotFree = append(dotFree, s) + } + lastIsDot = (s == "." || s == "..") + } + // Special case if host does not end with / and new path does not begin with / + u.Path = strings.Join(dotFree, "/") + if u.Host != "" && !strings.HasSuffix(u.Host, "/") && !strings.HasPrefix(u.Path, "/") { + u.Path = "/" + u.Path + } + // Special case if the last segment was a dot, make sure the path ends with a slash + if lastIsDot && !strings.HasSuffix(u.Path, "/") { + u.Path += "/" + } + } +} + +func removeDirectoryIndex(u *url.URL) { + if len(u.Path) > 0 { + u.Path = rxDirIndex.ReplaceAllString(u.Path, "$1") + } +} + +func removeFragment(u *url.URL) { + u.Fragment = "" +} + +func forceHTTP(u *url.URL) { + if strings.ToLower(u.Scheme) == "https" { + u.Scheme = "http" + } +} + +func removeDuplicateSlashes(u *url.URL) { + if len(u.Path) > 0 { + u.Path = rxDupSlashes.ReplaceAllString(u.Path, "/") + } +} + +func removeWWW(u *url.URL) { + if len(u.Host) > 0 && strings.HasPrefix(strings.ToLower(u.Host), "www.") { + u.Host = u.Host[4:] + } +} + +func addWWW(u *url.URL) { + if len(u.Host) > 0 && !strings.HasPrefix(strings.ToLower(u.Host), "www.") { + u.Host = "www." + u.Host + } +} + +func sortQuery(u *url.URL) { + q := u.Query() + + if len(q) > 0 { + arKeys := make([]string, len(q)) + i := 0 + for k := range q { + arKeys[i] = k + i++ + } + sort.Strings(arKeys) + buf := new(bytes.Buffer) + for _, k := range arKeys { + sort.Strings(q[k]) + for _, v := range q[k] { + if buf.Len() > 0 { + buf.WriteRune('&') + } + buf.WriteString(fmt.Sprintf("%s=%s", k, urlesc.QueryEscape(v))) + } + } + + // Rebuild the raw query string + u.RawQuery = buf.String() + } +} + +func decodeDWORDHost(u *url.URL) { + if len(u.Host) > 0 { + if matches := rxDWORDHost.FindStringSubmatch(u.Host); len(matches) > 2 { + var parts [4]int64 + + dword, _ := strconv.ParseInt(matches[1], 10, 0) + for i, shift := range []uint{24, 16, 8, 0} { + parts[i] = dword >> shift & 0xFF + } + u.Host = fmt.Sprintf("%d.%d.%d.%d%s", parts[0], parts[1], parts[2], parts[3], matches[2]) + } + } +} + +func decodeOctalHost(u *url.URL) { + if len(u.Host) > 0 { + if matches := rxOctalHost.FindStringSubmatch(u.Host); len(matches) > 5 { + var parts [4]int64 + + for i := 1; i <= 4; i++ { + parts[i-1], _ = strconv.ParseInt(matches[i], 8, 0) + } + u.Host = fmt.Sprintf("%d.%d.%d.%d%s", parts[0], parts[1], parts[2], parts[3], matches[5]) + } + } +} + +func decodeHexHost(u *url.URL) { + if len(u.Host) > 0 { + if matches := rxHexHost.FindStringSubmatch(u.Host); len(matches) > 2 { + // Conversion is safe because of regex validation + parsed, _ := strconv.ParseInt(matches[1], 16, 0) + // Set host as DWORD (base 10) encoded host + u.Host = fmt.Sprintf("%d%s", parsed, matches[2]) + // The rest is the same as decoding a DWORD host + decodeDWORDHost(u) + } + } +} + +func removeUnncessaryHostDots(u *url.URL) { + if len(u.Host) > 0 { + if matches := rxHostDots.FindStringSubmatch(u.Host); len(matches) > 1 { + // Trim the leading and trailing dots + u.Host = strings.Trim(matches[1], ".") + if len(matches) > 2 { + u.Host += matches[2] + } + } + } +} + +func removeEmptyPortSeparator(u *url.URL) { + if len(u.Host) > 0 { + u.Host = rxEmptyPort.ReplaceAllString(u.Host, "") + } +} diff --git a/vendor/github.com/PuerkitoBio/urlesc/.travis.yml b/vendor/github.com/PuerkitoBio/urlesc/.travis.yml new file mode 100644 index 0000000000..ba6b225f91 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/urlesc/.travis.yml @@ -0,0 +1,15 @@ +language: go + +go: + - 1.4.x + - 1.5.x + - 1.6.x + - 1.7.x + - 1.8.x + - tip + +install: + - go build . + +script: + - go test -v diff --git a/vendor/github.com/PuerkitoBio/urlesc/LICENSE b/vendor/github.com/PuerkitoBio/urlesc/LICENSE new file mode 100644 index 0000000000..7448756763 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/urlesc/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2012 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/PuerkitoBio/urlesc/README.md b/vendor/github.com/PuerkitoBio/urlesc/README.md new file mode 100644 index 0000000000..57aff0a539 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/urlesc/README.md @@ -0,0 +1,16 @@ +urlesc [![Build Status](https://travis-ci.org/PuerkitoBio/urlesc.svg?branch=master)](https://travis-ci.org/PuerkitoBio/urlesc) [![GoDoc](http://godoc.org/github.com/PuerkitoBio/urlesc?status.svg)](http://godoc.org/github.com/PuerkitoBio/urlesc) +====== + +Package urlesc implements query escaping as per RFC 3986. + +It contains some parts of the net/url package, modified so as to allow +some reserved characters incorrectly escaped by net/url (see [issue 5684](https://github.com/golang/go/issues/5684)). + +## Install + + go get github.com/PuerkitoBio/urlesc + +## License + +Go license (BSD-3-Clause) + diff --git a/vendor/github.com/PuerkitoBio/urlesc/urlesc.go b/vendor/github.com/PuerkitoBio/urlesc/urlesc.go new file mode 100644 index 0000000000..1b84624594 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/urlesc/urlesc.go @@ -0,0 +1,180 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package urlesc implements query escaping as per RFC 3986. +// It contains some parts of the net/url package, modified so as to allow +// some reserved characters incorrectly escaped by net/url. +// See https://github.com/golang/go/issues/5684 +package urlesc + +import ( + "bytes" + "net/url" + "strings" +) + +type encoding int + +const ( + encodePath encoding = 1 + iota + encodeUserPassword + encodeQueryComponent + encodeFragment +) + +// Return true if the specified character should be escaped when +// appearing in a URL string, according to RFC 3986. +func shouldEscape(c byte, mode encoding) bool { + // §2.3 Unreserved characters (alphanum) + if 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' { + return false + } + + switch c { + case '-', '.', '_', '~': // §2.3 Unreserved characters (mark) + return false + + // §2.2 Reserved characters (reserved) + case ':', '/', '?', '#', '[', ']', '@', // gen-delims + '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=': // sub-delims + // Different sections of the URL allow a few of + // the reserved characters to appear unescaped. + switch mode { + case encodePath: // §3.3 + // The RFC allows sub-delims and : @. + // '/', '[' and ']' can be used to assign meaning to individual path + // segments. This package only manipulates the path as a whole, + // so we allow those as well. That leaves only ? and # to escape. + return c == '?' || c == '#' + + case encodeUserPassword: // §3.2.1 + // The RFC allows : and sub-delims in + // userinfo. The parsing of userinfo treats ':' as special so we must escape + // all the gen-delims. + return c == ':' || c == '/' || c == '?' || c == '#' || c == '[' || c == ']' || c == '@' + + case encodeQueryComponent: // §3.4 + // The RFC allows / and ?. + return c != '/' && c != '?' + + case encodeFragment: // §4.1 + // The RFC text is silent but the grammar allows + // everything, so escape nothing but # + return c == '#' + } + } + + // Everything else must be escaped. + return true +} + +// QueryEscape escapes the string so it can be safely placed +// inside a URL query. +func QueryEscape(s string) string { + return escape(s, encodeQueryComponent) +} + +func escape(s string, mode encoding) string { + spaceCount, hexCount := 0, 0 + for i := 0; i < len(s); i++ { + c := s[i] + if shouldEscape(c, mode) { + if c == ' ' && mode == encodeQueryComponent { + spaceCount++ + } else { + hexCount++ + } + } + } + + if spaceCount == 0 && hexCount == 0 { + return s + } + + t := make([]byte, len(s)+2*hexCount) + j := 0 + for i := 0; i < len(s); i++ { + switch c := s[i]; { + case c == ' ' && mode == encodeQueryComponent: + t[j] = '+' + j++ + case shouldEscape(c, mode): + t[j] = '%' + t[j+1] = "0123456789ABCDEF"[c>>4] + t[j+2] = "0123456789ABCDEF"[c&15] + j += 3 + default: + t[j] = s[i] + j++ + } + } + return string(t) +} + +var uiReplacer = strings.NewReplacer( + "%21", "!", + "%27", "'", + "%28", "(", + "%29", ")", + "%2A", "*", +) + +// unescapeUserinfo unescapes some characters that need not to be escaped as per RFC3986. +func unescapeUserinfo(s string) string { + return uiReplacer.Replace(s) +} + +// Escape reassembles the URL into a valid URL string. +// The general form of the result is one of: +// +// scheme:opaque +// scheme://userinfo@host/path?query#fragment +// +// If u.Opaque is non-empty, String uses the first form; +// otherwise it uses the second form. +// +// In the second form, the following rules apply: +// - if u.Scheme is empty, scheme: is omitted. +// - if u.User is nil, userinfo@ is omitted. +// - if u.Host is empty, host/ is omitted. +// - if u.Scheme and u.Host are empty and u.User is nil, +// the entire scheme://userinfo@host/ is omitted. +// - if u.Host is non-empty and u.Path begins with a /, +// the form host/path does not add its own /. +// - if u.RawQuery is empty, ?query is omitted. +// - if u.Fragment is empty, #fragment is omitted. +func Escape(u *url.URL) string { + var buf bytes.Buffer + if u.Scheme != "" { + buf.WriteString(u.Scheme) + buf.WriteByte(':') + } + if u.Opaque != "" { + buf.WriteString(u.Opaque) + } else { + if u.Scheme != "" || u.Host != "" || u.User != nil { + buf.WriteString("//") + if ui := u.User; ui != nil { + buf.WriteString(unescapeUserinfo(ui.String())) + buf.WriteByte('@') + } + if h := u.Host; h != "" { + buf.WriteString(h) + } + } + if u.Path != "" && u.Path[0] != '/' && u.Host != "" { + buf.WriteByte('/') + } + buf.WriteString(escape(u.Path, encodePath)) + } + if u.RawQuery != "" { + buf.WriteByte('?') + buf.WriteString(u.RawQuery) + } + if u.Fragment != "" { + buf.WriteByte('#') + buf.WriteString(escape(u.Fragment, encodeFragment)) + } + return buf.String() +} diff --git a/vendor/github.com/go-openapi/jsonpointer/.editorconfig b/vendor/github.com/go-openapi/jsonpointer/.editorconfig new file mode 100644 index 0000000000..3152da69a5 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/.editorconfig @@ -0,0 +1,26 @@ +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +# Set default charset +[*.{js,py,go,scala,rb,java,html,css,less,sass,md}] +charset = utf-8 + +# Tab indentation (no size specified) +[*.go] +indent_style = tab + +[*.md] +trim_trailing_whitespace = false + +# Matches the exact files either package.json or .travis.yml +[{package.json,.travis.yml}] +indent_style = space +indent_size = 2 diff --git a/vendor/github.com/go-openapi/jsonpointer/.github/CONTRIBUTING.md b/vendor/github.com/go-openapi/jsonpointer/.github/CONTRIBUTING.md new file mode 100644 index 0000000000..7dea4240d7 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/.github/CONTRIBUTING.md @@ -0,0 +1,117 @@ +## Contribution Guidelines + +### Pull requests are always welcome + +We are always thrilled to receive pull requests, and do our best to +process them as fast as possible. Not sure if that typo is worth a pull +request? Do it! We will appreciate it. + +If your pull request is not accepted on the first try, don't be +discouraged! If there's a problem with the implementation, hopefully you +received feedback on what to improve. + +We're trying very hard to keep go-swagger lean and focused. We don't want it +to do everything for everybody. This means that we might decide against +incorporating a new feature. However, there might be a way to implement +that feature *on top of* go-swagger. + + +### Conventions + +Fork the repo and make changes on your fork in a feature branch: + +- If it's a bugfix branch, name it XXX-something where XXX is the number of the + issue +- If it's a feature branch, create an enhancement issue to announce your + intentions, and name it XXX-something where XXX is the number of the issue. + +Submit unit tests for your changes. Go has a great test framework built in; use +it! Take a look at existing tests for inspiration. Run the full test suite on +your branch before submitting a pull request. + +Update the documentation when creating or modifying features. Test +your documentation changes for clarity, concision, and correctness, as +well as a clean documentation build. See ``docs/README.md`` for more +information on building the docs and how docs get released. + +Write clean code. Universally formatted code promotes ease of writing, reading, +and maintenance. Always run `gofmt -s -w file.go` on each changed file before +committing your changes. Most editors have plugins that do this automatically. + +Pull requests descriptions should be as clear as possible and include a +reference to all the issues that they address. + +Pull requests must not contain commits from other users or branches. + +Commit messages must start with a capitalized and short summary (max. 50 +chars) written in the imperative, followed by an optional, more detailed +explanatory text which is separated from the summary by an empty line. + +Code review comments may be added to your pull request. Discuss, then make the +suggested modifications and push additional commits to your feature branch. Be +sure to post a comment after pushing. The new commits will show up in the pull +request automatically, but the reviewers will not be notified unless you +comment. + +Before the pull request is merged, make sure that you squash your commits into +logical units of work using `git rebase -i` and `git push -f`. After every +commit the test suite should be passing. Include documentation changes in the +same commit so that a revert would remove all traces of the feature or fix. + +Commits that fix or close an issue should include a reference like `Closes #XXX` +or `Fixes #XXX`, which will automatically close the issue when merged. + +### Sign your work + +The sign-off is a simple line at the end of the explanation for the +patch, which certifies that you wrote it or otherwise have the right to +pass it on as an open-source patch. The rules are pretty simple: if you +can certify the below (from +[developercertificate.org](http://developercertificate.org/)): + +``` +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +660 York Street, Suite 102, +San Francisco, CA 94110 USA + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. +``` + +then you just add a line to every git commit message: + + Signed-off-by: Joe Smith + +using your real name (sorry, no pseudonyms or anonymous contributions.) + +You can add the sign off when creating the git commit via `git commit -s`. diff --git a/vendor/github.com/go-openapi/jsonpointer/.gitignore b/vendor/github.com/go-openapi/jsonpointer/.gitignore new file mode 100644 index 0000000000..769c244007 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/.gitignore @@ -0,0 +1 @@ +secrets.yml diff --git a/vendor/github.com/go-openapi/jsonpointer/.travis.yml b/vendor/github.com/go-openapi/jsonpointer/.travis.yml new file mode 100644 index 0000000000..3436c4590c --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/.travis.yml @@ -0,0 +1,15 @@ +after_success: +- bash <(curl -s https://codecov.io/bash) +go: +- '1.9' +- 1.10.x +- 1.11.x +install: +- go get -u github.com/stretchr/testify/assert +- go get -u github.com/go-openapi/swag +language: go +notifications: + slack: + secure: a5VgoiwB1G/AZqzmephPZIhEB9avMlsWSlVnM1dSAtYAwdrQHGTQxAmpOxYIoSPDhWNN5bfZmjd29++UlTwLcHSR+e0kJhH6IfDlsHj/HplNCJ9tyI0zYc7XchtdKgeMxMzBKCzgwFXGSbQGydXTliDNBo0HOzmY3cou/daMFTP60K+offcjS+3LRAYb1EroSRXZqrk1nuF/xDL3792DZUdPMiFR/L/Df6y74D6/QP4sTkTDFQitz4Wy/7jbsfj8dG6qK2zivgV6/l+w4OVjFkxVpPXogDWY10vVXNVynqxfJ7to2d1I9lNCHE2ilBCkWMIPdyJF7hjF8pKW+82yP4EzRh0vu8Xn0HT5MZpQxdRY/YMxNrWaG7SxsoEaO4q5uhgdzAqLYY3TRa7MjIK+7Ur+aqOeTXn6OKwVi0CjvZ6mIU3WUKSwiwkFZMbjRAkSb5CYwMEfGFO/z964xz83qGt6WAtBXNotqCQpTIiKtDHQeLOMfksHImCg6JLhQcWBVxamVgu0G3Pdh8Y6DyPnxraXY95+QDavbjqv7TeYT9T/FNnrkXaTTK0s4iWE5H4ACU0Qvz0wUYgfQrZv0/Hp7V17+rabUwnzYySHCy9SWX/7OV9Cfh31iMp9ZIffr76xmmThtOEqs8TrTtU6BWI3rWwvA9cXQipZTVtL0oswrGw= +script: +- go test -v -race -cover -coverprofile=coverage.txt -covermode=atomic ./... diff --git a/vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md b/vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..9322b065e3 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at ivan+abuse@flanders.co.nz. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/go-openapi/jsonpointer/LICENSE b/vendor/github.com/go-openapi/jsonpointer/LICENSE new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/go-openapi/jsonpointer/README.md b/vendor/github.com/go-openapi/jsonpointer/README.md new file mode 100644 index 0000000000..813788aff1 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/README.md @@ -0,0 +1,15 @@ +# gojsonpointer [![Build Status](https://travis-ci.org/go-openapi/jsonpointer.svg?branch=master)](https://travis-ci.org/go-openapi/jsonpointer) [![codecov](https://codecov.io/gh/go-openapi/jsonpointer/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/jsonpointer) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) + +[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/jsonpointer/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/jsonpointer?status.svg)](http://godoc.org/github.com/go-openapi/jsonpointer) +An implementation of JSON Pointer - Go language + +## Status +Completed YES + +Tested YES + +## References +http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07 + +### Note +The 4.Evaluation part of the previous reference, starting with 'If the currently referenced value is a JSON array, the reference token MUST contain either...' is not implemented. diff --git a/vendor/github.com/go-openapi/jsonpointer/go.mod b/vendor/github.com/go-openapi/jsonpointer/go.mod new file mode 100644 index 0000000000..eb4d623c59 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/go.mod @@ -0,0 +1,10 @@ +module github.com/go-openapi/jsonpointer + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-openapi/swag v0.17.0 + github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/testify v1.2.2 + gopkg.in/yaml.v2 v2.2.1 // indirect +) diff --git a/vendor/github.com/go-openapi/jsonpointer/go.sum b/vendor/github.com/go-openapi/jsonpointer/go.sum new file mode 100644 index 0000000000..c71f4d7a29 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/go.sum @@ -0,0 +1,11 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-openapi/swag v0.17.0 h1:7wu+dZ5k83kvUWeAb+WUkFiUhDzwGqzTR/NhWzeo1JU= +github.com/go-openapi/swag v0.17.0/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/go-openapi/jsonpointer/pointer.go b/vendor/github.com/go-openapi/jsonpointer/pointer.go new file mode 100644 index 0000000000..fe2d6ee574 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/pointer.go @@ -0,0 +1,390 @@ +// Copyright 2013 sigu-399 ( https://github.com/sigu-399 ) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// author sigu-399 +// author-github https://github.com/sigu-399 +// author-mail sigu.399@gmail.com +// +// repository-name jsonpointer +// repository-desc An implementation of JSON Pointer - Go language +// +// description Main and unique file. +// +// created 25-02-2013 + +package jsonpointer + +import ( + "errors" + "fmt" + "reflect" + "strconv" + "strings" + + "github.com/go-openapi/swag" +) + +const ( + emptyPointer = `` + pointerSeparator = `/` + + invalidStart = `JSON pointer must be empty or start with a "` + pointerSeparator +) + +var jsonPointableType = reflect.TypeOf(new(JSONPointable)).Elem() +var jsonSetableType = reflect.TypeOf(new(JSONSetable)).Elem() + +// JSONPointable is an interface for structs to implement when they need to customize the +// json pointer process +type JSONPointable interface { + JSONLookup(string) (interface{}, error) +} + +// JSONSetable is an interface for structs to implement when they need to customize the +// json pointer process +type JSONSetable interface { + JSONSet(string, interface{}) error +} + +// New creates a new json pointer for the given string +func New(jsonPointerString string) (Pointer, error) { + + var p Pointer + err := p.parse(jsonPointerString) + return p, err + +} + +// Pointer the json pointer reprsentation +type Pointer struct { + referenceTokens []string +} + +// "Constructor", parses the given string JSON pointer +func (p *Pointer) parse(jsonPointerString string) error { + + var err error + + if jsonPointerString != emptyPointer { + if !strings.HasPrefix(jsonPointerString, pointerSeparator) { + err = errors.New(invalidStart) + } else { + referenceTokens := strings.Split(jsonPointerString, pointerSeparator) + for _, referenceToken := range referenceTokens[1:] { + p.referenceTokens = append(p.referenceTokens, referenceToken) + } + } + } + + return err +} + +// Get uses the pointer to retrieve a value from a JSON document +func (p *Pointer) Get(document interface{}) (interface{}, reflect.Kind, error) { + return p.get(document, swag.DefaultJSONNameProvider) +} + +// Set uses the pointer to set a value from a JSON document +func (p *Pointer) Set(document interface{}, value interface{}) (interface{}, error) { + return document, p.set(document, value, swag.DefaultJSONNameProvider) +} + +// GetForToken gets a value for a json pointer token 1 level deep +func GetForToken(document interface{}, decodedToken string) (interface{}, reflect.Kind, error) { + return getSingleImpl(document, decodedToken, swag.DefaultJSONNameProvider) +} + +// SetForToken gets a value for a json pointer token 1 level deep +func SetForToken(document interface{}, decodedToken string, value interface{}) (interface{}, error) { + return document, setSingleImpl(document, value, decodedToken, swag.DefaultJSONNameProvider) +} + +func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.NameProvider) (interface{}, reflect.Kind, error) { + rValue := reflect.Indirect(reflect.ValueOf(node)) + kind := rValue.Kind() + + switch kind { + + case reflect.Struct: + if rValue.Type().Implements(jsonPointableType) { + r, err := node.(JSONPointable).JSONLookup(decodedToken) + if err != nil { + return nil, kind, err + } + return r, kind, nil + } + nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) + if !ok { + return nil, kind, fmt.Errorf("object has no field %q", decodedToken) + } + fld := rValue.FieldByName(nm) + return fld.Interface(), kind, nil + + case reflect.Map: + kv := reflect.ValueOf(decodedToken) + mv := rValue.MapIndex(kv) + + if mv.IsValid() && !swag.IsZero(mv) { + return mv.Interface(), kind, nil + } + return nil, kind, fmt.Errorf("object has no key %q", decodedToken) + + case reflect.Slice: + tokenIndex, err := strconv.Atoi(decodedToken) + if err != nil { + return nil, kind, err + } + sLength := rValue.Len() + if tokenIndex < 0 || tokenIndex >= sLength { + return nil, kind, fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength-1, tokenIndex) + } + + elem := rValue.Index(tokenIndex) + return elem.Interface(), kind, nil + + default: + return nil, kind, fmt.Errorf("invalid token reference %q", decodedToken) + } + +} + +func setSingleImpl(node, data interface{}, decodedToken string, nameProvider *swag.NameProvider) error { + rValue := reflect.Indirect(reflect.ValueOf(node)) + switch rValue.Kind() { + + case reflect.Struct: + if ns, ok := node.(JSONSetable); ok { // pointer impl + return ns.JSONSet(decodedToken, data) + } + + if rValue.Type().Implements(jsonSetableType) { + return node.(JSONSetable).JSONSet(decodedToken, data) + } + + nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) + if !ok { + return fmt.Errorf("object has no field %q", decodedToken) + } + fld := rValue.FieldByName(nm) + if fld.IsValid() { + fld.Set(reflect.ValueOf(data)) + } + return nil + + case reflect.Map: + kv := reflect.ValueOf(decodedToken) + rValue.SetMapIndex(kv, reflect.ValueOf(data)) + return nil + + case reflect.Slice: + tokenIndex, err := strconv.Atoi(decodedToken) + if err != nil { + return err + } + sLength := rValue.Len() + if tokenIndex < 0 || tokenIndex >= sLength { + return fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength, tokenIndex) + } + + elem := rValue.Index(tokenIndex) + if !elem.CanSet() { + return fmt.Errorf("can't set slice index %s to %v", decodedToken, data) + } + elem.Set(reflect.ValueOf(data)) + return nil + + default: + return fmt.Errorf("invalid token reference %q", decodedToken) + } + +} + +func (p *Pointer) get(node interface{}, nameProvider *swag.NameProvider) (interface{}, reflect.Kind, error) { + + if nameProvider == nil { + nameProvider = swag.DefaultJSONNameProvider + } + + kind := reflect.Invalid + + // Full document when empty + if len(p.referenceTokens) == 0 { + return node, kind, nil + } + + for _, token := range p.referenceTokens { + + decodedToken := Unescape(token) + + r, knd, err := getSingleImpl(node, decodedToken, nameProvider) + if err != nil { + return nil, knd, err + } + node, kind = r, knd + + } + + rValue := reflect.ValueOf(node) + kind = rValue.Kind() + + return node, kind, nil +} + +func (p *Pointer) set(node, data interface{}, nameProvider *swag.NameProvider) error { + knd := reflect.ValueOf(node).Kind() + + if knd != reflect.Ptr && knd != reflect.Struct && knd != reflect.Map && knd != reflect.Slice && knd != reflect.Array { + return fmt.Errorf("only structs, pointers, maps and slices are supported for setting values") + } + + if nameProvider == nil { + nameProvider = swag.DefaultJSONNameProvider + } + + // Full document when empty + if len(p.referenceTokens) == 0 { + return nil + } + + lastI := len(p.referenceTokens) - 1 + for i, token := range p.referenceTokens { + isLastToken := i == lastI + decodedToken := Unescape(token) + + if isLastToken { + + return setSingleImpl(node, data, decodedToken, nameProvider) + } + + rValue := reflect.Indirect(reflect.ValueOf(node)) + kind := rValue.Kind() + + switch kind { + + case reflect.Struct: + if rValue.Type().Implements(jsonPointableType) { + r, err := node.(JSONPointable).JSONLookup(decodedToken) + if err != nil { + return err + } + fld := reflect.ValueOf(r) + if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr { + node = fld.Addr().Interface() + continue + } + node = r + continue + } + nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) + if !ok { + return fmt.Errorf("object has no field %q", decodedToken) + } + fld := rValue.FieldByName(nm) + if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr { + node = fld.Addr().Interface() + continue + } + node = fld.Interface() + + case reflect.Map: + kv := reflect.ValueOf(decodedToken) + mv := rValue.MapIndex(kv) + + if !mv.IsValid() { + return fmt.Errorf("object has no key %q", decodedToken) + } + if mv.CanAddr() && mv.Kind() != reflect.Interface && mv.Kind() != reflect.Map && mv.Kind() != reflect.Slice && mv.Kind() != reflect.Ptr { + node = mv.Addr().Interface() + continue + } + node = mv.Interface() + + case reflect.Slice: + tokenIndex, err := strconv.Atoi(decodedToken) + if err != nil { + return err + } + sLength := rValue.Len() + if tokenIndex < 0 || tokenIndex >= sLength { + return fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength, tokenIndex) + } + + elem := rValue.Index(tokenIndex) + if elem.CanAddr() && elem.Kind() != reflect.Interface && elem.Kind() != reflect.Map && elem.Kind() != reflect.Slice && elem.Kind() != reflect.Ptr { + node = elem.Addr().Interface() + continue + } + node = elem.Interface() + + default: + return fmt.Errorf("invalid token reference %q", decodedToken) + } + + } + + return nil +} + +// DecodedTokens returns the decoded tokens +func (p *Pointer) DecodedTokens() []string { + result := make([]string, 0, len(p.referenceTokens)) + for _, t := range p.referenceTokens { + result = append(result, Unescape(t)) + } + return result +} + +// IsEmpty returns true if this is an empty json pointer +// this indicates that it points to the root document +func (p *Pointer) IsEmpty() bool { + return len(p.referenceTokens) == 0 +} + +// Pointer to string representation function +func (p *Pointer) String() string { + + if len(p.referenceTokens) == 0 { + return emptyPointer + } + + pointerString := pointerSeparator + strings.Join(p.referenceTokens, pointerSeparator) + + return pointerString +} + +// Specific JSON pointer encoding here +// ~0 => ~ +// ~1 => / +// ... and vice versa + +const ( + encRefTok0 = `~0` + encRefTok1 = `~1` + decRefTok0 = `~` + decRefTok1 = `/` +) + +// Unescape unescapes a json pointer reference token string to the original representation +func Unescape(token string) string { + step1 := strings.Replace(token, encRefTok1, decRefTok1, -1) + step2 := strings.Replace(step1, encRefTok0, decRefTok0, -1) + return step2 +} + +// Escape escapes a pointer reference token string +func Escape(token string) string { + step1 := strings.Replace(token, decRefTok0, encRefTok0, -1) + step2 := strings.Replace(step1, decRefTok1, encRefTok1, -1) + return step2 +} diff --git a/vendor/github.com/go-openapi/jsonreference/.github/CONTRIBUTING.md b/vendor/github.com/go-openapi/jsonreference/.github/CONTRIBUTING.md new file mode 100644 index 0000000000..7dea4240d7 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/.github/CONTRIBUTING.md @@ -0,0 +1,117 @@ +## Contribution Guidelines + +### Pull requests are always welcome + +We are always thrilled to receive pull requests, and do our best to +process them as fast as possible. Not sure if that typo is worth a pull +request? Do it! We will appreciate it. + +If your pull request is not accepted on the first try, don't be +discouraged! If there's a problem with the implementation, hopefully you +received feedback on what to improve. + +We're trying very hard to keep go-swagger lean and focused. We don't want it +to do everything for everybody. This means that we might decide against +incorporating a new feature. However, there might be a way to implement +that feature *on top of* go-swagger. + + +### Conventions + +Fork the repo and make changes on your fork in a feature branch: + +- If it's a bugfix branch, name it XXX-something where XXX is the number of the + issue +- If it's a feature branch, create an enhancement issue to announce your + intentions, and name it XXX-something where XXX is the number of the issue. + +Submit unit tests for your changes. Go has a great test framework built in; use +it! Take a look at existing tests for inspiration. Run the full test suite on +your branch before submitting a pull request. + +Update the documentation when creating or modifying features. Test +your documentation changes for clarity, concision, and correctness, as +well as a clean documentation build. See ``docs/README.md`` for more +information on building the docs and how docs get released. + +Write clean code. Universally formatted code promotes ease of writing, reading, +and maintenance. Always run `gofmt -s -w file.go` on each changed file before +committing your changes. Most editors have plugins that do this automatically. + +Pull requests descriptions should be as clear as possible and include a +reference to all the issues that they address. + +Pull requests must not contain commits from other users or branches. + +Commit messages must start with a capitalized and short summary (max. 50 +chars) written in the imperative, followed by an optional, more detailed +explanatory text which is separated from the summary by an empty line. + +Code review comments may be added to your pull request. Discuss, then make the +suggested modifications and push additional commits to your feature branch. Be +sure to post a comment after pushing. The new commits will show up in the pull +request automatically, but the reviewers will not be notified unless you +comment. + +Before the pull request is merged, make sure that you squash your commits into +logical units of work using `git rebase -i` and `git push -f`. After every +commit the test suite should be passing. Include documentation changes in the +same commit so that a revert would remove all traces of the feature or fix. + +Commits that fix or close an issue should include a reference like `Closes #XXX` +or `Fixes #XXX`, which will automatically close the issue when merged. + +### Sign your work + +The sign-off is a simple line at the end of the explanation for the +patch, which certifies that you wrote it or otherwise have the right to +pass it on as an open-source patch. The rules are pretty simple: if you +can certify the below (from +[developercertificate.org](http://developercertificate.org/)): + +``` +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +660 York Street, Suite 102, +San Francisco, CA 94110 USA + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. +``` + +then you just add a line to every git commit message: + + Signed-off-by: Joe Smith + +using your real name (sorry, no pseudonyms or anonymous contributions.) + +You can add the sign off when creating the git commit via `git commit -s`. diff --git a/vendor/github.com/go-openapi/jsonreference/.gitignore b/vendor/github.com/go-openapi/jsonreference/.gitignore new file mode 100644 index 0000000000..769c244007 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/.gitignore @@ -0,0 +1 @@ +secrets.yml diff --git a/vendor/github.com/go-openapi/jsonreference/.travis.yml b/vendor/github.com/go-openapi/jsonreference/.travis.yml new file mode 100644 index 0000000000..40034d28dc --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/.travis.yml @@ -0,0 +1,16 @@ +after_success: +- bash <(curl -s https://codecov.io/bash) +go: +- '1.9' +- 1.10.x +- 1.11.x +install: +- go get -u github.com/stretchr/testify/assert +- go get -u github.com/PuerkitoBio/purell +- go get -u github.com/go-openapi/jsonpointer +language: go +notifications: + slack: + secure: OpQG/36F7DSF00HLm9WZMhyqFCYYyYTsVDObW226cWiR8PWYiNfLZiSEvIzT1Gx4dDjhigKTIqcLhG34CkL5iNXDjm9Yyo2RYhQPlK8NErNqUEXuBqn4RqYHW48VGhEhOyDd4Ei0E2FN5ZbgpvHgtpkdZ6XDi64r3Ac89isP9aPHXQTuv2Jog6b4/OKKiUTftLcTIst0p4Cp3gqOJWf1wnoj+IadWiECNVQT6zb47IYjtyw6+uV8iUjTzdKcRB6Zc6b4Dq7JAg1Zd7Jfxkql3hlKp4PNlRf9Cy7y5iA3G7MLyg3FcPX5z2kmcyPt2jOTRMBWUJ5zIQpOxizAcN8WsT3WWBL5KbuYK6k0PzujrIDLqdxGpNmjkkMfDBT9cKmZpm2FdW+oZgPFJP+oKmAo4u4KJz/vjiPTXgQlN5bmrLuRMCp+AwC5wkIohTqWZVPE2TK6ZSnMYcg/W39s+RP/9mJoyryAvPSpBOLTI+biCgaUCTOAZxNTWpMFc3tPYntc41WWkdKcooZ9JA5DwfcaVFyTGQ3YXz+HvX6G1z/gW0Q/A4dBi9mj2iE1xm7tRTT+4VQ2AXFvSEI1HJpfPgYnwAtwOD1v3Qm2EUHk9sCdtEDR4wVGEPIVn44GnwFMnGKx9JWppMPYwFu3SVDdHt+E+LOlhZUply11Aa+IVrT2KUQ= +script: +- go test -v -race -cover -coverprofile=coverage.txt -covermode=atomic ./... diff --git a/vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md b/vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..9322b065e3 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at ivan+abuse@flanders.co.nz. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/go-openapi/jsonreference/LICENSE b/vendor/github.com/go-openapi/jsonreference/LICENSE new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/go-openapi/jsonreference/README.md b/vendor/github.com/go-openapi/jsonreference/README.md new file mode 100644 index 0000000000..66345f4c61 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/README.md @@ -0,0 +1,15 @@ +# gojsonreference [![Build Status](https://travis-ci.org/go-openapi/jsonreference.svg?branch=master)](https://travis-ci.org/go-openapi/jsonreference) [![codecov](https://codecov.io/gh/go-openapi/jsonreference/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/jsonreference) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) + +[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/jsonreference/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/jsonreference?status.svg)](http://godoc.org/github.com/go-openapi/jsonreference) +An implementation of JSON Reference - Go language + +## Status +Work in progress ( 90% done ) + +## Dependencies +https://github.com/go-openapi/jsonpointer + +## References +http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07 + +http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03 diff --git a/vendor/github.com/go-openapi/jsonreference/go.mod b/vendor/github.com/go-openapi/jsonreference/go.mod new file mode 100644 index 0000000000..6d15a70503 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/go.mod @@ -0,0 +1,15 @@ +module github.com/go-openapi/jsonreference + +require ( + github.com/PuerkitoBio/purell v1.1.0 + github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-openapi/jsonpointer v0.17.0 + github.com/go-openapi/swag v0.17.0 // indirect + github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/testify v1.2.2 + golang.org/x/net v0.0.0-20181005035420-146acd28ed58 // indirect + golang.org/x/text v0.3.0 // indirect + gopkg.in/yaml.v2 v2.2.1 // indirect +) diff --git a/vendor/github.com/go-openapi/jsonreference/go.sum b/vendor/github.com/go-openapi/jsonreference/go.sum new file mode 100644 index 0000000000..ec9bdbc286 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/go.sum @@ -0,0 +1,20 @@ +github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4= +github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-openapi/jsonpointer v0.17.0 h1:Bpl2DtZ6k7wKqfFs7e+4P08+M9I3FQgn09a1UsRUQbk= +github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/swag v0.17.0 h1:7wu+dZ5k83kvUWeAb+WUkFiUhDzwGqzTR/NhWzeo1JU= +github.com/go-openapi/swag v0.17.0/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58 h1:otZG8yDCO4LVps5+9bxOeNiCvgmOyt96J3roHTYs7oE= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/go-openapi/jsonreference/reference.go b/vendor/github.com/go-openapi/jsonreference/reference.go new file mode 100644 index 0000000000..3bc0a6e26f --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/reference.go @@ -0,0 +1,156 @@ +// Copyright 2013 sigu-399 ( https://github.com/sigu-399 ) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// author sigu-399 +// author-github https://github.com/sigu-399 +// author-mail sigu.399@gmail.com +// +// repository-name jsonreference +// repository-desc An implementation of JSON Reference - Go language +// +// description Main and unique file. +// +// created 26-02-2013 + +package jsonreference + +import ( + "errors" + "net/url" + "strings" + + "github.com/PuerkitoBio/purell" + "github.com/go-openapi/jsonpointer" +) + +const ( + fragmentRune = `#` +) + +// New creates a new reference for the given string +func New(jsonReferenceString string) (Ref, error) { + + var r Ref + err := r.parse(jsonReferenceString) + return r, err + +} + +// MustCreateRef parses the ref string and panics when it's invalid. +// Use the New method for a version that returns an error +func MustCreateRef(ref string) Ref { + r, err := New(ref) + if err != nil { + panic(err) + } + return r +} + +// Ref represents a json reference object +type Ref struct { + referenceURL *url.URL + referencePointer jsonpointer.Pointer + + HasFullURL bool + HasURLPathOnly bool + HasFragmentOnly bool + HasFileScheme bool + HasFullFilePath bool +} + +// GetURL gets the URL for this reference +func (r *Ref) GetURL() *url.URL { + return r.referenceURL +} + +// GetPointer gets the json pointer for this reference +func (r *Ref) GetPointer() *jsonpointer.Pointer { + return &r.referencePointer +} + +// String returns the best version of the url for this reference +func (r *Ref) String() string { + + if r.referenceURL != nil { + return r.referenceURL.String() + } + + if r.HasFragmentOnly { + return fragmentRune + r.referencePointer.String() + } + + return r.referencePointer.String() +} + +// IsRoot returns true if this reference is a root document +func (r *Ref) IsRoot() bool { + return r.referenceURL != nil && + !r.IsCanonical() && + !r.HasURLPathOnly && + r.referenceURL.Fragment == "" +} + +// IsCanonical returns true when this pointer starts with http(s):// or file:// +func (r *Ref) IsCanonical() bool { + return (r.HasFileScheme && r.HasFullFilePath) || (!r.HasFileScheme && r.HasFullURL) +} + +// "Constructor", parses the given string JSON reference +func (r *Ref) parse(jsonReferenceString string) error { + + parsed, err := url.Parse(jsonReferenceString) + if err != nil { + return err + } + + r.referenceURL, _ = url.Parse(purell.NormalizeURL(parsed, purell.FlagsSafe|purell.FlagRemoveDuplicateSlashes)) + refURL := r.referenceURL + + if refURL.Scheme != "" && refURL.Host != "" { + r.HasFullURL = true + } else { + if refURL.Path != "" { + r.HasURLPathOnly = true + } else if refURL.RawQuery == "" && refURL.Fragment != "" { + r.HasFragmentOnly = true + } + } + + r.HasFileScheme = refURL.Scheme == "file" + r.HasFullFilePath = strings.HasPrefix(refURL.Path, "/") + + // invalid json-pointer error means url has no json-pointer fragment. simply ignore error + r.referencePointer, _ = jsonpointer.New(refURL.Fragment) + + return nil +} + +// Inherits creates a new reference from a parent and a child +// If the child cannot inherit from the parent, an error is returned +func (r *Ref) Inherits(child Ref) (*Ref, error) { + childURL := child.GetURL() + parentURL := r.GetURL() + if childURL == nil { + return nil, errors.New("child url is nil") + } + if parentURL == nil { + return &child, nil + } + + ref, err := New(parentURL.ResolveReference(childURL).String()) + if err != nil { + return nil, err + } + return &ref, nil +} diff --git a/vendor/github.com/go-openapi/spec/.editorconfig b/vendor/github.com/go-openapi/spec/.editorconfig new file mode 100644 index 0000000000..3152da69a5 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/.editorconfig @@ -0,0 +1,26 @@ +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +# Set default charset +[*.{js,py,go,scala,rb,java,html,css,less,sass,md}] +charset = utf-8 + +# Tab indentation (no size specified) +[*.go] +indent_style = tab + +[*.md] +trim_trailing_whitespace = false + +# Matches the exact files either package.json or .travis.yml +[{package.json,.travis.yml}] +indent_style = space +indent_size = 2 diff --git a/vendor/github.com/go-openapi/spec/.github/CONTRIBUTING.md b/vendor/github.com/go-openapi/spec/.github/CONTRIBUTING.md new file mode 100644 index 0000000000..7dea4240d7 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/.github/CONTRIBUTING.md @@ -0,0 +1,117 @@ +## Contribution Guidelines + +### Pull requests are always welcome + +We are always thrilled to receive pull requests, and do our best to +process them as fast as possible. Not sure if that typo is worth a pull +request? Do it! We will appreciate it. + +If your pull request is not accepted on the first try, don't be +discouraged! If there's a problem with the implementation, hopefully you +received feedback on what to improve. + +We're trying very hard to keep go-swagger lean and focused. We don't want it +to do everything for everybody. This means that we might decide against +incorporating a new feature. However, there might be a way to implement +that feature *on top of* go-swagger. + + +### Conventions + +Fork the repo and make changes on your fork in a feature branch: + +- If it's a bugfix branch, name it XXX-something where XXX is the number of the + issue +- If it's a feature branch, create an enhancement issue to announce your + intentions, and name it XXX-something where XXX is the number of the issue. + +Submit unit tests for your changes. Go has a great test framework built in; use +it! Take a look at existing tests for inspiration. Run the full test suite on +your branch before submitting a pull request. + +Update the documentation when creating or modifying features. Test +your documentation changes for clarity, concision, and correctness, as +well as a clean documentation build. See ``docs/README.md`` for more +information on building the docs and how docs get released. + +Write clean code. Universally formatted code promotes ease of writing, reading, +and maintenance. Always run `gofmt -s -w file.go` on each changed file before +committing your changes. Most editors have plugins that do this automatically. + +Pull requests descriptions should be as clear as possible and include a +reference to all the issues that they address. + +Pull requests must not contain commits from other users or branches. + +Commit messages must start with a capitalized and short summary (max. 50 +chars) written in the imperative, followed by an optional, more detailed +explanatory text which is separated from the summary by an empty line. + +Code review comments may be added to your pull request. Discuss, then make the +suggested modifications and push additional commits to your feature branch. Be +sure to post a comment after pushing. The new commits will show up in the pull +request automatically, but the reviewers will not be notified unless you +comment. + +Before the pull request is merged, make sure that you squash your commits into +logical units of work using `git rebase -i` and `git push -f`. After every +commit the test suite should be passing. Include documentation changes in the +same commit so that a revert would remove all traces of the feature or fix. + +Commits that fix or close an issue should include a reference like `Closes #XXX` +or `Fixes #XXX`, which will automatically close the issue when merged. + +### Sign your work + +The sign-off is a simple line at the end of the explanation for the +patch, which certifies that you wrote it or otherwise have the right to +pass it on as an open-source patch. The rules are pretty simple: if you +can certify the below (from +[developercertificate.org](http://developercertificate.org/)): + +``` +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +660 York Street, Suite 102, +San Francisco, CA 94110 USA + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. +``` + +then you just add a line to every git commit message: + + Signed-off-by: Joe Smith + +using your real name (sorry, no pseudonyms or anonymous contributions.) + +You can add the sign off when creating the git commit via `git commit -s`. diff --git a/vendor/github.com/go-openapi/spec/.gitignore b/vendor/github.com/go-openapi/spec/.gitignore new file mode 100644 index 0000000000..dd91ed6a04 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/.gitignore @@ -0,0 +1,2 @@ +secrets.yml +coverage.out diff --git a/vendor/github.com/go-openapi/spec/.golangci.yml b/vendor/github.com/go-openapi/spec/.golangci.yml new file mode 100644 index 0000000000..48c9813ff8 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/.golangci.yml @@ -0,0 +1,23 @@ +linters-settings: + govet: + check-shadowing: true + golint: + min-confidence: 0 + gocyclo: + min-complexity: 25 + maligned: + suggest-new: true + dupl: + threshold: 100 + goconst: + min-len: 2 + min-occurrences: 2 + +linters: + enable-all: true + disable: + - maligned + - unparam + - lll + - gochecknoinits + - gochecknoglobals diff --git a/vendor/github.com/go-openapi/spec/.travis.yml b/vendor/github.com/go-openapi/spec/.travis.yml new file mode 100644 index 0000000000..a4f03484b7 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/.travis.yml @@ -0,0 +1,18 @@ +after_success: +- bash <(curl -s https://codecov.io/bash) +go: +- '1.9' +- 1.10.x +- 1.11.x +install: +- go get -u github.com/stretchr/testify +- go get -u github.com/go-openapi/swag +- go get -u gopkg.in/yaml.v2 +- go get -u github.com/go-openapi/jsonpointer +- go get -u github.com/go-openapi/jsonreference +language: go +notifications: + slack: + secure: QUWvCkBBK09GF7YtEvHHVt70JOkdlNBG0nIKu/5qc4/nW5HP8I2w0SEf/XR2je0eED1Qe3L/AfMCWwrEj+IUZc3l4v+ju8X8R3Lomhme0Eb0jd1MTMCuPcBT47YCj0M7RON7vXtbFfm1hFJ/jLe5+9FXz0hpXsR24PJc5ZIi/ogNwkaPqG4BmndzecpSh0vc2FJPZUD9LT0I09REY/vXR0oQAalLkW0asGD5taHZTUZq/kBpsNxaAFrLM23i4mUcf33M5fjLpvx5LRICrX/57XpBrDh2TooBU6Qj3CgoY0uPRYUmSNxbVx1czNzl2JtEpb5yjoxfVPQeg0BvQM00G8LJINISR+ohrjhkZmAqchDupAX+yFrxTtORa78CtnIL6z/aTNlgwwVD8kvL/1pFA/JWYmKDmz93mV/+6wubGzNSQCstzjkFA4/iZEKewKUoRIAi/fxyscP6L/rCpmY/4llZZvrnyTqVbt6URWpopUpH4rwYqreXAtJxJsfBJIeSmUIiDIOMGkCTvyTEW3fWGmGoqWtSHLoaWDyAIGb7azb+KvfpWtEcoPFWfSWU+LGee0A/YsUhBl7ADB9A0CJEuR8q4BPpKpfLwPKSiKSAXL7zDkyjExyhtgqbSl2jS+rKIHOZNL8JkCcTP2MKMVd563C5rC5FMKqu3S9m2b6380E= +script: +- go test -v -race -cover -coverprofile=coverage.txt -covermode=atomic ./... diff --git a/vendor/github.com/go-openapi/spec/CODE_OF_CONDUCT.md b/vendor/github.com/go-openapi/spec/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..9322b065e3 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at ivan+abuse@flanders.co.nz. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/go-openapi/spec/LICENSE b/vendor/github.com/go-openapi/spec/LICENSE new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/go-openapi/spec/README.md b/vendor/github.com/go-openapi/spec/README.md new file mode 100644 index 0000000000..6354742cbf --- /dev/null +++ b/vendor/github.com/go-openapi/spec/README.md @@ -0,0 +1,10 @@ +# OAI object model [![Build Status](https://travis-ci.org/go-openapi/spec.svg?branch=master)](https://travis-ci.org/go-openapi/spec) [![codecov](https://codecov.io/gh/go-openapi/spec/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/spec) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) + +[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/spec/master/LICENSE) +[![GoDoc](https://godoc.org/github.com/go-openapi/spec?status.svg)](http://godoc.org/github.com/go-openapi/spec) +[![GolangCI](https://golangci.com/badges/github.com/go-openapi/spec.svg)](https://golangci.com) +[![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/spec)](https://goreportcard.com/report/github.com/go-openapi/spec) + +The object model for OpenAPI specification documents. + +Currently supports Swagger 2.0. diff --git a/vendor/github.com/go-openapi/spec/bindata.go b/vendor/github.com/go-openapi/spec/bindata.go new file mode 100644 index 0000000000..1717ea1052 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/bindata.go @@ -0,0 +1,260 @@ +// Code generated by go-bindata. +// sources: +// schemas/jsonschema-draft-04.json +// schemas/v2/schema.json +// DO NOT EDIT! + +package spec + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + "time" +) + +func bindataRead(data []byte, name string) ([]byte, error) { + gz, err := gzip.NewReader(bytes.NewBuffer(data)) + if err != nil { + return nil, fmt.Errorf("Read %q: %v", name, err) + } + + var buf bytes.Buffer + _, err = io.Copy(&buf, gz) + clErr := gz.Close() + + if err != nil { + return nil, fmt.Errorf("Read %q: %v", name, err) + } + if clErr != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +type asset struct { + bytes []byte + info os.FileInfo +} + +type bindataFileInfo struct { + name string + size int64 + mode os.FileMode + modTime time.Time +} + +func (fi bindataFileInfo) Name() string { + return fi.name +} +func (fi bindataFileInfo) Size() int64 { + return fi.size +} +func (fi bindataFileInfo) Mode() os.FileMode { + return fi.mode +} +func (fi bindataFileInfo) ModTime() time.Time { + return fi.modTime +} +func (fi bindataFileInfo) IsDir() bool { + return false +} +func (fi bindataFileInfo) Sys() interface{} { + return nil +} + +var _jsonschemaDraft04JSON = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x57\x3d\x6f\xdb\x3c\x10\xde\xf3\x2b\x08\x26\x63\xf2\x2a\x2f\xd0\xc9\x5b\xd1\x2e\x01\x5a\x34\x43\x37\x23\x03\x6d\x9d\x6c\x06\x14\xa9\x50\x54\x60\xc3\xd0\x7f\x2f\x28\x4a\x14\x29\x91\x92\x2d\xa7\x8d\x97\x28\xbc\xaf\xe7\x8e\xf7\xc5\xd3\x0d\x42\x08\x61\x9a\xe2\x15\xc2\x7b\xa5\x8a\x55\x92\xbc\x96\x82\x3f\x94\xdb\x3d\xe4\xe4\x3f\x21\x77\x49\x2a\x49\xa6\x1e\x1e\xbf\x24\xe6\xec\x16\xdf\x1b\xa1\x3b\xf3\xff\x02\xc9\x14\xca\xad\xa4\x85\xa2\x82\x6b\xe9\x6f\x42\x02\x32\x2c\x28\x07\x45\x5a\x15\x3d\x77\x46\x39\xd5\xcc\x25\x5e\x21\x83\xb8\x21\x18\xb6\xaf\x52\x92\xa3\x47\x68\x88\xea\x58\x80\x56\x4e\x1a\xf2\xbd\x4f\xcc\x29\x7f\x52\x90\x6b\x7d\xff\x0f\x48\xb4\x3d\x3f\x21\x7c\x27\x21\xd3\x2a\x6e\x31\xaa\x2d\x53\xdd\xf3\xe3\x42\x94\x54\xd1\x77\x78\xe2\x0a\x76\x20\xe3\x20\x68\xcb\x30\x86\x41\xf3\x2a\xc7\x2b\xf4\x78\x8e\xfe\xef\x90\x91\x8a\xa9\xc7\xb1\x1d\xc2\xd8\x2f\x0d\x75\xed\xc1\x4e\x9c\xc8\x25\x43\xac\xa8\xbe\xd7\xcc\xa9\xd1\xa9\x21\xa0\x1a\xbd\x04\x61\x94\x34\x2f\x18\xfc\x3e\x16\x50\x8e\x4d\x03\x6f\x1c\x58\xdb\x48\x23\xbc\x11\x82\x01\xe1\xfa\xd3\x3a\x8e\x30\xaf\x18\x33\x7f\xf3\x8d\x39\x11\x9b\x57\xd8\x2a\xfd\x55\x2a\x49\xf9\x0e\xc7\xec\x37\xd4\x25\xf7\xec\x5c\x66\xc7\xd7\x99\xaa\xcf\x4f\x89\x8a\xd3\xb7\x0a\x3a\xaa\x92\x15\xf4\x30\x6f\x1c\xb0\xd6\x46\xe7\x98\x39\x2d\xa4\x28\x40\x2a\x3a\x88\x9e\x29\xba\x88\x37\x2d\xca\x60\x38\xfa\xba\x5b\x20\xac\xa8\x62\xb0\x4c\xd4\xaf\xda\x45\x0a\xba\x5c\x3b\xb9\xc7\x79\xc5\x14\x2d\x18\x34\x19\x1c\x51\xdb\x25\x4d\xb4\x7e\x06\x14\x38\x6c\x59\x55\xd2\x77\xf8\x69\x59\xfc\x7b\x73\xed\x93\x43\xcb\x32\x6d\x3c\x28\xdc\x1b\x9a\xd3\x62\xab\xc2\x27\xf7\x41\xc9\x08\x2b\x23\x08\xad\x13\x57\x21\x9c\xd3\x72\x0d\x42\x72\xf8\x01\x7c\xa7\xf6\x83\xce\x39\xd7\x82\x3c\x1f\x2f\xd6\x60\x1b\xa2\xdf\x35\x89\x52\x20\xe7\x73\x74\xe0\x66\x26\x64\x4e\xb4\x97\x58\xc2\x0e\x0e\xe1\x60\x92\x34\x6d\xa0\x10\xd6\xb5\x83\x61\x27\xe6\x47\xd3\x89\xbd\x63\xfd\x3b\x8d\x03\x3d\x6c\x42\x2d\x5b\x70\xee\xe8\xdf\x4b\xf4\x66\x4e\xe1\x01\x45\x17\x80\x74\xad\x4f\xc3\xf3\xae\xc6\x1d\xc6\xd7\xc2\xce\xc9\xe1\x29\x30\x86\x2f\x4a\xa6\x4b\x15\x84\x73\xc9\x6f\xfd\x7f\xa5\x6e\x9e\xbd\xf1\xb0\xd4\xdd\x45\x5a\xc2\x3e\x4b\x78\xab\xa8\x84\x74\x4a\x91\x3b\x92\x23\x05\xf2\x1c\x1e\x7b\xf3\x09\xf8\xcf\xab\x24\xb6\x60\xa2\xe8\x4c\x9f\x75\x77\xaa\x8c\xe6\x01\x45\x36\x86\xcf\xc3\x63\x3a\xea\xd4\x8d\x7e\x06\xac\x14\x0a\xe0\x29\xf0\xed\x07\x22\x1a\x65\xda\x44\xae\xa2\x73\x1a\xe6\x90\x69\xa2\x8c\x46\xb2\x2f\xde\x49\x38\x08\xed\xfe\xfd\x41\xaf\x9f\xa9\x55\xd7\xdd\x22\x8d\xfa\x45\x63\xc5\x0f\x80\xf3\xb4\x08\xd6\x79\x30\x9e\x93\xee\x59\xa6\xd0\x4b\xee\x22\xe3\x33\xc1\x3a\x27\x68\x36\x78\x7e\x87\x0a\x06\xd5\x2e\x20\xd3\xaf\x15\xfb\xd8\x3b\x73\x14\xbb\x92\xed\x05\x5d\x2e\x29\x38\x2c\x94\xe4\x42\x45\x5e\xd3\xb5\x7d\xdf\x47\xca\x38\xb4\x5c\xaf\xfb\x7d\xdd\x6d\xf4\xa1\x2d\x77\xdd\x2f\xce\x6d\xc4\x7b\x8b\x4e\x67\xa9\x6f\xfe\x04\x00\x00\xff\xff\xb1\xd1\x27\x78\x05\x11\x00\x00") + +func jsonschemaDraft04JSONBytes() ([]byte, error) { + return bindataRead( + _jsonschemaDraft04JSON, + "jsonschema-draft-04.json", + ) +} + +func jsonschemaDraft04JSON() (*asset, error) { + bytes, err := jsonschemaDraft04JSONBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "jsonschema-draft-04.json", size: 4357, mode: os.FileMode(420), modTime: time.Unix(1523760398, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _v2SchemaJSON = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\x4f\x93\xdb\x36\xb2\xbf\xfb\x53\xa0\x14\x57\xd9\xae\xd8\x92\xe3\xf7\x2e\xcf\x97\xd4\xbc\xd8\x49\x66\x37\x5e\x4f\x79\x26\xbb\x87\x78\x5c\x05\x91\x2d\x09\x09\x09\x30\x00\x38\x33\x5a\xef\x7c\xf7\x2d\xf0\x9f\x08\x02\x20\x41\x8a\xd2\xc8\x0e\x0f\xa9\x78\x28\xa0\xd1\xdd\x68\x34\x7e\xdd\xf8\xf7\xf9\x11\x42\x33\x49\x64\x04\xb3\xd7\x68\x76\x86\xfe\x76\xf9\xfe\x1f\xe8\x32\xd8\x40\x8c\xd1\x8a\x71\x74\x79\x8b\xd7\x6b\xe0\xe8\xd5\xfc\x25\x3a\xbb\x38\x9f\xcf\x9e\xab\x0a\x24\x54\xa5\x37\x52\x26\xaf\x17\x0b\x91\x17\x99\x13\xb6\xb8\x79\xb5\x10\x59\xdd\xf9\xef\x82\xd1\x6f\xf2\xc2\x8f\xf3\x4f\xb5\x1a\xea\xc7\x17\x45\x41\xc6\xd7\x8b\x90\xe3\x95\x7c\xf1\xf2\x7f\x8b\xca\x45\x3d\xb9\x4d\x32\xa6\xd8\xf2\x77\x08\x64\xfe\x8d\xc3\x9f\x29\xe1\xa0\x9a\xff\xed\x11\x42\x08\xcd\x8a\xd6\xb3\x9f\x15\x67\x74\xc5\xca\x7f\x27\x58\x6e\xc4\xec\x11\x42\xd7\x59\x5d\x1c\x86\x44\x12\x46\x71\x74\xc1\x59\x02\x5c\x12\x10\xb3\xd7\x68\x85\x23\x01\x59\x81\x04\x4b\x09\x9c\x6a\xbf\x7e\xce\x49\x7d\xba\x7b\x51\xfd\xa1\x44\xe2\xb0\x52\xac\x7d\xb3\x08\x61\x45\x68\x46\x56\x2c\x6e\x80\x86\x8c\xbf\xbd\x93\x40\x05\x61\x74\x96\x95\xbe\x7f\x84\xd0\x7d\x4e\xde\x42\xb7\xe4\xbe\x46\xbb\x14\x5b\x48\x4e\xe8\xba\x90\x05\xa1\x19\xd0\x34\xae\xc4\xce\xbe\xbc\x9a\xbf\x9c\x15\x7f\x5d\x57\xc5\x42\x10\x01\x27\x89\xe2\x48\x51\xb9\xda\x40\xd5\x87\x37\xc0\x15\x5f\x88\xad\x90\xdc\x10\x81\x42\x16\xa4\x31\x50\x39\x2f\x38\xad\xab\xb0\x53\xd8\xac\x94\x56\x6f\xc3\x84\xf4\x11\xa4\x50\xb3\xfa\xe9\xd3\x6f\x9f\x3e\xdf\x2f\xd0\xeb\x8f\x1f\x3f\x7e\xbc\xfe\xf6\xe9\xf7\xaf\x5f\x7f\xfc\x18\x7e\xfb\xec\xfb\xc7\xb3\x36\x79\x54\x43\xe8\x29\xc5\x31\x20\xc6\x11\x49\x9e\xe5\x12\x41\x66\xa0\xe8\xed\x1d\x8e\x93\x08\x5e\xa3\x27\x3b\xc3\x7c\xa2\x73\xba\xc4\x02\x2e\xb0\xdc\xf4\xe5\x76\xd1\xca\x96\xa2\x8a\x94\xcd\x21\xc9\x6c\xec\x2c\x70\x42\x9e\x34\x74\x9d\x19\x7c\xcd\x20\x9c\xea\x2e\x0a\xfe\x42\x84\xd4\x29\x04\x8c\x8a\xb4\x41\xa2\xc1\xdc\x19\x8a\x88\x90\x4a\x49\xef\xce\xdf\xbd\x45\x4a\x52\x81\x70\x10\x40\x22\x21\x44\xcb\x6d\xc5\xec\x4e\x3c\x1c\x45\xef\x57\x9a\xb5\x7d\xae\xfe\xe5\xe4\x31\x86\x90\xe0\xab\x6d\x02\x3b\x2e\xcb\x11\x90\xd9\xa8\xc6\x77\xc2\x59\x98\x06\xfd\xf9\x2e\x78\x45\x01\xa6\xa8\xa0\x71\x5c\xbe\x33\xa7\xd2\xd9\x5f\x95\xef\xd9\xd5\xac\xfd\xdc\x5d\xbf\x5e\xb8\xd1\x3e\xc7\x31\x48\xe0\x5e\x4c\x14\x65\xdf\xb8\xa8\x71\x10\x09\xa3\xc2\xc7\x02\xcb\xa2\x4e\x5a\x02\x82\x94\x13\xb9\xf5\x30\xe6\xb2\xa4\xb5\xfe\x9b\x3e\x7a\xb2\x55\xd2\xa8\x4a\xbc\x16\xb6\x71\x8e\x39\xc7\xdb\x9d\xe1\x10\x09\x71\xbd\x9c\xb3\x41\x89\xd7\xa5\x89\xdc\x57\xb5\x53\x4a\xfe\x4c\xe1\xbc\xa0\x21\x79\x0a\x1a\x0f\x70\xa7\x5c\x08\x8e\xde\xb0\xc0\x43\x24\xad\x74\x63\x0e\xb1\xd9\x90\xe1\xb0\x2d\x13\xa7\x6d\x78\xfd\x04\x14\x38\x8e\x90\xaa\xce\x63\xac\x3e\x23\xbc\x64\xa9\xb4\xf8\x03\x63\xde\xcd\xbe\x16\x13\x4a\x55\xac\x82\x12\xc6\xac\xd4\x35\xf7\x22\xd4\x3a\xff\x22\x73\x0e\x6e\x51\xa0\x75\x1e\xae\x8f\xe8\x5d\xc7\x59\xe6\xe4\x9a\x18\x8d\xd6\x1c\x53\x84\x4d\xb7\x67\x28\x37\x09\x84\x69\x88\x12\x0e\x01\x11\x80\x32\xa2\xf5\xb9\xaa\xc6\xd9\x73\x53\xab\xfb\xb4\x2e\x20\xc6\x54\x92\xa0\x9a\xf3\x69\x1a\x2f\x81\x77\x37\xae\x53\x1a\xce\x40\xc4\xa8\x82\x1c\xb5\xef\xda\x24\x7d\xb9\x61\x69\x14\xa2\x25\xa0\x90\xac\x56\xc0\x81\x4a\xb4\xe2\x2c\xce\x4a\x64\x7a\x9a\x23\xf4\x13\x91\x3f\xa7\x4b\xf4\x63\x84\x6f\x18\x87\x10\xbd\xc3\xfc\x8f\x90\xdd\x52\x44\x04\xc2\x51\xc4\x6e\x21\x74\x48\x21\x81\xc7\xe2\xfd\xea\x12\xf8\x0d\x09\xf6\xe9\x47\x35\xaf\x67\xc4\x14\xf7\x22\x27\x97\xe1\xe2\x76\x2d\x06\x8c\x4a\x1c\x48\x3f\x73\x2d\x0b\x5b\x29\x45\x24\x00\x2a\x0c\x11\xec\x94\xca\xc2\xa6\xc1\x37\x21\x43\x83\x3b\x5f\x97\xf1\x43\x5e\x53\x73\x19\xa5\x36\xd8\x2d\x05\x2e\x34\x0b\xeb\x39\xfc\x1d\x63\x51\x01\xbd\x3d\xbb\x90\x84\x40\x25\x59\x6d\x09\x5d\xa3\x1c\x37\xe6\x5c\x16\x9a\x40\x09\x70\xc1\xe8\x82\xf1\x35\xa6\xe4\xdf\x99\x5c\x8e\x9e\x4d\x79\xb4\x27\x2f\xbf\x7e\xf8\x05\x25\x8c\x50\xa9\x98\x29\x90\x62\x60\xea\x75\xae\x13\xca\xbf\x2b\x1a\x29\x27\x76\xd6\x20\xc6\x64\x5f\xe6\x32\x1a\x08\x87\x21\x07\x21\xbc\xb4\xe4\xe0\x32\x67\xa6\xcd\xf3\x1e\xcd\xd9\x6b\xb6\x6f\x8e\x27\xa7\xed\xdb\xe7\xbc\xcc\x1a\x07\xce\x6f\x87\x33\xf0\xba\x51\x17\x22\x66\x78\x79\x8e\xce\xe5\x13\x81\x80\x06\x2c\xe5\x78\x0d\xa1\xb2\xb8\x54\xa8\x79\x09\xbd\xbf\x3c\x47\x01\x8b\x13\x2c\xc9\x32\xaa\xaa\x1d\xd5\xee\xab\x36\xbd\x6c\xfd\x54\x6c\xc8\x08\x01\x3c\xbd\xe7\x07\x88\xb0\x24\x37\x79\x90\x28\x4a\x1d\x10\x1a\x92\x1b\x12\xa6\x38\x42\x40\xc3\x4c\x43\x62\x8e\xae\x36\xb0\x45\x71\x2a\xa4\x9a\x23\x79\x59\xb1\xa8\xf2\xa4\x0c\x60\x9f\xcc\x8d\x40\xf5\x80\xca\xa8\x99\xc3\xa7\x85\x1f\x31\x25\xa9\x82\xc5\x6d\xbd\xd8\x36\x76\x7c\x02\x28\x97\xf6\x1d\x74\x3b\x11\x7e\x91\xae\x32\xf8\x6c\xf4\xe6\x7b\x9a\xa5\x1f\x62\xc6\x21\xcf\x9a\xe5\xed\x8b\x02\xf3\x2c\x33\x33\xdf\x00\xca\xc9\x09\xb4\x04\xf5\xa5\x08\xd7\xc3\x02\x18\x66\xf1\xab\x1e\x83\x37\x4c\xcd\x12\xc1\x1d\x50\xf6\xaa\xbd\xfe\xe2\x73\x48\x38\x08\xa0\x32\x9b\x18\x44\x86\x0b\x6a\xc1\xaa\x26\x96\x2d\x96\x3c\xa0\x54\x65\x73\x87\x15\xca\x15\xe5\xf5\x94\x46\x9f\x33\x1a\x0c\x9a\xb1\x5a\xd9\x6a\x95\xcd\xcb\x7e\xec\x9a\xc5\x94\x3b\x37\x26\x31\xd7\xfc\xe4\x1f\x13\x8c\x31\x75\x9c\xba\xf7\x87\x3c\xa1\xb7\x4f\x17\x1b\x09\x82\x98\xc4\x70\x95\xd3\xe8\x4c\x48\x5a\xa6\xd6\x2a\x3d\x56\x42\x80\x9f\xaf\xae\x2e\x50\x0c\x42\xe0\x35\x34\x3c\x8a\x62\x03\x37\xba\xb2\x27\x04\xda\x25\x8d\x06\xe2\xa0\x13\x8a\xf3\xf5\xec\x10\x72\x67\x88\x90\x3d\x4b\x64\xeb\xaa\xda\x8f\xf7\x5a\x75\x47\x9a\xa8\x51\x70\x26\xd2\x38\xc6\x7c\xbb\x57\xfc\xbd\xe4\x04\x56\xa8\xa0\x54\x9a\x45\xd5\xf7\x0f\x16\xfc\x57\x1c\x3c\xdf\x23\xba\x77\x38\xda\x16\x4b\x31\x53\x6a\x4d\x9a\x15\x63\xe7\xe1\x18\x69\x9f\x22\xe0\x24\xbb\x94\x4b\x97\xee\x2d\xf9\x70\x87\x72\x7b\xe6\xc4\x33\x2a\x66\x5e\x1c\x35\x72\xe3\x2d\xda\x73\xe4\xc7\x51\x6d\xa4\xa1\x2a\x4f\xde\x94\xcb\xb2\x3e\x31\x48\xae\x82\xce\xc9\xc8\x65\xcd\xc3\xb7\x34\xb6\x2b\xdf\x58\x65\x78\x6e\x73\xac\x5e\x24\x0d\x3f\xdc\x70\x23\xc6\xda\x52\x0b\x2d\x63\x7d\xa9\x49\x2d\x54\x48\x28\xc0\x12\x9c\xe3\x63\xc9\x58\x04\x98\x36\x07\xc8\x0a\xa7\x91\xd4\xf0\xbc\xc1\xa8\xb9\x70\xd0\xc6\xa9\xb6\x78\x80\x5a\xa3\xb4\x2c\xf4\x18\x0b\x8a\x9d\xd0\xb4\x55\x10\xee\x0d\xc5\xd6\xe0\x99\x93\xdc\xa1\x04\xbb\xf1\xa7\x23\xd1\xd1\x97\x8c\x87\x13\x0a\x21\x02\xe9\x99\x25\xed\x20\xc5\x92\x66\x3c\x32\x9c\xd6\x06\xb0\x31\x5c\x86\x29\x0a\xcb\x60\x33\x12\xa5\x91\xfc\x96\x75\xd0\x59\xd7\x13\xbd\xd3\x23\x79\xdd\x2a\x90\xa6\x38\x06\x91\x39\x7f\x20\x72\x03\x1c\x2d\x01\x61\xba\x45\x37\x38\x22\x61\x8e\x71\x85\xc4\x32\x15\x28\x60\x61\x16\xb8\x3d\x29\xdc\x4d\x3d\x2f\x12\x13\x7d\xc8\x7e\x37\xee\xa8\x7f\xfa\xdb\xcb\x17\xff\x77\xfd\xf9\x7f\xee\x9f\x3d\xfe\xcf\xa7\xa7\x45\xfb\xcf\x1e\xf7\xf3\xe0\xff\xc4\x51\x0a\x8e\x4c\xcb\x01\xdc\x0a\x65\xb2\x01\x83\xed\x3d\xe4\xa9\xa3\x4e\x2d\x59\xc5\xe8\x2f\x48\x7d\x5a\x6e\x37\xbf\x5c\x9f\x35\x13\x64\x14\xfa\xef\x0b\x68\xa6\x0d\xb4\x8e\xf1\xa8\xff\xbb\x60\xf4\x03\x64\xab\x5b\x81\x65\x51\xe6\xda\xca\xfa\xf0\xb0\xac\x3e\x9c\xca\x26\x0e\x1d\xdb\x57\x5b\xbb\xb4\x9a\xa6\xb6\x9b\x1a\x6b\xd1\x9a\x9e\x7e\x33\x9a\xec\x41\x69\x45\x22\xb8\xb4\x51\xeb\x04\x77\xca\x6f\x7b\x7b\xc8\xb2\xb0\x95\x92\x25\x5b\xd0\x42\xaa\x2a\xdd\x32\x78\x4f\x0c\xab\x68\x46\x6c\xea\x6d\xf4\x5c\x5e\xde\xc4\xac\xa5\xf9\xd1\x00\x9f\x7d\x98\x65\x24\xbd\xc7\x97\xd4\xb3\x3a\xa8\x2b\xa0\x34\x76\xf9\x65\x5f\x2d\x25\x95\x1b\xcf\xd6\xf4\x9b\x5f\x09\x95\xb0\x36\x3f\xdb\xd0\x39\x2a\x93\x1c\x9d\x03\xa2\x4a\xca\xf5\xf6\x10\xb6\x94\x89\x0b\x6a\x70\x12\x13\x49\x6e\x40\xe4\x29\x12\x2b\xbd\x80\x45\x11\x04\xaa\xc2\x8f\x56\x9e\x5c\x6b\xec\x8d\x5a\x0e\x14\x59\x06\x2b\x1e\x24\xcb\xc2\x56\x4a\x31\xbe\x23\x71\x1a\xfb\x51\x2a\x0b\x3b\x1c\x48\x10\xa5\x82\xdc\xc0\xbb\x3e\x24\x8d\x5a\x76\x2e\x09\xed\xc1\x65\x51\xb8\x83\xcb\x3e\x24\x8d\x5a\x2e\x5d\xfe\x02\x74\x2d\x3d\xf1\xef\xae\xb8\x4b\xe6\x5e\xd4\xaa\xe2\x2e\x5c\x5e\xec\x0e\xf5\x5b\x0c\xcb\x0a\xbb\xa4\x3c\xf7\x1f\x2a\x55\x69\x97\x8c\x7d\x68\x95\xa5\xad\xb4\xf4\x9c\xa5\x07\xb9\x7a\x05\xbb\xad\x50\x6f\xfb\xa0\x4e\x9b\x48\x23\x49\x92\x28\x87\x19\x3e\x32\xee\xca\x3b\x46\x7e\x7f\x18\x64\xcc\xcc\x0f\x34\xe9\x36\x8b\xb7\x6c\xa8\xa5\x5b\x54\x4c\x54\x5b\x15\x3a\xf1\x6c\x2d\xfe\x96\xc8\x0d\xba\x7b\x81\x88\xc8\x23\xab\xee\x7d\x3b\x92\xa7\x60\x29\xe3\xdc\xff\xb8\x64\xe1\xf6\xa2\x5a\x59\xdc\x6f\xeb\x45\x7d\x6a\xd1\x76\x1e\xea\xb8\xf1\xfa\x14\xd3\x36\x63\xe5\xd7\xf3\xe4\xbe\x25\xbd\x5e\x05\xeb\x73\x74\xb5\x21\x2a\x2e\x4e\xa3\x30\xdf\xbf\x43\x28\x2a\xd1\xa5\x2a\x9d\x8a\xfd\x76\xd8\x8d\xbc\x67\x65\xc7\xb8\x03\x45\xec\xa3\xb0\x37\x8a\x70\x4c\x68\x91\x51\x8e\x58\x80\xed\x4a\xf3\x81\x62\xca\x96\xbb\xf1\x52\xcd\x80\xfb\xe4\x4a\x5d\x6c\xdf\x6e\x20\x4b\x80\x30\x8e\x28\x93\xf9\xe9\x8d\x8a\x6d\xd5\x59\x65\x7b\xaa\x44\x9e\xc0\xc2\xd1\x7c\x40\x26\xd6\x1a\xce\xf9\xc5\x69\x7b\x6c\xec\xc8\x71\x7b\xe5\x21\x2e\xd3\xe5\x65\x93\x91\x53\x0b\x7b\x3a\xc7\xfa\x17\x6a\x01\xa7\x33\xd0\xf4\x40\x0f\x39\x87\xda\xe4\x54\x87\x3a\xd5\xe3\xc7\xa6\x8e\x20\xd4\x11\xb2\x4e\xb1\xe9\x14\x9b\x4e\xb1\xe9\x14\x9b\xfe\x15\x63\xd3\x47\xf5\xff\x97\x38\xe9\xcf\x14\xf8\x76\x82\x49\x13\x4c\xaa\x7d\xcd\x6c\x62\x42\x49\x87\x43\x49\x19\x33\x6f\xe3\x44\x6e\x9b\xab\x8a\x3e\x86\xaa\x99\x52\x1b\x5b\x59\x33\x02\x09\xa0\x21\xa1\x6b\x84\x6b\x66\xbb\xdc\x16\x0c\xd3\x68\xab\xec\x36\x4b\xd8\x60\x8a\x40\x31\x85\x6e\x14\x57\x13\xc2\xfb\x92\x10\xde\xbf\x88\xdc\xbc\x53\x5e\x7f\x82\x7a\x13\xd4\x9b\xa0\xde\x04\xf5\x90\x01\xf5\x94\xcb\x7b\x83\x25\x9e\xd0\xde\x84\xf6\x6a\x5f\x4b\xb3\x98\x00\xdf\x04\xf8\x6c\xbc\x7f\x19\x80\xaf\xf1\x71\x45\x22\x98\x40\xe0\x04\x02\x27\x10\xd8\x29\xf5\x04\x02\xff\x4a\x20\x30\xc1\x72\xf3\x65\x02\x40\xd7\xc1\xd1\xe2\x6b\xf1\xa9\x7b\xfb\xe4\x20\xc0\x68\x9d\xd4\xb4\xd3\x96\xb5\xa6\xd1\x41\x20\xe6\x89\xc3\x48\x65\x58\x13\x84\x9c\x56\x56\x3b\x0c\xe0\x6b\x83\x5c\x13\xd2\x9a\x90\xd6\x84\xb4\x26\xa4\x85\x0c\xa4\x45\x19\xfd\xff\x63\x6c\x52\xb5\x1f\x1e\x19\x74\x3a\xcd\xb9\x69\xce\xa6\x3a\x0f\x7a\x2d\x19\xc7\x81\x14\x5d\xcb\xd5\x03\xc9\x39\xd0\xb0\xd1\xb3\xcd\xfb\x7a\x2d\x5d\x3a\x48\xe1\xfa\x2e\xe6\x81\x42\x18\x86\xd6\xc1\xbe\xb1\x23\xd3\xf7\x34\xed\x19\x0a\x0b\xc4\x48\x44\xfd\x22\x50\xb6\x42\x58\xbb\xe5\x3d\xa7\x73\xd4\x8b\xc4\x8c\x70\x61\xec\x73\xee\xc3\x81\x8b\xf5\xe2\xd7\x52\x3e\xcf\xeb\xeb\x17\x3b\x71\x16\xda\x7d\xb8\xde\xf0\x7a\x8f\x06\x2d\xa7\x40\x7b\xc1\x9d\x41\x4d\xb6\x61\xa2\x4e\x9f\x3d\xa0\xc5\xae\xe3\x1c\x1d\x40\x6c\x48\x8b\x63\xa0\xb5\x01\xed\x8e\x02\xe9\x86\xc8\x3b\x06\xee\xdb\x4b\xde\xbd\xc0\xa1\x6f\xcb\xda\xfc\xc2\x44\x16\x87\x9c\x17\x31\xd3\x30\x20\x39\x42\xcb\x6f\xf2\xf1\xf4\x72\x10\xf8\x1c\xa0\xf3\xbd\x10\xea\x21\x35\x7d\xe8\x86\xdb\x15\xed\x81\x81\x07\x28\xbb\x13\x28\xc7\xf8\xce\x7d\x8d\xc2\x31\xb4\x7e\x94\xd6\xdb\x55\xef\x4a\xfb\xed\xc3\x40\x3e\xeb\x9f\xe9\x99\x0f\xdf\x08\x65\x88\x27\x73\x86\x31\x9d\x47\xdf\x55\x19\xba\x3d\xee\x15\x0a\xcd\x8c\xaa\x5e\xb9\xf6\x57\x33\x73\x5a\xa1\x89\x7b\x3b\xa0\xb2\xa4\xc2\xf6\xc1\x53\xb5\x00\xca\x23\xe5\xf4\x60\x6a\xb4\x2d\x74\xea\x4e\xed\x3b\xe3\x47\xfb\xed\x82\x3d\x19\xd4\x3b\x6b\xaf\xae\x2b\x2f\x57\xb3\x82\x68\xcb\xed\x88\x2e\xe1\x5c\xd7\x26\xfa\x0a\x65\xe7\xce\x11\x33\xb4\xdd\x66\xe3\x37\xf6\xfa\x70\xd6\x4f\xa1\x21\x51\xd8\x3c\x26\x14\x4b\xc6\x87\x44\x27\x1c\x70\xf8\x9e\x46\xce\xab\x21\x07\x5f\xc1\x76\x17\x1b\x77\xb4\xda\x75\xa0\x0a\x3a\x30\xe1\xf8\x97\x32\x16\x2b\x00\x75\x85\xee\x62\x46\xef\xd3\x85\xb5\x6b\x60\xbe\xf2\x30\x7a\x8c\x0b\x4b\xa6\xd0\xf9\x64\x42\xe7\x07\x41\x41\xe3\x2c\x5d\xf9\x6d\xe9\x39\x98\x3b\x3b\x5d\x67\xd4\x5c\xed\xf2\xf0\x48\x7b\xbd\x2d\x31\xdd\x3f\x34\xad\x44\x76\x51\x9a\x56\x22\xa7\x95\xc8\x69\x25\xf2\xe1\x56\x22\x1f\x00\x32\x6a\x73\x92\xed\xe1\xc6\x7d\x9f\x49\x2c\x69\x7e\xc8\x31\x4c\x0c\xb4\xf2\x54\x3b\x79\x3b\x9e\x4d\xb4\xd1\x18\x3e\x5f\x9a\x93\xa2\x11\xc3\xda\x27\x0b\xaf\x37\x2e\x5c\x37\xfb\xeb\x9a\xd6\xc3\xac\xc3\xcc\xf8\x1e\x5b\x9d\xac\x22\x64\xb7\xed\x26\xb8\xf3\xb9\x3c\xbb\x1f\xe2\xb0\x22\x77\x43\x6a\x62\x29\x39\x59\xa6\xe6\xe5\xcd\x7b\x83\xc0\x5b\x8e\x93\x64\xac\xeb\xca\x4f\x65\xac\x4a\xbc\x1e\xcd\x82\xfa\x3c\x70\x36\xb6\xb5\xed\x79\xef\xec\x68\x00\xff\x54\xfa\xb5\xe3\xf1\xdb\xe1\xbe\xce\x76\x17\xaf\x57\xb6\x6b\x89\x05\x09\xce\x52\xb9\x01\x2a\x49\xbe\xd9\xf4\xd2\xb8\x7a\xbf\x91\x02\xf3\x22\x8c\x13\xf2\x77\xd8\x8e\x43\x8b\xe1\x54\x6e\x5e\x9d\xc7\x49\x44\x02\x22\xc7\xa4\x79\x81\x85\xb8\x65\x3c\x1c\x93\xe6\x59\xa2\xf8\x1c\x51\x95\x05\xd9\x20\x00\x21\x7e\x60\x21\x58\xa9\x56\xff\xbe\xb6\x5a\x5e\x5b\x3f\x1f\xd6\xd3\x3c\xc4\x4d\xba\x99\xb4\x63\x6e\x7d\x3e\x3d\x57\xd2\x18\x5f\x47\xe8\xc3\x06\x8a\x68\x6c\x7f\x3b\x72\x0f\xe7\xe2\x77\x77\xf1\xd0\x99\xab\xdf\x2e\xfe\xd6\xbb\xcd\x1a\xb9\x90\xd1\xaf\xf2\x38\x3d\xdb\x74\xf8\xeb\xe3\xda\xe8\x2a\x62\xb7\xda\x1b\x07\xa9\xdc\x30\x5e\xbc\x68\xfb\x6b\x9f\x97\xf1\xc6\xb1\xd8\x5c\x29\x1e\x49\x30\xc5\xf7\xde\xad\x91\x42\xf9\xdd\xed\x89\x80\x25\xbe\x37\xd7\xe7\x32\x5c\xe6\x35\xac\xd4\x0c\x2d\xf7\x90\xc4\xe3\xf5\xe3\x2f\x7f\x54\x18\x88\xe3\x61\x47\x85\x64\x7f\xc0\xd7\x3f\x1a\x92\x42\xe9\xc7\x1e\x0d\x95\x76\xa7\x51\xa0\x8f\x02\x1b\x46\x9e\x06\x42\xd1\xf2\x01\x07\x02\xde\xe9\x7d\x1a\x0b\xa7\x32\x16\xcc\xc0\xee\xc4\x90\xd2\x5f\x6f\x98\x54\x5d\xf2\x95\xe1\xa7\x69\x10\x3a\x06\xe1\x65\xb3\x17\x47\x58\x78\xd0\x45\xd6\x5b\xd5\x5f\x25\x1d\x71\x49\xa6\x7a\x64\xda\xd0\x6f\xc7\x3a\x4c\xe3\x09\xc0\x6e\x96\x2c\xa7\xa7\x77\x34\x10\x05\x08\x21\x44\x92\x65\x77\xdf\x20\x5c\xbc\xe7\x97\x3f\xf4\x1a\x45\xd6\xe7\x27\x4a\xde\x74\x27\x66\x11\x7d\x70\xba\xd3\x78\xf9\x1e\x0d\xca\xc8\x39\xde\x7c\xb3\xa6\xe1\xbc\xd7\xc1\x6a\x6f\xb3\x0e\x52\xbe\xe4\x98\x8a\x15\x70\x94\x70\x26\x59\xc0\xa2\xf2\x1c\xfb\xd9\xc5\xf9\xbc\xd5\x92\x9c\xa3\xdf\xe6\x1e\xb3\x0d\x49\xba\x87\x50\x5f\x84\xfe\xe9\xd6\xf8\xbb\xe6\xf0\x7a\xeb\xa6\x65\x3b\x86\x8b\x79\x93\xf5\x59\x20\x6e\xb4\xa7\x44\xf4\x3f\xa5\xfe\x67\x42\x12\xdb\xd3\xe7\xbb\xa5\xa3\x8c\x5c\x2b\x97\xbb\xbb\x7f\x8e\xc5\x6e\xed\x43\x5c\xbf\x74\xc8\x8f\xff\xe6\xd6\xbe\x91\xb6\xf5\x95\xe4\xed\x93\xc4\xa8\x5b\xf9\x76\x4d\x35\xb7\xd8\x8c\xb6\x7d\xaf\x72\xe0\xb6\xbd\x01\x63\x9e\x76\xab\x1a\x32\x76\xe4\x8c\x76\xc2\xad\x6c\xa2\x65\xf7\xcf\xf8\xa7\xda\x2a\xb9\x8c\x3d\x3c\xa3\x9d\x64\x33\xe5\x1a\xb5\x2d\xfb\x86\xa2\x5a\x7f\x19\x5b\x7f\xc6\x3f\xd1\x53\xd3\xe2\x41\x5b\xd3\x4f\xf0\xec\xb0\x42\x73\x43\xd2\x68\x27\xd3\x6a\x6a\x34\xf6\x4e\x1e\x52\x8b\x87\x6c\xcc\xae\x44\xfb\x9e\xa7\x51\x4f\x9d\x55\x03\x81\x8e\x67\xfc\xb4\x69\xf0\x3a\x18\xf2\x40\xd0\xf6\xa8\x34\xe3\xc9\x98\xaf\xf6\xda\x24\xd3\xeb\x60\xb9\x0e\xd3\x1f\xa9\xff\xee\x1f\xfd\x37\x00\x00\xff\xff\x69\x5d\x0a\x6a\x39\x9d\x00\x00") + +func v2SchemaJSONBytes() ([]byte, error) { + return bindataRead( + _v2SchemaJSON, + "v2/schema.json", + ) +} + +func v2SchemaJSON() (*asset, error) { + bytes, err := v2SchemaJSONBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "v2/schema.json", size: 40249, mode: os.FileMode(420), modTime: time.Unix(1523760397, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +// Asset loads and returns the asset for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func Asset(name string) ([]byte, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) + } + return a.bytes, nil + } + return nil, fmt.Errorf("Asset %s not found", name) +} + +// MustAsset is like Asset but panics when Asset would return an error. +// It simplifies safe initialization of global variables. +func MustAsset(name string) []byte { + a, err := Asset(name) + if err != nil { + panic("asset: Asset(" + name + "): " + err.Error()) + } + + return a +} + +// AssetInfo loads and returns the asset info for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func AssetInfo(name string) (os.FileInfo, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) + } + return a.info, nil + } + return nil, fmt.Errorf("AssetInfo %s not found", name) +} + +// AssetNames returns the names of the assets. +func AssetNames() []string { + names := make([]string, 0, len(_bindata)) + for name := range _bindata { + names = append(names, name) + } + return names +} + +// _bindata is a table, holding each asset generator, mapped to its name. +var _bindata = map[string]func() (*asset, error){ + "jsonschema-draft-04.json": jsonschemaDraft04JSON, + "v2/schema.json": v2SchemaJSON, +} + +// AssetDir returns the file names below a certain +// directory embedded in the file by go-bindata. +// For example if you run go-bindata on data/... and data contains the +// following hierarchy: +// data/ +// foo.txt +// img/ +// a.png +// b.png +// then AssetDir("data") would return []string{"foo.txt", "img"} +// AssetDir("data/img") would return []string{"a.png", "b.png"} +// AssetDir("foo.txt") and AssetDir("notexist") would return an error +// AssetDir("") will return []string{"data"}. +func AssetDir(name string) ([]string, error) { + node := _bintree + if len(name) != 0 { + cannonicalName := strings.Replace(name, "\\", "/", -1) + pathList := strings.Split(cannonicalName, "/") + for _, p := range pathList { + node = node.Children[p] + if node == nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + } + } + if node.Func != nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + rv := make([]string, 0, len(node.Children)) + for childName := range node.Children { + rv = append(rv, childName) + } + return rv, nil +} + +type bintree struct { + Func func() (*asset, error) + Children map[string]*bintree +} + +var _bintree = &bintree{nil, map[string]*bintree{ + "jsonschema-draft-04.json": &bintree{jsonschemaDraft04JSON, map[string]*bintree{}}, + "v2": &bintree{nil, map[string]*bintree{ + "schema.json": &bintree{v2SchemaJSON, map[string]*bintree{}}, + }}, +}} + +// RestoreAsset restores an asset under the given directory +func RestoreAsset(dir, name string) error { + data, err := Asset(name) + if err != nil { + return err + } + info, err := AssetInfo(name) + if err != nil { + return err + } + err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) + if err != nil { + return err + } + err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) + if err != nil { + return err + } + err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) + if err != nil { + return err + } + return nil +} + +// RestoreAssets restores an asset under the given directory recursively +func RestoreAssets(dir, name string) error { + children, err := AssetDir(name) + // File + if err != nil { + return RestoreAsset(dir, name) + } + // Dir + for _, child := range children { + err = RestoreAssets(dir, filepath.Join(name, child)) + if err != nil { + return err + } + } + return nil +} + +func _filePath(dir, name string) string { + cannonicalName := strings.Replace(name, "\\", "/", -1) + return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) +} diff --git a/vendor/github.com/go-openapi/spec/contact_info.go b/vendor/github.com/go-openapi/spec/contact_info.go new file mode 100644 index 0000000000..f285970aa1 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/contact_info.go @@ -0,0 +1,24 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +// ContactInfo contact information for the exposed API. +// +// For more information: http://goo.gl/8us55a#contactObject +type ContactInfo struct { + Name string `json:"name,omitempty"` + URL string `json:"url,omitempty"` + Email string `json:"email,omitempty"` +} diff --git a/vendor/github.com/go-openapi/spec/debug.go b/vendor/github.com/go-openapi/spec/debug.go new file mode 100644 index 0000000000..7edb95a614 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/debug.go @@ -0,0 +1,47 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import ( + "fmt" + "log" + "os" + "path/filepath" + "runtime" +) + +var ( + // Debug is true when the SWAGGER_DEBUG env var is not empty. + // It enables a more verbose logging of validators. + Debug = os.Getenv("SWAGGER_DEBUG") != "" + // validateLogger is a debug logger for this package + specLogger *log.Logger +) + +func init() { + debugOptions() +} + +func debugOptions() { + specLogger = log.New(os.Stdout, "spec:", log.LstdFlags) +} + +func debugLog(msg string, args ...interface{}) { + // A private, trivial trace logger, based on go-openapi/spec/expander.go:debugLog() + if Debug { + _, file1, pos1, _ := runtime.Caller(1) + specLogger.Printf("%s:%d: %s", filepath.Base(file1), pos1, fmt.Sprintf(msg, args...)) + } +} diff --git a/vendor/github.com/go-openapi/spec/expander.go b/vendor/github.com/go-openapi/spec/expander.go new file mode 100644 index 0000000000..456a9dd7ef --- /dev/null +++ b/vendor/github.com/go-openapi/spec/expander.go @@ -0,0 +1,1227 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import ( + "encoding/json" + "fmt" + "log" + "net/url" + "os" + "path" + "path/filepath" + "reflect" + "strings" + "sync" + + "github.com/go-openapi/jsonpointer" + "github.com/go-openapi/swag" +) + +// ExpandOptions provides options for expand. +type ExpandOptions struct { + RelativeBase string + SkipSchemas bool + ContinueOnError bool + AbsoluteCircularRef bool +} + +// ResolutionCache a cache for resolving urls +type ResolutionCache interface { + Get(string) (interface{}, bool) + Set(string, interface{}) +} + +type simpleCache struct { + lock sync.RWMutex + store map[string]interface{} +} + +var resCache ResolutionCache + +func init() { + resCache = initResolutionCache() +} + +// initResolutionCache initializes the URI resolution cache +func initResolutionCache() ResolutionCache { + return &simpleCache{store: map[string]interface{}{ + "http://swagger.io/v2/schema.json": MustLoadSwagger20Schema(), + "http://json-schema.org/draft-04/schema": MustLoadJSONSchemaDraft04(), + }} +} + +// resolverContext allows to share a context during spec processing. +// At the moment, it just holds the index of circular references found. +type resolverContext struct { + // circulars holds all visited circular references, which allows shortcuts. + // NOTE: this is not just a performance improvement: it is required to figure out + // circular references which participate several cycles. + // This structure is privately instantiated and needs not be locked against + // concurrent access, unless we chose to implement a parallel spec walking. + circulars map[string]bool + basePath string +} + +func newResolverContext(originalBasePath string) *resolverContext { + return &resolverContext{ + circulars: make(map[string]bool), + basePath: originalBasePath, // keep the root base path in context + } +} + +// Get retrieves a cached URI +func (s *simpleCache) Get(uri string) (interface{}, bool) { + debugLog("getting %q from resolution cache", uri) + s.lock.RLock() + v, ok := s.store[uri] + debugLog("got %q from resolution cache: %t", uri, ok) + + s.lock.RUnlock() + return v, ok +} + +// Set caches a URI +func (s *simpleCache) Set(uri string, data interface{}) { + s.lock.Lock() + s.store[uri] = data + s.lock.Unlock() +} + +// ResolveRefWithBase resolves a reference against a context root with preservation of base path +func ResolveRefWithBase(root interface{}, ref *Ref, opts *ExpandOptions) (*Schema, error) { + resolver, err := defaultSchemaLoader(root, opts, nil, nil) + if err != nil { + return nil, err + } + specBasePath := "" + if opts != nil && opts.RelativeBase != "" { + specBasePath, _ = absPath(opts.RelativeBase) + } + + result := new(Schema) + if err := resolver.Resolve(ref, result, specBasePath); err != nil { + return nil, err + } + return result, nil +} + +// ResolveRef resolves a reference against a context root +// ref is guaranteed to be in root (no need to go to external files) +// ResolveRef is ONLY called from the code generation module +func ResolveRef(root interface{}, ref *Ref) (*Schema, error) { + res, _, err := ref.GetPointer().Get(root) + if err != nil { + panic(err) + } + switch sch := res.(type) { + case Schema: + return &sch, nil + case *Schema: + return sch, nil + case map[string]interface{}: + b, _ := json.Marshal(sch) + newSch := new(Schema) + _ = json.Unmarshal(b, newSch) + return newSch, nil + default: + return nil, fmt.Errorf("unknown type for the resolved reference") + } +} + +// ResolveParameter resolves a parameter reference against a context root +func ResolveParameter(root interface{}, ref Ref) (*Parameter, error) { + return ResolveParameterWithBase(root, ref, nil) +} + +// ResolveParameterWithBase resolves a parameter reference against a context root and base path +func ResolveParameterWithBase(root interface{}, ref Ref, opts *ExpandOptions) (*Parameter, error) { + resolver, err := defaultSchemaLoader(root, opts, nil, nil) + if err != nil { + return nil, err + } + + result := new(Parameter) + if err := resolver.Resolve(&ref, result, ""); err != nil { + return nil, err + } + return result, nil +} + +// ResolveResponse resolves response a reference against a context root +func ResolveResponse(root interface{}, ref Ref) (*Response, error) { + return ResolveResponseWithBase(root, ref, nil) +} + +// ResolveResponseWithBase resolves response a reference against a context root and base path +func ResolveResponseWithBase(root interface{}, ref Ref, opts *ExpandOptions) (*Response, error) { + resolver, err := defaultSchemaLoader(root, opts, nil, nil) + if err != nil { + return nil, err + } + + result := new(Response) + if err := resolver.Resolve(&ref, result, ""); err != nil { + return nil, err + } + return result, nil +} + +// ResolveItems resolves header and parameter items reference against a context root and base path +func ResolveItems(root interface{}, ref Ref, opts *ExpandOptions) (*Items, error) { + resolver, err := defaultSchemaLoader(root, opts, nil, nil) + if err != nil { + return nil, err + } + basePath := "" + if opts.RelativeBase != "" { + basePath = opts.RelativeBase + } + result := new(Items) + if err := resolver.Resolve(&ref, result, basePath); err != nil { + return nil, err + } + return result, nil +} + +// ResolvePathItem resolves response a path item against a context root and base path +func ResolvePathItem(root interface{}, ref Ref, opts *ExpandOptions) (*PathItem, error) { + resolver, err := defaultSchemaLoader(root, opts, nil, nil) + if err != nil { + return nil, err + } + basePath := "" + if opts.RelativeBase != "" { + basePath = opts.RelativeBase + } + result := new(PathItem) + if err := resolver.Resolve(&ref, result, basePath); err != nil { + return nil, err + } + return result, nil +} + +type schemaLoader struct { + root interface{} + options *ExpandOptions + cache ResolutionCache + context *resolverContext + loadDoc func(string) (json.RawMessage, error) +} + +var idPtr, _ = jsonpointer.New("/id") +var refPtr, _ = jsonpointer.New("/$ref") + +// PathLoader function to use when loading remote refs +var PathLoader func(string) (json.RawMessage, error) + +func init() { + PathLoader = func(path string) (json.RawMessage, error) { + data, err := swag.LoadFromFileOrHTTP(path) + if err != nil { + return nil, err + } + return json.RawMessage(data), nil + } +} + +func defaultSchemaLoader( + root interface{}, + expandOptions *ExpandOptions, + cache ResolutionCache, + context *resolverContext) (*schemaLoader, error) { + + if cache == nil { + cache = resCache + } + if expandOptions == nil { + expandOptions = &ExpandOptions{} + } + absBase, _ := absPath(expandOptions.RelativeBase) + if context == nil { + context = newResolverContext(absBase) + } + return &schemaLoader{ + root: root, + options: expandOptions, + cache: cache, + context: context, + loadDoc: func(path string) (json.RawMessage, error) { + debugLog("fetching document at %q", path) + return PathLoader(path) + }, + }, nil +} + +func idFromNode(node interface{}) (*Ref, error) { + if idValue, _, err := idPtr.Get(node); err == nil { + if refStr, ok := idValue.(string); ok && refStr != "" { + idRef, err := NewRef(refStr) + if err != nil { + return nil, err + } + return &idRef, nil + } + } + return nil, nil +} + +func nextRef(startingNode interface{}, startingRef *Ref, ptr *jsonpointer.Pointer) *Ref { + if startingRef == nil { + return nil + } + + if ptr == nil { + return startingRef + } + + ret := startingRef + var idRef *Ref + node := startingNode + + for _, tok := range ptr.DecodedTokens() { + node, _, _ = jsonpointer.GetForToken(node, tok) + if node == nil { + break + } + + idRef, _ = idFromNode(node) + if idRef != nil { + nw, err := ret.Inherits(*idRef) + if err != nil { + break + } + ret = nw + } + + refRef, _, _ := refPtr.Get(node) + if refRef != nil { + var rf Ref + switch value := refRef.(type) { + case string: + rf, _ = NewRef(value) + } + nw, err := ret.Inherits(rf) + if err != nil { + break + } + nwURL := nw.GetURL() + if nwURL.Scheme == "file" || (nwURL.Scheme == "" && nwURL.Host == "") { + nwpt := filepath.ToSlash(nwURL.Path) + if filepath.IsAbs(nwpt) { + _, err := os.Stat(nwpt) + if err != nil { + nwURL.Path = filepath.Join(".", nwpt) + } + } + } + + ret = nw + } + + } + + return ret +} + +// normalize absolute path for cache. +// on Windows, drive letters should be converted to lower as scheme in net/url.URL +func normalizeAbsPath(path string) string { + u, err := url.Parse(path) + if err != nil { + debugLog("normalize absolute path failed: %s", err) + return path + } + return u.String() +} + +// base or refPath could be a file path or a URL +// given a base absolute path and a ref path, return the absolute path of refPath +// 1) if refPath is absolute, return it +// 2) if refPath is relative, join it with basePath keeping the scheme, hosts, and ports if exists +// base could be a directory or a full file path +func normalizePaths(refPath, base string) string { + refURL, _ := url.Parse(refPath) + if path.IsAbs(refURL.Path) || filepath.IsAbs(refPath) { + // refPath is actually absolute + if refURL.Host != "" { + return refPath + } + parts := strings.Split(refPath, "#") + result := filepath.FromSlash(parts[0]) + if len(parts) == 2 { + result += "#" + parts[1] + } + return result + } + + // relative refPath + baseURL, _ := url.Parse(base) + if !strings.HasPrefix(refPath, "#") { + // combining paths + if baseURL.Host != "" { + baseURL.Path = path.Join(path.Dir(baseURL.Path), refURL.Path) + } else { // base is a file + newBase := fmt.Sprintf("%s#%s", filepath.Join(filepath.Dir(base), filepath.FromSlash(refURL.Path)), refURL.Fragment) + return newBase + } + + } + // copying fragment from ref to base + baseURL.Fragment = refURL.Fragment + return baseURL.String() +} + +// denormalizePaths returns to simplest notation on file $ref, +// i.e. strips the absolute path and sets a path relative to the base path. +// +// This is currently used when we rewrite ref after a circular ref has been detected +func denormalizeFileRef(ref *Ref, relativeBase, originalRelativeBase string) *Ref { + debugLog("denormalizeFileRef for: %s", ref.String()) + + if ref.String() == "" || ref.IsRoot() || ref.HasFragmentOnly { + return ref + } + // strip relativeBase from URI + relativeBaseURL, _ := url.Parse(relativeBase) + relativeBaseURL.Fragment = "" + + if relativeBaseURL.IsAbs() && strings.HasPrefix(ref.String(), relativeBase) { + // this should work for absolute URI (e.g. http://...): we have an exact match, just trim prefix + r, _ := NewRef(strings.TrimPrefix(ref.String(), relativeBase)) + return &r + } + + if relativeBaseURL.IsAbs() { + // other absolute URL get unchanged (i.e. with a non-empty scheme) + return ref + } + + // for relative file URIs: + originalRelativeBaseURL, _ := url.Parse(originalRelativeBase) + originalRelativeBaseURL.Fragment = "" + if strings.HasPrefix(ref.String(), originalRelativeBaseURL.String()) { + // the resulting ref is in the expanded spec: return a local ref + r, _ := NewRef(strings.TrimPrefix(ref.String(), originalRelativeBaseURL.String())) + return &r + } + + // check if we may set a relative path, considering the original base path for this spec. + // Example: + // spec is located at /mypath/spec.json + // my normalized ref points to: /mypath/item.json#/target + // expected result: item.json#/target + parts := strings.Split(ref.String(), "#") + relativePath, err := filepath.Rel(path.Dir(originalRelativeBaseURL.String()), parts[0]) + if err != nil { + // there is no common ancestor (e.g. different drives on windows) + // leaves the ref unchanged + return ref + } + if len(parts) == 2 { + relativePath += "#" + parts[1] + } + r, _ := NewRef(relativePath) + return &r +} + +// relativeBase could be an ABSOLUTE file path or an ABSOLUTE URL +func normalizeFileRef(ref *Ref, relativeBase string) *Ref { + // This is important for when the reference is pointing to the root schema + if ref.String() == "" { + r, _ := NewRef(relativeBase) + return &r + } + + debugLog("normalizing %s against %s", ref.String(), relativeBase) + + s := normalizePaths(ref.String(), relativeBase) + r, _ := NewRef(s) + return &r +} + +func (r *schemaLoader) resolveRef(ref *Ref, target interface{}, basePath string) error { + tgt := reflect.ValueOf(target) + if tgt.Kind() != reflect.Ptr { + return fmt.Errorf("resolve ref: target needs to be a pointer") + } + + refURL := ref.GetURL() + if refURL == nil { + return nil + } + + var res interface{} + var data interface{} + var err error + // Resolve against the root if it isn't nil, and if ref is pointing at the root, or has a fragment only which means + // it is pointing somewhere in the root. + root := r.root + if (ref.IsRoot() || ref.HasFragmentOnly) && root == nil && basePath != "" { + if baseRef, erb := NewRef(basePath); erb == nil { + root, _, _, _ = r.load(baseRef.GetURL()) + } + } + if (ref.IsRoot() || ref.HasFragmentOnly) && root != nil { + data = root + } else { + baseRef := normalizeFileRef(ref, basePath) + debugLog("current ref is: %s", ref.String()) + debugLog("current ref normalized file: %s", baseRef.String()) + data, _, _, err = r.load(baseRef.GetURL()) + if err != nil { + return err + } + } + + res = data + if ref.String() != "" { + res, _, err = ref.GetPointer().Get(data) + if err != nil { + return err + } + } + if err := swag.DynamicJSONToStruct(res, target); err != nil { + return err + } + + return nil +} + +func (r *schemaLoader) load(refURL *url.URL) (interface{}, url.URL, bool, error) { + debugLog("loading schema from url: %s", refURL) + toFetch := *refURL + toFetch.Fragment = "" + + normalized := normalizeAbsPath(toFetch.String()) + + data, fromCache := r.cache.Get(normalized) + if !fromCache { + b, err := r.loadDoc(normalized) + if err != nil { + return nil, url.URL{}, false, err + } + + if err := json.Unmarshal(b, &data); err != nil { + return nil, url.URL{}, false, err + } + r.cache.Set(normalized, data) + } + + return data, toFetch, fromCache, nil +} + +// Resolve resolves a reference against basePath and stores the result in target +// Resolve is not in charge of following references, it only resolves ref by following its URL +// if the schema that ref is referring to has more refs in it. Resolve doesn't resolve them +// if basePath is an empty string, ref is resolved against the root schema stored in the schemaLoader struct +func (r *schemaLoader) Resolve(ref *Ref, target interface{}, basePath string) error { + return r.resolveRef(ref, target, basePath) +} + +// absPath returns the absolute path of a file +func absPath(fname string) (string, error) { + if strings.HasPrefix(fname, "http") { + return fname, nil + } + if filepath.IsAbs(fname) { + return fname, nil + } + wd, err := os.Getwd() + return filepath.Join(wd, fname), err +} + +// ExpandSpec expands the references in a swagger spec +func ExpandSpec(spec *Swagger, options *ExpandOptions) error { + resolver, err := defaultSchemaLoader(spec, options, nil, nil) + // Just in case this ever returns an error. + if shouldStopOnError(err, resolver.options) { + return err + } + + // getting the base path of the spec to adjust all subsequent reference resolutions + specBasePath := "" + if options != nil && options.RelativeBase != "" { + specBasePath, _ = absPath(options.RelativeBase) + } + + if options == nil || !options.SkipSchemas { + for key, definition := range spec.Definitions { + var def *Schema + var err error + if def, err = expandSchema(definition, []string{fmt.Sprintf("#/definitions/%s", key)}, resolver, specBasePath); shouldStopOnError(err, resolver.options) { + return err + } + if def != nil { + spec.Definitions[key] = *def + } + } + } + + for key, parameter := range spec.Parameters { + if err := expandParameter(¶meter, resolver, specBasePath); shouldStopOnError(err, resolver.options) { + return err + } + spec.Parameters[key] = parameter + } + + for key, response := range spec.Responses { + if err := expandResponse(&response, resolver, specBasePath); shouldStopOnError(err, resolver.options) { + return err + } + spec.Responses[key] = response + } + + if spec.Paths != nil { + for key, path := range spec.Paths.Paths { + if err := expandPathItem(&path, resolver, specBasePath); shouldStopOnError(err, resolver.options) { + return err + } + spec.Paths.Paths[key] = path + } + } + + return nil +} + +func shouldStopOnError(err error, opts *ExpandOptions) bool { + if err != nil && !opts.ContinueOnError { + return true + } + + if err != nil { + log.Println(err) + } + + return false +} + +// baseForRoot loads in the cache the root document and produces a fake "root" base path entry +// for further $ref resolution +func baseForRoot(root interface{}, cache ResolutionCache) string { + // cache the root document to resolve $ref's + const rootBase = "root" + if root != nil { + base, _ := absPath(rootBase) + normalizedBase := normalizeAbsPath(base) + debugLog("setting root doc in cache at: %s", normalizedBase) + if cache == nil { + cache = resCache + } + cache.Set(normalizedBase, root) + return rootBase + } + return "" +} + +// ExpandSchema expands the refs in the schema object with reference to the root object +// go-openapi/validate uses this function +// notice that it is impossible to reference a json schema in a different file other than root +func ExpandSchema(schema *Schema, root interface{}, cache ResolutionCache) error { + opts := &ExpandOptions{ + // when a root is specified, cache the root as an in-memory document for $ref retrieval + RelativeBase: baseForRoot(root, cache), + SkipSchemas: false, + ContinueOnError: false, + // when no base path is specified, remaining $ref (circular) are rendered with an absolute path + AbsoluteCircularRef: true, + } + return ExpandSchemaWithBasePath(schema, cache, opts) +} + +// ExpandSchemaWithBasePath expands the refs in the schema object, base path configured through expand options +func ExpandSchemaWithBasePath(schema *Schema, cache ResolutionCache, opts *ExpandOptions) error { + if schema == nil { + return nil + } + + var basePath string + if opts.RelativeBase != "" { + basePath, _ = absPath(opts.RelativeBase) + } + + resolver, err := defaultSchemaLoader(nil, opts, cache, nil) + if err != nil { + return err + } + + refs := []string{""} + var s *Schema + if s, err = expandSchema(*schema, refs, resolver, basePath); err != nil { + return err + } + *schema = *s + return nil +} + +func expandItems(target Schema, parentRefs []string, resolver *schemaLoader, basePath string) (*Schema, error) { + if target.Items != nil { + if target.Items.Schema != nil { + t, err := expandSchema(*target.Items.Schema, parentRefs, resolver, basePath) + if err != nil { + return nil, err + } + *target.Items.Schema = *t + } + for i := range target.Items.Schemas { + t, err := expandSchema(target.Items.Schemas[i], parentRefs, resolver, basePath) + if err != nil { + return nil, err + } + target.Items.Schemas[i] = *t + } + } + return &target, nil +} + +// basePathFromSchemaID returns a new basePath based on an existing basePath and a schema ID +func basePathFromSchemaID(oldBasePath, id string) string { + u, err := url.Parse(oldBasePath) + if err != nil { + panic(err) + } + uid, err := url.Parse(id) + if err != nil { + panic(err) + } + + if path.IsAbs(uid.Path) { + return id + } + u.Path = path.Join(path.Dir(u.Path), uid.Path) + return u.String() +} + +// isCircular detects cycles in sequences of $ref. +// It relies on a private context (which needs not be locked). +func (r *schemaLoader) isCircular(ref *Ref, basePath string, parentRefs ...string) (foundCycle bool) { + normalizedRef := normalizePaths(ref.String(), basePath) + if _, ok := r.context.circulars[normalizedRef]; ok { + // circular $ref has been already detected in another explored cycle + foundCycle = true + return + } + foundCycle = swag.ContainsStringsCI(parentRefs, normalizedRef) + if foundCycle { + r.context.circulars[normalizedRef] = true + } + return +} + +func updateBasePath(transitive *schemaLoader, resolver *schemaLoader, basePath string) string { + if transitive != resolver { + debugLog("got a new resolver") + if transitive.options != nil && transitive.options.RelativeBase != "" { + basePath, _ = absPath(transitive.options.RelativeBase) + debugLog("new basePath = %s", basePath) + } + } + + return basePath +} + +func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, basePath string) (*Schema, error) { + if target.Ref.String() == "" && target.Ref.IsRoot() { + // normalizing is important + newRef := normalizeFileRef(&target.Ref, basePath) + target.Ref = *newRef + return &target, nil + + } + + /* change the base path of resolution when an ID is encountered + otherwise the basePath should inherit the parent's */ + // important: ID can be relative path + if target.ID != "" { + debugLog("schema has ID: %s", target.ID) + // handling the case when id is a folder + // remember that basePath has to be a file + refPath := target.ID + if strings.HasSuffix(target.ID, "/") { + // path.Clean here would not work correctly if basepath is http + refPath = fmt.Sprintf("%s%s", refPath, "placeholder.json") + } + basePath = normalizePaths(refPath, basePath) + } + + /* Explain here what this function does */ + var t *Schema + /* if Ref is found, everything else doesn't matter */ + /* Ref also changes the resolution scope of children expandSchema */ + if target.Ref.String() != "" { + /* Here the resolution scope is changed because a $ref was encountered */ + normalizedRef := normalizeFileRef(&target.Ref, basePath) + normalizedBasePath := normalizedRef.RemoteURI() + + if resolver.isCircular(normalizedRef, basePath, parentRefs...) { + // this means there is a cycle in the recursion tree: return the Ref + // - circular refs cannot be expanded. We leave them as ref. + // - denormalization means that a new local file ref is set relative to the original basePath + debugLog("shortcut circular ref: basePath: %s, normalizedPath: %s, normalized ref: %s", + basePath, normalizedBasePath, normalizedRef.String()) + if !resolver.options.AbsoluteCircularRef { + target.Ref = *denormalizeFileRef(normalizedRef, normalizedBasePath, resolver.context.basePath) + } else { + target.Ref = *normalizedRef + } + return &target, nil + } + + debugLog("basePath: %s", basePath) + if Debug { + b, _ := json.Marshal(target) + debugLog("calling Resolve with target: %s", string(b)) + } + if err := resolver.Resolve(&target.Ref, &t, basePath); shouldStopOnError(err, resolver.options) { + return nil, err + } + + if t != nil { + parentRefs = append(parentRefs, normalizedRef.String()) + var err error + transitiveResolver, err := transitiveResolver(basePath, target.Ref, resolver) + if shouldStopOnError(err, resolver.options) { + return nil, err + } + + basePath = updateBasePath(transitiveResolver, resolver, normalizedBasePath) + + return expandSchema(*t, parentRefs, transitiveResolver, basePath) + } + } + + t, err := expandItems(target, parentRefs, resolver, basePath) + if shouldStopOnError(err, resolver.options) { + return &target, err + } + if t != nil { + target = *t + } + + for i := range target.AllOf { + t, err := expandSchema(target.AllOf[i], parentRefs, resolver, basePath) + if shouldStopOnError(err, resolver.options) { + return &target, err + } + target.AllOf[i] = *t + } + for i := range target.AnyOf { + t, err := expandSchema(target.AnyOf[i], parentRefs, resolver, basePath) + if shouldStopOnError(err, resolver.options) { + return &target, err + } + target.AnyOf[i] = *t + } + for i := range target.OneOf { + t, err := expandSchema(target.OneOf[i], parentRefs, resolver, basePath) + if shouldStopOnError(err, resolver.options) { + return &target, err + } + if t != nil { + target.OneOf[i] = *t + } + } + if target.Not != nil { + t, err := expandSchema(*target.Not, parentRefs, resolver, basePath) + if shouldStopOnError(err, resolver.options) { + return &target, err + } + if t != nil { + *target.Not = *t + } + } + for k := range target.Properties { + t, err := expandSchema(target.Properties[k], parentRefs, resolver, basePath) + if shouldStopOnError(err, resolver.options) { + return &target, err + } + if t != nil { + target.Properties[k] = *t + } + } + if target.AdditionalProperties != nil && target.AdditionalProperties.Schema != nil { + t, err := expandSchema(*target.AdditionalProperties.Schema, parentRefs, resolver, basePath) + if shouldStopOnError(err, resolver.options) { + return &target, err + } + if t != nil { + *target.AdditionalProperties.Schema = *t + } + } + for k := range target.PatternProperties { + t, err := expandSchema(target.PatternProperties[k], parentRefs, resolver, basePath) + if shouldStopOnError(err, resolver.options) { + return &target, err + } + if t != nil { + target.PatternProperties[k] = *t + } + } + for k := range target.Dependencies { + if target.Dependencies[k].Schema != nil { + t, err := expandSchema(*target.Dependencies[k].Schema, parentRefs, resolver, basePath) + if shouldStopOnError(err, resolver.options) { + return &target, err + } + if t != nil { + *target.Dependencies[k].Schema = *t + } + } + } + if target.AdditionalItems != nil && target.AdditionalItems.Schema != nil { + t, err := expandSchema(*target.AdditionalItems.Schema, parentRefs, resolver, basePath) + if shouldStopOnError(err, resolver.options) { + return &target, err + } + if t != nil { + *target.AdditionalItems.Schema = *t + } + } + for k := range target.Definitions { + t, err := expandSchema(target.Definitions[k], parentRefs, resolver, basePath) + if shouldStopOnError(err, resolver.options) { + return &target, err + } + if t != nil { + target.Definitions[k] = *t + } + } + return &target, nil +} + +func derefPathItem(pathItem *PathItem, parentRefs []string, resolver *schemaLoader, basePath string) error { + curRef := pathItem.Ref.String() + if curRef != "" { + normalizedRef := normalizeFileRef(&pathItem.Ref, basePath) + normalizedBasePath := normalizedRef.RemoteURI() + + if resolver.isCircular(normalizedRef, basePath, parentRefs...) { + return nil + } + + if err := resolver.Resolve(&pathItem.Ref, pathItem, basePath); shouldStopOnError(err, resolver.options) { + return err + } + + if pathItem.Ref.String() != "" && pathItem.Ref.String() != curRef && basePath != normalizedBasePath { + parentRefs = append(parentRefs, normalizedRef.String()) + return derefPathItem(pathItem, parentRefs, resolver, normalizedBasePath) + } + } + + return nil +} + +func expandPathItem(pathItem *PathItem, resolver *schemaLoader, basePath string) error { + if pathItem == nil { + return nil + } + + parentRefs := []string{} + if err := derefPathItem(pathItem, parentRefs, resolver, basePath); shouldStopOnError(err, resolver.options) { + return err + } + if pathItem.Ref.String() != "" { + var err error + resolver, err = transitiveResolver(basePath, pathItem.Ref, resolver) + if shouldStopOnError(err, resolver.options) { + return err + } + } + pathItem.Ref = Ref{} + + // Currently unused: + //parentRefs = parentRefs[0:] + + for idx := range pathItem.Parameters { + if err := expandParameter(&(pathItem.Parameters[idx]), resolver, basePath); shouldStopOnError(err, resolver.options) { + return err + } + } + if err := expandOperation(pathItem.Get, resolver, basePath); shouldStopOnError(err, resolver.options) { + return err + } + if err := expandOperation(pathItem.Head, resolver, basePath); shouldStopOnError(err, resolver.options) { + return err + } + if err := expandOperation(pathItem.Options, resolver, basePath); shouldStopOnError(err, resolver.options) { + return err + } + if err := expandOperation(pathItem.Put, resolver, basePath); shouldStopOnError(err, resolver.options) { + return err + } + if err := expandOperation(pathItem.Post, resolver, basePath); shouldStopOnError(err, resolver.options) { + return err + } + if err := expandOperation(pathItem.Patch, resolver, basePath); shouldStopOnError(err, resolver.options) { + return err + } + if err := expandOperation(pathItem.Delete, resolver, basePath); shouldStopOnError(err, resolver.options) { + return err + } + return nil +} + +func expandOperation(op *Operation, resolver *schemaLoader, basePath string) error { + if op == nil { + return nil + } + + for i, param := range op.Parameters { + if err := expandParameter(¶m, resolver, basePath); shouldStopOnError(err, resolver.options) { + return err + } + op.Parameters[i] = param + } + + if op.Responses != nil { + responses := op.Responses + if err := expandResponse(responses.Default, resolver, basePath); shouldStopOnError(err, resolver.options) { + return err + } + for code, response := range responses.StatusCodeResponses { + if err := expandResponse(&response, resolver, basePath); shouldStopOnError(err, resolver.options) { + return err + } + responses.StatusCodeResponses[code] = response + } + } + return nil +} + +func transitiveResolver(basePath string, ref Ref, resolver *schemaLoader) (*schemaLoader, error) { + if ref.IsRoot() || ref.HasFragmentOnly { + return resolver, nil + } + + baseRef, _ := NewRef(basePath) + currentRef := normalizeFileRef(&ref, basePath) + // Set a new root to resolve against + if !strings.HasPrefix(currentRef.String(), baseRef.String()) { + rootURL := currentRef.GetURL() + rootURL.Fragment = "" + root, _ := resolver.cache.Get(rootURL.String()) + var err error + + // shallow copy of resolver options to set a new RelativeBase when + // traversing multiple documents + newOptions := resolver.options + newOptions.RelativeBase = rootURL.String() + debugLog("setting new root: %s", newOptions.RelativeBase) + resolver, err = defaultSchemaLoader(root, newOptions, resolver.cache, resolver.context) + if err != nil { + return nil, err + } + } + + return resolver, nil +} + +// ExpandResponseWithRoot expands a response based on a root document, not a fetchable document +func ExpandResponseWithRoot(response *Response, root interface{}, cache ResolutionCache) error { + opts := &ExpandOptions{ + RelativeBase: baseForRoot(root, cache), + SkipSchemas: false, + ContinueOnError: false, + // when no base path is specified, remaining $ref (circular) are rendered with an absolute path + AbsoluteCircularRef: true, + } + resolver, err := defaultSchemaLoader(root, opts, nil, nil) + if err != nil { + return err + } + + return expandResponse(response, resolver, opts.RelativeBase) +} + +// ExpandResponse expands a response based on a basepath +// This is the exported version of expandResponse +// all refs inside response will be resolved relative to basePath +func ExpandResponse(response *Response, basePath string) error { + var specBasePath string + if basePath != "" { + specBasePath, _ = absPath(basePath) + } + opts := &ExpandOptions{ + RelativeBase: specBasePath, + } + resolver, err := defaultSchemaLoader(nil, opts, nil, nil) + if err != nil { + return err + } + + return expandResponse(response, resolver, opts.RelativeBase) +} + +func derefResponse(response *Response, parentRefs []string, resolver *schemaLoader, basePath string) error { + curRef := response.Ref.String() + if curRef != "" { + /* Here the resolution scope is changed because a $ref was encountered */ + normalizedRef := normalizeFileRef(&response.Ref, basePath) + normalizedBasePath := normalizedRef.RemoteURI() + + if resolver.isCircular(normalizedRef, basePath, parentRefs...) { + return nil + } + + if err := resolver.Resolve(&response.Ref, response, basePath); shouldStopOnError(err, resolver.options) { + return err + } + + if response.Ref.String() != "" && response.Ref.String() != curRef && basePath != normalizedBasePath { + parentRefs = append(parentRefs, normalizedRef.String()) + return derefResponse(response, parentRefs, resolver, normalizedBasePath) + } + } + + return nil +} + +func expandResponse(response *Response, resolver *schemaLoader, basePath string) error { + if response == nil { + return nil + } + parentRefs := []string{} + if err := derefResponse(response, parentRefs, resolver, basePath); shouldStopOnError(err, resolver.options) { + return err + } + if response.Ref.String() != "" { + transitiveResolver, err := transitiveResolver(basePath, response.Ref, resolver) + if shouldStopOnError(err, transitiveResolver.options) { + return err + } + basePath = updateBasePath(transitiveResolver, resolver, basePath) + resolver = transitiveResolver + } + if response.Schema != nil && response.Schema.Ref.String() != "" { + // schema expanded to a $ref in another root + var ern error + response.Schema.Ref, ern = NewRef(normalizePaths(response.Schema.Ref.String(), response.Ref.RemoteURI())) + if ern != nil { + return ern + } + } + response.Ref = Ref{} + + parentRefs = parentRefs[0:] + if !resolver.options.SkipSchemas && response.Schema != nil { + // parentRefs = append(parentRefs, response.Schema.Ref.String()) + s, err := expandSchema(*response.Schema, parentRefs, resolver, basePath) + if shouldStopOnError(err, resolver.options) { + return err + } + *response.Schema = *s + } + + return nil +} + +// ExpandParameterWithRoot expands a parameter based on a root document, not a fetchable document +func ExpandParameterWithRoot(parameter *Parameter, root interface{}, cache ResolutionCache) error { + opts := &ExpandOptions{ + RelativeBase: baseForRoot(root, cache), + SkipSchemas: false, + ContinueOnError: false, + // when no base path is specified, remaining $ref (circular) are rendered with an absolute path + AbsoluteCircularRef: true, + } + resolver, err := defaultSchemaLoader(root, opts, nil, nil) + if err != nil { + return err + } + + return expandParameter(parameter, resolver, opts.RelativeBase) +} + +// ExpandParameter expands a parameter based on a basepath +// This is the exported version of expandParameter +// all refs inside parameter will be resolved relative to basePath +func ExpandParameter(parameter *Parameter, basePath string) error { + var specBasePath string + if basePath != "" { + specBasePath, _ = absPath(basePath) + } + opts := &ExpandOptions{ + RelativeBase: specBasePath, + } + resolver, err := defaultSchemaLoader(nil, opts, nil, nil) + if err != nil { + return err + } + + return expandParameter(parameter, resolver, opts.RelativeBase) +} + +func derefParameter(parameter *Parameter, parentRefs []string, resolver *schemaLoader, basePath string) error { + curRef := parameter.Ref.String() + if curRef != "" { + normalizedRef := normalizeFileRef(¶meter.Ref, basePath) + normalizedBasePath := normalizedRef.RemoteURI() + + if resolver.isCircular(normalizedRef, basePath, parentRefs...) { + return nil + } + + if err := resolver.Resolve(¶meter.Ref, parameter, basePath); shouldStopOnError(err, resolver.options) { + return err + } + + if parameter.Ref.String() != "" && parameter.Ref.String() != curRef && basePath != normalizedBasePath { + parentRefs = append(parentRefs, normalizedRef.String()) + return derefParameter(parameter, parentRefs, resolver, normalizedBasePath) + } + } + + return nil +} + +func expandParameter(parameter *Parameter, resolver *schemaLoader, basePath string) error { + if parameter == nil { + return nil + } + + parentRefs := []string{} + if err := derefParameter(parameter, parentRefs, resolver, basePath); shouldStopOnError(err, resolver.options) { + return err + } + if parameter.Ref.String() != "" { + transitiveResolver, err := transitiveResolver(basePath, parameter.Ref, resolver) + if shouldStopOnError(err, transitiveResolver.options) { + return err + } + basePath = updateBasePath(transitiveResolver, resolver, basePath) + resolver = transitiveResolver + } + + if parameter.Schema != nil && parameter.Schema.Ref.String() != "" { + // schema expanded to a $ref in another root + var ern error + parameter.Schema.Ref, ern = NewRef(normalizePaths(parameter.Schema.Ref.String(), parameter.Ref.RemoteURI())) + if ern != nil { + return ern + } + } + parameter.Ref = Ref{} + + parentRefs = parentRefs[0:] + if !resolver.options.SkipSchemas && parameter.Schema != nil { + s, err := expandSchema(*parameter.Schema, parentRefs, resolver, basePath) + if shouldStopOnError(err, resolver.options) { + return err + } + *parameter.Schema = *s + } + return nil +} diff --git a/vendor/github.com/go-openapi/spec/external_docs.go b/vendor/github.com/go-openapi/spec/external_docs.go new file mode 100644 index 0000000000..88add91b2b --- /dev/null +++ b/vendor/github.com/go-openapi/spec/external_docs.go @@ -0,0 +1,24 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +// ExternalDocumentation allows referencing an external resource for +// extended documentation. +// +// For more information: http://goo.gl/8us55a#externalDocumentationObject +type ExternalDocumentation struct { + Description string `json:"description,omitempty"` + URL string `json:"url,omitempty"` +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/bugs/1429/remote/farther/farther.yaml b/vendor/github.com/go-openapi/spec/fixtures/bugs/1429/remote/farther/farther.yaml new file mode 100644 index 0000000000..857268e400 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/bugs/1429/remote/farther/farther.yaml @@ -0,0 +1,5 @@ +farFarAway: + type: object + properties: + farFarAwayProp: + type: integer diff --git a/vendor/github.com/go-openapi/spec/fixtures/bugs/1429/remote/remote.yaml b/vendor/github.com/go-openapi/spec/fixtures/bugs/1429/remote/remote.yaml new file mode 100644 index 0000000000..3e889453d6 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/bugs/1429/remote/remote.yaml @@ -0,0 +1,11 @@ +aRemotePlace: + type: object + properties: + remoteProp: + type: integer + fartherProp: + $ref: './farther/farther.yaml#/farFarAway' + +moreRemoteThanYouCanThink: + #$ref: './remote/remote.yaml#/farFarAway' + type: integer diff --git a/vendor/github.com/go-openapi/spec/fixtures/bugs/1429/remote/remote/remote.yaml b/vendor/github.com/go-openapi/spec/fixtures/bugs/1429/remote/remote/remote.yaml new file mode 100644 index 0000000000..857268e400 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/bugs/1429/remote/remote/remote.yaml @@ -0,0 +1,5 @@ +farFarAway: + type: object + properties: + farFarAwayProp: + type: integer diff --git a/vendor/github.com/go-openapi/spec/fixtures/bugs/1429/responses.yaml b/vendor/github.com/go-openapi/spec/fixtures/bugs/1429/responses.yaml new file mode 100644 index 0000000000..6db8e7268a --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/bugs/1429/responses.yaml @@ -0,0 +1,104 @@ +swagger: '2.0' +info: + title: Responses + version: 0.1.0 + +definitions: + Error: + type: object + description: | + Contains all the properties any error response from the API will contain. + Some properties are optional so might be empty most of the time + required: + - code + - message + properties: + code: + description: the error code, this is not necessarily the http status code + type: integer + format: int32 + message: + description: a human readable version of the error + type: string + helpUrl: + description: an optional url for getting more help about this error + type: string + format: uri + + myArray: + type: array + items: + $ref: '#/definitions/myItems' + + myItems: + type: object + properties: + propItems1: + type: integer + propItems2: + $ref: 'remote/remote.yaml#/aRemotePlace' + +otherPlace: + Error: + type: object + properties: + message: + type: string + +parameters: + BadRequest: + name: badRequest + in: body + schema: + $ref: '#/definitions/Error' + GoodRequest: + name: goodRequest + in: body + schema: + $ref: '#/otherPlace/Error' + PlainRequest: + name: plainRequest + in: body + schema: + type: integer + StrangeRequest: + name: stangeRequest + in: body + schema: + $ref: 'responses.yaml#/otherPlace/Error' + RemoteRequest: + name: remoteRequest + in: body + schema: + $ref: './remote/remote.yaml#/moreRemoteThanYouCanThink' + +responses: + BadRequest: + description: Bad request + schema: + $ref: '#/definitions/Error' + GoodRequest: + description: good request + schema: + $ref: '#/otherPlace/Error' + PlainRequest: + description: plain request + schema: + type: integer + StrangeRequest: + description: strange request + schema: + $ref: 'responses.yaml#/otherPlace/Error' + RemoteRequest: + description: remote request + schema: + $ref: './remote/remote.yaml#/moreRemoteThanYouCanThink' + +paths: + /: + get: + summary: GET + operationId: getAll + responses: + 200: + description: Ok diff --git a/vendor/github.com/go-openapi/spec/fixtures/bugs/1429/swagger.yaml b/vendor/github.com/go-openapi/spec/fixtures/bugs/1429/swagger.yaml new file mode 100644 index 0000000000..6ae0aba8a8 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/bugs/1429/swagger.yaml @@ -0,0 +1,39 @@ +swagger: '2.0' +info: + title: Object + version: 0.1.0 + +paths: + /: + get: + summary: GET + operationId: getAll + parameters: + - $ref: 'responses.yaml#/parameters/BadRequest' + - $ref: 'responses.yaml#/parameters/GoodRequest' + - $ref: 'responses.yaml#/parameters/PlainRequest' + - $ref: 'responses.yaml#/parameters/StrangeRequest' + - $ref: 'responses.yaml#/parameters/RemoteRequest' + - name: nestedBody + in: body + schema: + $ref: '#/definitions/nestedRefDefinition' + responses: + 200: + description: Ok + 400: + $ref: 'responses.yaml#/responses/BadRequest' + 403: + $ref: 'responses.yaml#/responses/GoodRequest' + 404: + $ref: 'responses.yaml#/responses/PlainRequest' + 304: + $ref: 'responses.yaml#/responses/StrangeRequest' + 204: + $ref: 'responses.yaml#/responses/RemoteRequest' + +definitions: + badDefinition: + $ref: 'responses.yaml#/definitions/Error' + nestedRefDefinition: + $ref: 'responses.yaml#/definitions/myArray' diff --git a/vendor/github.com/go-openapi/spec/fixtures/bugs/1614/gitea.json b/vendor/github.com/go-openapi/spec/fixtures/bugs/1614/gitea.json new file mode 100644 index 0000000000..f75412b800 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/bugs/1614/gitea.json @@ -0,0 +1,7916 @@ +{ + "consumes": [ + "application/json", + "text/plain" + ], + "produces": [ + "application/json", + "text/html" + ], + "schemes": [ + "http", + "https" + ], + "swagger": "2.0", + "info": { + "description": "This documentation describes the Gitea API.", + "title": "Gitea API.", + "license": { + "name": "MIT", + "url": "http://opensource.org/licenses/MIT" + }, + "version": "1.1.1" + }, + "basePath": "/api/v1", + "paths": { + "/admin/users": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Create a user", + "operationId": "adminCreateUser", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateUserOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/User" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/admin/users/{username}": { + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Delete a user", + "operationId": "adminDeleteUser", + "parameters": [ + { + "type": "string", + "description": "username of user to delete", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Edit an existing user", + "operationId": "adminEditUser", + "parameters": [ + { + "type": "string", + "description": "username of user to edit", + "name": "username", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditUserOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/User" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/admin/users/{username}/keys": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Add a public key on behalf of a user", + "operationId": "adminCreatePublicKey", + "parameters": [ + { + "type": "string", + "description": "username of the user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "$ref": "#/responses/PublicKey" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/admin/users/{username}/keys/{id}": { + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Delete a user's public key", + "operationId": "adminDeleteUserPublicKey", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the key to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/admin/users/{username}/orgs": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Create an organization", + "operationId": "adminCreateOrg", + "parameters": [ + { + "type": "string", + "description": "username of the user that will own the created organization", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "$ref": "#/responses/Organization" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/admin/users/{username}/repos": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Create a repository on behalf a user", + "operationId": "adminCreateRepo", + "parameters": [ + { + "type": "string", + "description": "username of the user. This user will own the created repository", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "$ref": "#/responses/Repository" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/markdown": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "text/html" + ], + "tags": [ + "miscellaneous" + ], + "summary": "Render a markdown document as HTML", + "operationId": "renderMarkdown", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/MarkdownOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/MarkdownRender" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/markdown/raw": { + "post": { + "consumes": [ + "text/plain" + ], + "produces": [ + "text/html" + ], + "tags": [ + "miscellaneous" + ], + "summary": "Render raw markdown as HTML", + "operationId": "renderMarkdownRaw", + "parameters": [ + { + "description": "Request body to render", + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/MarkdownRender" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/org/{org}/repos": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Create a repository in an organization", + "operationId": "createOrgRepo", + "parameters": [ + { + "type": "string", + "description": "name of organization", + "name": "org", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateRepoOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Repository" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/orgs/{org}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Get an organization", + "operationId": "orgGet", + "parameters": [ + { + "type": "string", + "description": "name of the organization to get", + "name": "org", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Organization" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Edit an organization", + "operationId": "orgEdit", + "parameters": [ + { + "type": "string", + "description": "name of the organization to edit", + "name": "org", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditOrgOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Organization" + } + } + } + }, + "/orgs/{org}/hooks": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List an organization's webhooks", + "operationId": "orgListHooks", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/HookList" + } + } + } + }, + "/orgs/{org}/hooks/": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Create a hook", + "operationId": "orgCreateHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "$ref": "#/responses/Hook" + } + } + } + }, + "/orgs/{org}/hooks/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Get a hook", + "operationId": "orgGetHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Hook" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Delete a hook", + "operationId": "orgDeleteHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Update a hook", + "operationId": "orgEditHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to update", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Hook" + } + } + } + }, + "/orgs/{org}/members": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List an organization's members", + "operationId": "orgListMembers", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/orgs/{org}/members/{username}": { + "get": { + "tags": [ + "organization" + ], + "summary": "Check if a user is a member of an organization", + "operationId": "orgIsMember", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "user is a member", + "schema": { + "$ref": "#/responses/empty" + } + }, + "404": { + "description": "user is not a member", + "schema": { + "$ref": "#/responses/empty" + } + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Remove a member from an organization", + "operationId": "orgDeleteMember", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "member removed", + "schema": { + "$ref": "#/responses/empty" + } + } + } + } + }, + "/orgs/{org}/public_members": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List an organization's public members", + "operationId": "orgListPublicMembers", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/orgs/{org}/public_members/{username}": { + "get": { + "tags": [ + "organization" + ], + "summary": "Check if a user is a public member of an organization", + "operationId": "orgIsPublicMember", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "user is a public member", + "schema": { + "$ref": "#/responses/empty" + } + }, + "404": { + "description": "user is not a public member", + "schema": { + "$ref": "#/responses/empty" + } + } + } + }, + "put": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Publicize a user's membership", + "operationId": "orgPublicizeMember", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "membership publicized", + "schema": { + "$ref": "#/responses/empty" + } + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Conceal a user's membership", + "operationId": "orgConcealMember", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/orgs/{org}/repos": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List an organization's repos", + "operationId": "orgListRepos", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + } + }, + "/orgs/{org}/teams": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List an organization's teams", + "operationId": "orgListTeams", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/TeamList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Create a team", + "operationId": "orgCreateTeam", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateTeamOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Team" + } + } + } + }, + "/repos/migrate": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Migrate a remote git repository", + "operationId": "repoMigrate", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/MigrateRepoForm" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Repository" + } + } + } + }, + "/repos/search": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Search for repositories", + "operationId": "repoSearch", + "parameters": [ + { + "type": "string", + "description": "keyword", + "name": "q", + "in": "query" + }, + { + "type": "integer", + "description": "search only for repos that the user with the given id owns or contributes to", + "name": "uid", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results, maximum page size is 50", + "name": "limit", + "in": "query" + }, + { + "type": "string", + "description": "type of repository to search for. Supported values are \"fork\", \"source\", \"mirror\" and \"collaborative\"", + "name": "mode", + "in": "query" + }, + { + "type": "boolean", + "description": "if `uid` is given, search only for repos that the user owns", + "name": "exclusive", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/SearchResults" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a repository", + "operationId": "repoGet", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Repository" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a repository", + "operationId": "repoDelete", + "parameters": [ + { + "type": "string", + "description": "owner of the repo to delete", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to delete", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/repos/{owner}/{repo}/archive/{archive}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get an archive of a repository", + "operationId": "repoGetArchive", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "archive to download, consisting of a git reference and archive", + "name": "archive", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "success" + } + } + } + }, + "/repos/{owner}/{repo}/branches": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repository's branches", + "operationId": "repoListBranches", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/BranchList" + } + } + } + }, + "/repos/{owner}/{repo}/branches/{branch}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repository's branches", + "operationId": "repoGetBranch", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "branch to get", + "name": "branch", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Branch" + } + } + } + }, + "/repos/{owner}/{repo}/collaborators": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repository's collaborators", + "operationId": "repoListCollaborators", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/repos/{owner}/{repo}/collaborators/{collaborator}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Check if a user is a collaborator of a repository", + "operationId": "repoCheckCollaborator", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the collaborator", + "name": "collaborator", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/empty" + } + } + }, + "put": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Add a collaborator to a repository", + "operationId": "repoAddCollaborator", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the collaborator to add", + "name": "collaborator", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/AddCollaboratorOption" + } + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a collaborator from a repository", + "operationId": "repoDeleteCollaborator", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the collaborator to delete", + "name": "collaborator", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/repos/{owner}/{repo}/commits/{ref}/statuses": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a commit's combined status, by branch/tag/commit reference", + "operationId": "repoGetCombinedStatusByRef", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of branch/tag/commit", + "name": "ref", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Status" + } + } + } + }, + "/repos/{owner}/{repo}/editorconfig/{filepath}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get the EditorConfig definitions of a file in a repository", + "operationId": "repoGetEditorConfig", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "filepath of file to get", + "name": "filepath", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "success" + } + } + } + }, + "/repos/{owner}/{repo}/forks": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repository's forks", + "operationId": "listForks", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Fork a repository", + "operationId": "createFork", + "parameters": [ + { + "type": "string", + "description": "owner of the repo to fork", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to fork", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateForkOption" + } + } + ], + "responses": { + "202": { + "$ref": "#/responses/Repository" + } + } + } + }, + "/repos/{owner}/{repo}/hooks": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List the hooks in a repository", + "operationId": "repoListHooks", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/HookList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Create a hook", + "operationId": "repoCreateHook", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateHookOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Hook" + } + } + } + }, + "/repos/{owner}/{repo}/hooks/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a hook", + "operationId": "repoGetHook", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Hook" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a hook in a repository", + "operationId": "repoDeleteHook", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "patch": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Edit a hook in a repository", + "operationId": "repoEditHook", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the hook", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditHookOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Hook" + } + } + } + }, + "/repos/{owner}/{repo}/hooks/{id}/tests": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Test a push webhook", + "operationId": "repoTestHook", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to test", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/repos/{owner}/{repo}/issues": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "List a repository's issues", + "operationId": "issueListIssues", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "whether issue is open or closed", + "name": "state", + "in": "query" + }, + { + "type": "integer", + "description": "page number of requested issues", + "name": "page", + "in": "query" + }, + { + "type": "string", + "description": "search string", + "name": "q", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/IssueList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Create an issue", + "operationId": "issueCreateIssue", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateIssueOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Issue" + } + } + } + }, + "/repos/{owner}/{repo}/issues/comments": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "List all comments in a repository", + "operationId": "issueGetRepoComments", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "if provided, only comments updated since the provided time are returned.", + "name": "string", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/CommentList" + } + } + } + }, + "/repos/{owner}/{repo}/issues/comments/{id}": { + "delete": { + "tags": [ + "issue" + ], + "summary": "Delete a comment", + "operationId": "issueDeleteComment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of comment to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Edit a comment", + "operationId": "issueEditComment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the comment to edit", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditIssueCommentOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Comment" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{id}/times": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "List an issue's tracked times", + "operationId": "issueTrackedTimes", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the issue", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/TrackedTimeList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Add a tracked time to a issue", + "operationId": "issueAddTime", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the issue to add tracked time to", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/AddTimeOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/TrackedTime" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/error" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get an issue", + "operationId": "issueGetIssue", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the issue to get", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Issue" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Edit an issue", + "operationId": "issueEditIssue", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the issue to edit", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditIssueOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Issue" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/comments": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "List all comments on an issue", + "operationId": "issueGetComments", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "if provided, only comments updated since the specified time are returned.", + "name": "string", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/CommentList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Add a comment to an issue", + "operationId": "issueCreateComment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateIssueCommentOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Comment" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/comments/{id}": { + "delete": { + "tags": [ + "issue" + ], + "summary": "Delete a comment", + "operationId": "issueDeleteCommentDeprecated", + "deprecated": true, + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "this parameter is ignored", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of comment to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Edit a comment", + "operationId": "issueEditCommentDeprecated", + "deprecated": true, + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "this parameter is ignored", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the comment to edit", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditIssueCommentOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Comment" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/labels": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get an issue's labels", + "operationId": "issueGetLabels", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/LabelList" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "put": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Replace an issue's labels", + "operationId": "issueReplaceLabels", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/IssueLabelsOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/LabelList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Add a label to an issue", + "operationId": "issueAddLabel", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/IssueLabelsOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/LabelList" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Remove all labels from an issue", + "operationId": "issueClearLabels", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/labels/{id}": { + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Remove a label from an issue", + "operationId": "issueRemoveLabel", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the label to remove", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/repos/{owner}/{repo}/keys": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repository's keys", + "operationId": "repoListKeys", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/DeployKeyList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Add a key to a repository", + "operationId": "repoCreateKey", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateKeyOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/DeployKey" + } + } + } + }, + "/repos/{owner}/{repo}/keys/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a repository's key by id", + "operationId": "repoGetKey", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the key to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/DeployKey" + } + } + }, + "delete": { + "tags": [ + "repository" + ], + "summary": "Delete a key from a repository", + "operationId": "repoDeleteKey", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the key to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/repos/{owner}/{repo}/labels": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get all of a repository's labels", + "operationId": "issueListLabels", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/LabelList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Create a label", + "operationId": "issueCreateLabel", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateLabelOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Label" + } + } + } + }, + "/repos/{owner}/{repo}/labels/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get a single label", + "operationId": "issueGetLabel", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the label to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Label" + } + } + }, + "delete": { + "tags": [ + "issue" + ], + "summary": "Delete a label", + "operationId": "issueDeleteLabel", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the label to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Update a label", + "operationId": "issueEditLabel", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the label to edit", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditLabelOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Label" + } + } + } + }, + "/repos/{owner}/{repo}/milestones": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get all of a repository's milestones", + "operationId": "issueGetMilestonesList", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/MilestoneList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Create a milestone", + "operationId": "issueCreateMilestone", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateMilestoneOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Milestone" + } + } + } + }, + "/repos/{owner}/{repo}/milestones/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get a milestone", + "operationId": "issueGetMilestone", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the milestone", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Milestone" + } + } + }, + "delete": { + "tags": [ + "issue" + ], + "summary": "Delete a milestone", + "operationId": "issueDeleteMilestone", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the milestone to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Update a milestone", + "operationId": "issueEditMilestone", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the milestone", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditMilestoneOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Milestone" + } + } + } + }, + "/repos/{owner}/{repo}/mirror-sync": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Sync a mirrored repository", + "operationId": "repoMirrorSync", + "parameters": [ + { + "type": "string", + "description": "owner of the repo to sync", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to sync", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/empty" + } + } + } + }, + "/repos/{owner}/{repo}/pulls": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repo's pull requests", + "operationId": "repoListPullRequests", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/PullRequestList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Create a pull request", + "operationId": "repoCreatePullRequest", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreatePullRequestOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/PullRequest" + } + } + } + }, + "/repos/{owner}/{repo}/pulls/{index}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a pull request", + "operationId": "repoGetPullRequest", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the pull request to get", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/PullRequest" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Update a pull request", + "operationId": "repoEditPullRequest", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the pull request to edit", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditPullRequestOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/PullRequest" + } + } + } + }, + "/repos/{owner}/{repo}/pulls/{index}/merge": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Check if a pull request has been merged", + "operationId": "repoPullRequestIsMerged", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the pull request", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "pull request has been merged", + "schema": { + "$ref": "#/responses/empty" + } + }, + "404": { + "description": "pull request has not been merged", + "schema": { + "$ref": "#/responses/empty" + } + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Merge a pull request", + "operationId": "repoMergePullRequest", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the pull request to merge", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/empty" + }, + "405": { + "$ref": "#/responses/empty" + } + } + } + }, + "/repos/{owner}/{repo}/raw/{filepath}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a file from a repository", + "operationId": "repoGetRawFile", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "filepath of the file to get", + "name": "filepath", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "success" + } + } + } + }, + "/repos/{owner}/{repo}/releases": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repo's releases", + "operationId": "repoListReleases", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/ReleaseList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Create a release", + "operationId": "repoCreateRelease", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateReleaseOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Release" + } + } + } + }, + "/repos/{owner}/{repo}/releases/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a release", + "operationId": "repoGetRelease", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the release to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Release" + } + } + }, + "delete": { + "tags": [ + "repository" + ], + "summary": "Delete a release", + "operationId": "repoDeleteRelease", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the release to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Update a release", + "operationId": "repoEditRelease", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the release to edit", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditReleaseOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Release" + } + } + } + }, + "/repos/{owner}/{repo}/releases/{id}/assets": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List release's attachments", + "operationId": "repoListReleaseAttachments", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the release", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/AttachmentList" + } + } + }, + "post": { + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Create a release attachment", + "operationId": "repoCreateReleaseAttachment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the release", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the attachment", + "name": "name", + "in": "query" + }, + { + "type": "file", + "description": "attachment to upload", + "name": "attachment", + "in": "formData", + "required": true + } + ], + "responses": { + "201": { + "$ref": "#/responses/Attachment" + } + } + } + }, + "/repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a release attachment", + "operationId": "repoGetReleaseAttachment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the release", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the attachment to get", + "name": "attachment_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Attachment" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a release attachment", + "operationId": "repoDeleteReleaseAttachment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the release", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the attachment to delete", + "name": "attachment_id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Edit a release attachment", + "operationId": "repoEditReleaseAttachment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the release", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the attachment to edit", + "name": "attachment_id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditAttachmentOptions" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Attachment" + } + } + } + }, + "/repos/{owner}/{repo}/stargazers": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repo's stargazers", + "operationId": "repoListStargazers", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/repos/{owner}/{repo}/statuses/{sha}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a commit's statuses", + "operationId": "repoListStatuses", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "sha of the commit", + "name": "sha", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/StatusList" + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Create a commit status", + "operationId": "repoCreateStatus", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "sha of the commit", + "name": "sha", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateStatusOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/StatusList" + } + } + } + }, + "/repos/{owner}/{repo}/subscribers": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repo's watchers", + "operationId": "repoListSubscribers", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/repos/{owner}/{repo}/subscription": { + "get": { + "tags": [ + "repository" + ], + "summary": "Check if the current user is watching a repo", + "operationId": "userCurrentCheckSubscription", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/WatchInfo" + } + } + }, + "put": { + "tags": [ + "repository" + ], + "summary": "Watch a repo", + "operationId": "userCurrentPutSubscription", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/WatchInfo" + } + } + }, + "delete": { + "tags": [ + "repository" + ], + "summary": "Unwatch a repo", + "operationId": "userCurrentDeleteSubscription", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/repos/{owner}/{repo}/times": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repo's tracked times", + "operationId": "repoTrackedTimes", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/TrackedTimeList" + } + } + } + }, + "/repos/{owner}/{repo}/times/{user}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List a user's tracked times in a repo", + "operationId": "userTrackedTimes", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of user", + "name": "user", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/TrackedTimeList" + } + } + } + }, + "/repositories/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a repository by id", + "operationId": "repoGetByID", + "parameters": [ + { + "type": "integer", + "description": "id of the repo to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Repository" + } + } + } + }, + "/teams/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Get a team", + "operationId": "orgGetTeam", + "parameters": [ + { + "type": "integer", + "description": "id of the team to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Team" + } + } + }, + "delete": { + "tags": [ + "organization" + ], + "summary": "Delete a team", + "operationId": "orgDeleteTeam", + "parameters": [ + { + "type": "integer", + "description": "id of the team to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "team deleted", + "schema": { + "$ref": "#/responses/empty" + } + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Edit a team", + "operationId": "orgEditTeam", + "parameters": [ + { + "type": "integer", + "description": "id of the team to edit", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditTeamOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Team" + } + } + } + }, + "/teams/{id}/members": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List a team's members", + "operationId": "orgListTeamMembers", + "parameters": [ + { + "type": "integer", + "description": "id of the team", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/teams/{id}/members/{username}": { + "put": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Add a team member", + "operationId": "orgAddTeamMember", + "parameters": [ + { + "type": "integer", + "description": "id of the team", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the user to add", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Remove a team member", + "operationId": "orgRemoveTeamMember", + "parameters": [ + { + "type": "integer", + "description": "id of the team", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the user to remove", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/teams/{id}/repos": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List a team's repos", + "operationId": "orgListTeamRepos", + "parameters": [ + { + "type": "integer", + "description": "id of the team", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + } + }, + "/teams/{id}/repos/{org}/{repo}": { + "put": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Add a repository to a team", + "operationId": "orgAddTeamRepository", + "parameters": [ + { + "type": "integer", + "description": "id of the team", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "organization that owns the repo to add", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to add", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "delete": { + "description": "This does not delete the repository, it only removes the repository from the team.", + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Remove a repository from a team", + "operationId": "orgRemoveTeamRepository", + "parameters": [ + { + "type": "integer", + "description": "id of the team", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "organization that owns the repo to remove", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to remove", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/topics/search": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "search topics via keyword", + "operationId": "topicSearch", + "parameters": [ + { + "type": "string", + "description": "keywords to search", + "name": "q", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Repository" + } + } + } + }, + "/user": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Get the authenticated user", + "operationId": "userGetCurrent", + "responses": { + "200": { + "$ref": "#/responses/User" + } + } + } + }, + "/user/emails": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the authenticated user's email addresses", + "operationId": "userListEmails", + "responses": { + "200": { + "$ref": "#/responses/EmailList" + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Add email addresses", + "operationId": "userAddEmail", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateEmailOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/EmailList" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Delete email addresses", + "operationId": "userDeleteEmail", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/DeleteEmailOption" + } + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/user/followers": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the authenticated user's followers", + "operationId": "userCurrentListFollowers", + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/user/following": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the users that the authenticated user is following", + "operationId": "userCurrentListFollowing", + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/user/following/{username}": { + "get": { + "tags": [ + "user" + ], + "summary": "Check whether a user is followed by the authenticated user", + "operationId": "userCurrentCheckFollowing", + "parameters": [ + { + "type": "string", + "description": "username of followed user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "put": { + "tags": [ + "user" + ], + "summary": "Follow a user", + "operationId": "userCurrentPutFollow", + "parameters": [ + { + "type": "string", + "description": "username of user to follow", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "delete": { + "tags": [ + "user" + ], + "summary": "Unfollow a user", + "operationId": "userCurrentDeleteFollow", + "parameters": [ + { + "type": "string", + "description": "username of user to unfollow", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/user/gpg_keys": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the authenticated user's GPG keys", + "operationId": "userCurrentListGPGKeys", + "responses": { + "200": { + "$ref": "#/responses/GPGKeyList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Create a GPG key", + "operationId": "userCurrentPostGPGKey", + "parameters": [ + { + "name": "Form", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateGPGKeyOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/GPGKey" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/user/gpg_keys/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Get a GPG key", + "operationId": "userCurrentGetGPGKey", + "parameters": [ + { + "type": "integer", + "description": "id of key to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/GPGKey" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Remove a GPG key", + "operationId": "userCurrentDeleteGPGKey", + "parameters": [ + { + "type": "integer", + "description": "id of key to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/user/keys": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the authenticated user's public keys", + "operationId": "userCurrentListKeys", + "responses": { + "200": { + "$ref": "#/responses/PublicKeyList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Create a public key", + "operationId": "userCurrentPostKey", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateKeyOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/PublicKey" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/user/keys/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Get a public key", + "operationId": "userCurrentGetKey", + "parameters": [ + { + "type": "integer", + "description": "id of key to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/PublicKey" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Delete a public key", + "operationId": "userCurrentDeleteKey", + "parameters": [ + { + "type": "integer", + "description": "id of key to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/user/orgs": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List the current user's organizations", + "operationId": "orgListCurrentUserOrgs", + "responses": { + "200": { + "$ref": "#/responses/OrganizationList" + } + } + } + }, + "/user/repos": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the repos that the authenticated user owns or has access to", + "operationId": "userCurrentListRepos", + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository", + "user" + ], + "summary": "Create a repository", + "operationId": "createCurrentUserRepo", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateRepoOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Repository" + } + } + } + }, + "/user/starred": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "The repos that the authenticated user has starred", + "operationId": "userCurrentListStarred", + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + } + }, + "/user/starred/{owner}/{repo}": { + "get": { + "tags": [ + "user" + ], + "summary": "Whether the authenticated is starring the repo", + "operationId": "userCurrentCheckStarring", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "put": { + "tags": [ + "user" + ], + "summary": "Star the given repo", + "operationId": "userCurrentPutStar", + "parameters": [ + { + "type": "string", + "description": "owner of the repo to star", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to star", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "delete": { + "tags": [ + "user" + ], + "summary": "Unstar the given repo", + "operationId": "userCurrentDeleteStar", + "parameters": [ + { + "type": "string", + "description": "owner of the repo to unstar", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to unstar", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/user/subscriptions": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List repositories watched by the authenticated user", + "operationId": "userCurrentListSubscriptions", + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + } + }, + "/user/times": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the current user's tracked times", + "operationId": "userCurrentTrackedTimes", + "responses": { + "200": { + "$ref": "#/responses/TrackedTimeList" + } + } + } + }, + "/user/{username}/orgs": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List a user's organizations", + "operationId": "orgListUserOrgs", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/OrganizationList" + } + } + } + }, + "/users/search": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Search for users", + "operationId": "userSearch", + "parameters": [ + { + "type": "string", + "description": "keyword", + "name": "q", + "in": "query" + }, + { + "type": "integer", + "description": "maximum number of users to return", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/users/{follower}/following/{followee}": { + "get": { + "tags": [ + "user" + ], + "summary": "Check if one user is following another user", + "operationId": "userCheckFollowing", + "parameters": [ + { + "type": "string", + "description": "username of following user", + "name": "follower", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of followed user", + "name": "followee", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/users/{username}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Get a user", + "operationId": "userGet", + "parameters": [ + { + "type": "string", + "description": "username of user to get", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/User" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/users/{username}/followers": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the given user's followers", + "operationId": "userListFollowers", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/users/{username}/following": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the users that the given user is following", + "operationId": "userListFollowing", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/users/{username}/gpg_keys": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the given user's GPG keys", + "operationId": "userListGPGKeys", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/GPGKeyList" + } + } + } + }, + "/users/{username}/keys": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the given user's public keys", + "operationId": "userListKeys", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/PublicKeyList" + } + } + } + }, + "/users/{username}/repos": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the repos owned by the given user", + "operationId": "userListRepos", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + } + }, + "/users/{username}/starred": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "The repos that the given user has starred", + "operationId": "userListStarred", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + } + }, + "/users/{username}/subscriptions": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the repositories watched by a user", + "operationId": "userListSubscriptions", + "parameters": [ + { + "type": "string", + "description": "username of the user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + } + }, + "/users/{username}/tokens": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the authenticated user's access tokens", + "operationId": "userGetTokens", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/AccessTokenList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Create an access token", + "operationId": "userCreateToken", + "parameters": [ + { + "type": "string", + "x-go-name": "Name", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/AccessToken" + } + } + } + }, + "/users/{username}/tokens/{token}": { + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "delete an access token", + "operationId": "userDeleteAccessToken", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "token to be deleted", + "name": "token", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/version": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "miscellaneous" + ], + "summary": "Returns the version of the Gitea application", + "operationId": "getVersion", + "responses": { + "200": { + "$ref": "#/responses/ServerVersion" + } + } + } + } + }, + "definitions": { + "AddCollaboratorOption": { + "description": "AddCollaboratorOption options when adding a user as a collaborator of a repository", + "type": "object", + "properties": { + "permission": { + "type": "string", + "x-go-name": "Permission" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "AddTimeOption": { + "description": "AddTimeOption options for adding time to an issue", + "type": "object", + "required": [ + "time" + ], + "properties": { + "time": { + "description": "time in seconds", + "type": "integer", + "format": "int64", + "x-go-name": "Time" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "Attachment": { + "description": "Attachment a generic attachment", + "type": "object", + "properties": { + "browser_download_url": { + "type": "string", + "x-go-name": "DownloadURL" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "download_count": { + "type": "integer", + "format": "int64", + "x-go-name": "DownloadCount" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "size": { + "type": "integer", + "format": "int64", + "x-go-name": "Size" + }, + "uuid": { + "type": "string", + "x-go-name": "UUID" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "Branch": { + "description": "Branch represents a repository branch", + "type": "object", + "properties": { + "commit": { + "$ref": "#/definitions/PayloadCommit" + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "Comment": { + "description": "Comment represents a comment on a commit or issue", + "type": "object", + "properties": { + "body": { + "type": "string", + "x-go-name": "Body" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "issue_url": { + "type": "string", + "x-go-name": "IssueURL" + }, + "pull_request_url": { + "type": "string", + "x-go-name": "PRURL" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Updated" + }, + "user": { + "$ref": "#/definitions/User" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "CreateEmailOption": { + "description": "CreateEmailOption options when creating email addresses", + "type": "object", + "properties": { + "emails": { + "description": "email addresses to add", + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Emails" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "CreateForkOption": { + "description": "CreateForkOption options for creating a fork", + "type": "object", + "properties": { + "organization": { + "description": "organization name, if forking into an organization", + "type": "string", + "x-go-name": "Organization" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "CreateGPGKeyOption": { + "description": "CreateGPGKeyOption options create user GPG key", + "type": "object", + "required": [ + "armored_public_key" + ], + "properties": { + "armored_public_key": { + "description": "An armored GPG key to add", + "type": "string", + "uniqueItems": true, + "x-go-name": "ArmoredKey" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "CreateHookOption": { + "description": "CreateHookOption options when create a hook", + "type": "object", + "required": [ + "type", + "config" + ], + "properties": { + "active": { + "type": "boolean", + "default": false, + "x-go-name": "Active" + }, + "config": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-go-name": "Config" + }, + "events": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Events" + }, + "type": { + "type": "string", + "enum": [ + "gitea", + "gogs", + "slack", + "discord" + ], + "x-go-name": "Type" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "CreateIssueCommentOption": { + "description": "CreateIssueCommentOption options for creating a comment on an issue", + "type": "object", + "required": [ + "body" + ], + "properties": { + "body": { + "type": "string", + "x-go-name": "Body" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "CreateIssueOption": { + "description": "CreateIssueOption options to create one issue", + "type": "object", + "required": [ + "title" + ], + "properties": { + "assignee": { + "description": "username of assignee", + "type": "string", + "x-go-name": "Assignee" + }, + "assignees": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Assignees" + }, + "body": { + "type": "string", + "x-go-name": "Body" + }, + "closed": { + "type": "boolean", + "x-go-name": "Closed" + }, + "due_date": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "labels": { + "description": "list of label ids", + "type": "array", + "items": { + "type": "integer", + "format": "int64" + }, + "x-go-name": "Labels" + }, + "milestone": { + "description": "milestone id", + "type": "integer", + "format": "int64", + "x-go-name": "Milestone" + }, + "title": { + "type": "string", + "x-go-name": "Title" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "CreateKeyOption": { + "description": "CreateKeyOption options when creating a key", + "type": "object", + "required": [ + "title", + "key" + ], + "properties": { + "key": { + "description": "An armored SSH key to add", + "type": "string", + "uniqueItems": true, + "x-go-name": "Key" + }, + "read_only": { + "description": "Describe if the key has only read access or read/write", + "type": "boolean", + "x-go-name": "ReadOnly" + }, + "title": { + "description": "Title of the key to add", + "type": "string", + "uniqueItems": true, + "x-go-name": "Title" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "CreateLabelOption": { + "description": "CreateLabelOption options for creating a label", + "type": "object", + "required": [ + "name", + "color" + ], + "properties": { + "color": { + "type": "string", + "x-go-name": "Color", + "example": "#00aabb" + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "CreateMilestoneOption": { + "description": "CreateMilestoneOption options for creating a milestone", + "type": "object", + "properties": { + "description": { + "type": "string", + "x-go-name": "Description" + }, + "due_on": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "title": { + "type": "string", + "x-go-name": "Title" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "CreateOrgOption": { + "description": "CreateOrgOption options for creating an organization", + "type": "object", + "required": [ + "username" + ], + "properties": { + "description": { + "type": "string", + "x-go-name": "Description" + }, + "full_name": { + "type": "string", + "x-go-name": "FullName" + }, + "location": { + "type": "string", + "x-go-name": "Location" + }, + "username": { + "type": "string", + "x-go-name": "UserName" + }, + "website": { + "type": "string", + "x-go-name": "Website" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "CreatePullRequestOption": { + "description": "CreatePullRequestOption options when creating a pull request", + "type": "object", + "properties": { + "assignee": { + "type": "string", + "x-go-name": "Assignee" + }, + "assignees": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Assignees" + }, + "base": { + "type": "string", + "x-go-name": "Base" + }, + "body": { + "type": "string", + "x-go-name": "Body" + }, + "due_date": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "head": { + "type": "string", + "x-go-name": "Head" + }, + "labels": { + "type": "array", + "items": { + "type": "integer", + "format": "int64" + }, + "x-go-name": "Labels" + }, + "milestone": { + "type": "integer", + "format": "int64", + "x-go-name": "Milestone" + }, + "title": { + "type": "string", + "x-go-name": "Title" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "CreateReleaseOption": { + "description": "CreateReleaseOption options when creating a release", + "type": "object", + "required": [ + "tag_name" + ], + "properties": { + "body": { + "type": "string", + "x-go-name": "Note" + }, + "draft": { + "type": "boolean", + "x-go-name": "IsDraft" + }, + "name": { + "type": "string", + "x-go-name": "Title" + }, + "prerelease": { + "type": "boolean", + "x-go-name": "IsPrerelease" + }, + "tag_name": { + "type": "string", + "x-go-name": "TagName" + }, + "target_commitish": { + "type": "string", + "x-go-name": "Target" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "CreateRepoOption": { + "description": "CreateRepoOption options when creating repository", + "type": "object", + "required": [ + "name" + ], + "properties": { + "auto_init": { + "description": "Whether the repository should be auto-intialized?", + "type": "boolean", + "x-go-name": "AutoInit" + }, + "description": { + "description": "Description of the repository to create", + "type": "string", + "x-go-name": "Description" + }, + "gitignores": { + "description": "Gitignores to use", + "type": "string", + "x-go-name": "Gitignores" + }, + "license": { + "description": "License to use", + "type": "string", + "x-go-name": "License" + }, + "name": { + "description": "Name of the repository to create", + "type": "string", + "uniqueItems": true, + "x-go-name": "Name" + }, + "private": { + "description": "Whether the repository is private", + "type": "boolean", + "x-go-name": "Private" + }, + "readme": { + "description": "Readme of the repository to create", + "type": "string", + "x-go-name": "Readme" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "CreateStatusOption": { + "description": "CreateStatusOption holds the information needed to create a new Status for a Commit", + "type": "object", + "properties": { + "context": { + "type": "string", + "x-go-name": "Context" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "state": { + "$ref": "#/definitions/StatusState" + }, + "target_url": { + "type": "string", + "x-go-name": "TargetURL" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "CreateTeamOption": { + "description": "CreateTeamOption options for creating a team", + "type": "object", + "required": [ + "name" + ], + "properties": { + "description": { + "type": "string", + "x-go-name": "Description" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "permission": { + "type": "string", + "enum": [ + "read", + "write", + "admin" + ], + "x-go-name": "Permission" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "CreateUserOption": { + "description": "CreateUserOption create user options", + "type": "object", + "required": [ + "username", + "email", + "password" + ], + "properties": { + "email": { + "type": "string", + "format": "email", + "x-go-name": "Email" + }, + "full_name": { + "type": "string", + "x-go-name": "FullName" + }, + "login_name": { + "type": "string", + "x-go-name": "LoginName" + }, + "password": { + "type": "string", + "x-go-name": "Password" + }, + "send_notify": { + "type": "boolean", + "x-go-name": "SendNotify" + }, + "source_id": { + "type": "integer", + "format": "int64", + "x-go-name": "SourceID" + }, + "username": { + "type": "string", + "x-go-name": "Username" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "DeleteEmailOption": { + "description": "DeleteEmailOption options when deleting email addresses", + "type": "object", + "properties": { + "emails": { + "description": "email addresses to delete", + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Emails" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "DeployKey": { + "description": "DeployKey a deploy key", + "type": "object", + "properties": { + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "key": { + "type": "string", + "x-go-name": "Key" + }, + "read_only": { + "type": "boolean", + "x-go-name": "ReadOnly" + }, + "title": { + "type": "string", + "x-go-name": "Title" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "EditAttachmentOptions": { + "description": "EditAttachmentOptions options for editing attachments", + "type": "object", + "properties": { + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "EditHookOption": { + "description": "EditHookOption options when modify one hook", + "type": "object", + "properties": { + "active": { + "type": "boolean", + "x-go-name": "Active" + }, + "config": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-go-name": "Config" + }, + "events": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Events" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "EditIssueCommentOption": { + "description": "EditIssueCommentOption options for editing a comment", + "type": "object", + "required": [ + "body" + ], + "properties": { + "body": { + "type": "string", + "x-go-name": "Body" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "EditIssueOption": { + "description": "EditIssueOption options for editing an issue", + "type": "object", + "properties": { + "assignee": { + "type": "string", + "x-go-name": "Assignee" + }, + "assignees": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Assignees" + }, + "body": { + "type": "string", + "x-go-name": "Body" + }, + "due_date": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "milestone": { + "type": "integer", + "format": "int64", + "x-go-name": "Milestone" + }, + "state": { + "type": "string", + "x-go-name": "State" + }, + "title": { + "type": "string", + "x-go-name": "Title" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "EditLabelOption": { + "description": "EditLabelOption options for editing a label", + "type": "object", + "properties": { + "color": { + "type": "string", + "x-go-name": "Color" + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "EditMilestoneOption": { + "description": "EditMilestoneOption options for editing a milestone", + "type": "object", + "properties": { + "description": { + "type": "string", + "x-go-name": "Description" + }, + "due_on": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "state": { + "type": "string", + "x-go-name": "State" + }, + "title": { + "type": "string", + "x-go-name": "Title" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "EditOrgOption": { + "description": "EditOrgOption options for editing an organization", + "type": "object", + "properties": { + "description": { + "type": "string", + "x-go-name": "Description" + }, + "full_name": { + "type": "string", + "x-go-name": "FullName" + }, + "location": { + "type": "string", + "x-go-name": "Location" + }, + "website": { + "type": "string", + "x-go-name": "Website" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "EditPullRequestOption": { + "description": "EditPullRequestOption options when modify pull request", + "type": "object", + "properties": { + "assignee": { + "type": "string", + "x-go-name": "Assignee" + }, + "assignees": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Assignees" + }, + "body": { + "type": "string", + "x-go-name": "Body" + }, + "due_date": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "labels": { + "type": "array", + "items": { + "type": "integer", + "format": "int64" + }, + "x-go-name": "Labels" + }, + "milestone": { + "type": "integer", + "format": "int64", + "x-go-name": "Milestone" + }, + "state": { + "type": "string", + "x-go-name": "State" + }, + "title": { + "type": "string", + "x-go-name": "Title" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "EditReleaseOption": { + "description": "EditReleaseOption options when editing a release", + "type": "object", + "properties": { + "body": { + "type": "string", + "x-go-name": "Note" + }, + "draft": { + "type": "boolean", + "x-go-name": "IsDraft" + }, + "name": { + "type": "string", + "x-go-name": "Title" + }, + "prerelease": { + "type": "boolean", + "x-go-name": "IsPrerelease" + }, + "tag_name": { + "type": "string", + "x-go-name": "TagName" + }, + "target_commitish": { + "type": "string", + "x-go-name": "Target" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "EditTeamOption": { + "description": "EditTeamOption options for editing a team", + "type": "object", + "required": [ + "name" + ], + "properties": { + "description": { + "type": "string", + "x-go-name": "Description" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "permission": { + "type": "string", + "enum": [ + "read", + "write", + "admin" + ], + "x-go-name": "Permission" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "EditUserOption": { + "description": "EditUserOption edit user options", + "type": "object", + "required": [ + "email" + ], + "properties": { + "active": { + "type": "boolean", + "x-go-name": "Active" + }, + "admin": { + "type": "boolean", + "x-go-name": "Admin" + }, + "allow_git_hook": { + "type": "boolean", + "x-go-name": "AllowGitHook" + }, + "allow_import_local": { + "type": "boolean", + "x-go-name": "AllowImportLocal" + }, + "email": { + "type": "string", + "format": "email", + "x-go-name": "Email" + }, + "full_name": { + "type": "string", + "x-go-name": "FullName" + }, + "location": { + "type": "string", + "x-go-name": "Location" + }, + "login_name": { + "type": "string", + "x-go-name": "LoginName" + }, + "max_repo_creation": { + "type": "integer", + "format": "int64", + "x-go-name": "MaxRepoCreation" + }, + "password": { + "type": "string", + "x-go-name": "Password" + }, + "source_id": { + "type": "integer", + "format": "int64", + "x-go-name": "SourceID" + }, + "website": { + "type": "string", + "x-go-name": "Website" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "Email": { + "description": "Email an email address belonging to a user", + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email", + "x-go-name": "Email" + }, + "primary": { + "type": "boolean", + "x-go-name": "Primary" + }, + "verified": { + "type": "boolean", + "x-go-name": "Verified" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "GPGKey": { + "description": "GPGKey a user GPG key to sign commit and tag in repository", + "type": "object", + "properties": { + "can_certify": { + "type": "boolean", + "x-go-name": "CanCertify" + }, + "can_encrypt_comms": { + "type": "boolean", + "x-go-name": "CanEncryptComms" + }, + "can_encrypt_storage": { + "type": "boolean", + "x-go-name": "CanEncryptStorage" + }, + "can_sign": { + "type": "boolean", + "x-go-name": "CanSign" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "emails": { + "type": "array", + "items": { + "$ref": "#/definitions/GPGKeyEmail" + }, + "x-go-name": "Emails" + }, + "expires_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Expires" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "key_id": { + "type": "string", + "x-go-name": "KeyID" + }, + "primary_key_id": { + "type": "string", + "x-go-name": "PrimaryKeyID" + }, + "public_key": { + "type": "string", + "x-go-name": "PublicKey" + }, + "subkeys": { + "type": "array", + "items": { + "$ref": "#/definitions/GPGKey" + }, + "x-go-name": "SubsKey" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "GPGKeyEmail": { + "description": "GPGKeyEmail an email attached to a GPGKey", + "type": "object", + "properties": { + "email": { + "type": "string", + "x-go-name": "Email" + }, + "verified": { + "type": "boolean", + "x-go-name": "Verified" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "Issue": { + "description": "Issue represents an issue in a repository", + "type": "object", + "properties": { + "assignee": { + "$ref": "#/definitions/User" + }, + "assignees": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + }, + "x-go-name": "Assignees" + }, + "body": { + "type": "string", + "x-go-name": "Body" + }, + "closed_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Closed" + }, + "comments": { + "type": "integer", + "format": "int64", + "x-go-name": "Comments" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "due_date": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "labels": { + "type": "array", + "items": { + "$ref": "#/definitions/Label" + }, + "x-go-name": "Labels" + }, + "milestone": { + "$ref": "#/definitions/Milestone" + }, + "number": { + "type": "integer", + "format": "int64", + "x-go-name": "Index" + }, + "pull_request": { + "$ref": "#/definitions/PullRequestMeta" + }, + "state": { + "$ref": "#/definitions/StateType" + }, + "title": { + "type": "string", + "x-go-name": "Title" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Updated" + }, + "url": { + "type": "string", + "x-go-name": "URL" + }, + "user": { + "$ref": "#/definitions/User" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "IssueLabelsOption": { + "description": "IssueLabelsOption a collection of labels", + "type": "object", + "properties": { + "labels": { + "description": "list of label IDs", + "type": "array", + "items": { + "type": "integer", + "format": "int64" + }, + "x-go-name": "Labels" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "Label": { + "description": "Label a label to an issue or a pr", + "type": "object", + "properties": { + "color": { + "type": "string", + "x-go-name": "Color", + "example": "00aabb" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "MarkdownOption": { + "description": "MarkdownOption markdown options", + "type": "object", + "properties": { + "Context": { + "description": "Context to render\n\nin: body", + "type": "string" + }, + "Mode": { + "description": "Mode to render\n\nin: body", + "type": "string" + }, + "Text": { + "description": "Text markdown to render\n\nin: body", + "type": "string" + }, + "Wiki": { + "description": "Is it a wiki page ?\n\nin: body", + "type": "boolean" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "MigrateRepoForm": { + "description": "MigrateRepoForm form for migrating repository", + "type": "object", + "required": [ + "clone_addr", + "uid", + "repo_name" + ], + "properties": { + "auth_password": { + "type": "string", + "x-go-name": "AuthPassword" + }, + "auth_username": { + "type": "string", + "x-go-name": "AuthUsername" + }, + "clone_addr": { + "type": "string", + "x-go-name": "CloneAddr" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "mirror": { + "type": "boolean", + "x-go-name": "Mirror" + }, + "private": { + "type": "boolean", + "x-go-name": "Private" + }, + "repo_name": { + "type": "string", + "x-go-name": "RepoName" + }, + "uid": { + "type": "integer", + "format": "int64", + "x-go-name": "UID" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/auth" + }, + "Milestone": { + "description": "Milestone milestone is a collection of issues on one repository", + "type": "object", + "properties": { + "closed_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Closed" + }, + "closed_issues": { + "type": "integer", + "format": "int64", + "x-go-name": "ClosedIssues" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "due_on": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "open_issues": { + "type": "integer", + "format": "int64", + "x-go-name": "OpenIssues" + }, + "state": { + "$ref": "#/definitions/StateType" + }, + "title": { + "type": "string", + "x-go-name": "Title" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "Organization": { + "description": "Organization represents an organization", + "type": "object", + "properties": { + "avatar_url": { + "type": "string", + "x-go-name": "AvatarURL" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "full_name": { + "type": "string", + "x-go-name": "FullName" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "location": { + "type": "string", + "x-go-name": "Location" + }, + "username": { + "type": "string", + "x-go-name": "UserName" + }, + "website": { + "type": "string", + "x-go-name": "Website" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "PRBranchInfo": { + "description": "PRBranchInfo information about a branch", + "type": "object", + "properties": { + "label": { + "type": "string", + "x-go-name": "Name" + }, + "ref": { + "type": "string", + "x-go-name": "Ref" + }, + "repo": { + "$ref": "#/definitions/Repository" + }, + "repo_id": { + "type": "integer", + "format": "int64", + "x-go-name": "RepoID" + }, + "sha": { + "type": "string", + "x-go-name": "Sha" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "PayloadCommit": { + "description": "PayloadCommit represents a commit", + "type": "object", + "properties": { + "author": { + "$ref": "#/definitions/PayloadUser" + }, + "committer": { + "$ref": "#/definitions/PayloadUser" + }, + "id": { + "description": "sha1 hash of the commit", + "type": "string", + "x-go-name": "ID" + }, + "message": { + "type": "string", + "x-go-name": "Message" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "x-go-name": "Timestamp" + }, + "url": { + "type": "string", + "x-go-name": "URL" + }, + "verification": { + "$ref": "#/definitions/PayloadCommitVerification" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "PayloadCommitVerification": { + "description": "PayloadCommitVerification represents the GPG verification of a commit", + "type": "object", + "properties": { + "payload": { + "type": "string", + "x-go-name": "Payload" + }, + "reason": { + "type": "string", + "x-go-name": "Reason" + }, + "signature": { + "type": "string", + "x-go-name": "Signature" + }, + "verified": { + "type": "boolean", + "x-go-name": "Verified" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "PayloadUser": { + "description": "PayloadUser represents the author or committer of a commit", + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email", + "x-go-name": "Email" + }, + "name": { + "description": "Full name of the commit author", + "type": "string", + "x-go-name": "Name" + }, + "username": { + "type": "string", + "x-go-name": "UserName" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "Permission": { + "description": "Permission represents a set of permissions", + "type": "object", + "properties": { + "admin": { + "type": "boolean", + "x-go-name": "Admin" + }, + "pull": { + "type": "boolean", + "x-go-name": "Pull" + }, + "push": { + "type": "boolean", + "x-go-name": "Push" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "PublicKey": { + "description": "PublicKey publickey is a user key to push code to repository", + "type": "object", + "properties": { + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "fingerprint": { + "type": "string", + "x-go-name": "Fingerprint" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "key": { + "type": "string", + "x-go-name": "Key" + }, + "title": { + "type": "string", + "x-go-name": "Title" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "PullRequest": { + "description": "PullRequest represents a pull request", + "type": "object", + "properties": { + "assignee": { + "$ref": "#/definitions/User" + }, + "assignees": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + }, + "x-go-name": "Assignees" + }, + "base": { + "$ref": "#/definitions/PRBranchInfo" + }, + "body": { + "type": "string", + "x-go-name": "Body" + }, + "closed_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Closed" + }, + "comments": { + "type": "integer", + "format": "int64", + "x-go-name": "Comments" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "diff_url": { + "type": "string", + "x-go-name": "DiffURL" + }, + "due_date": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "head": { + "$ref": "#/definitions/PRBranchInfo" + }, + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "labels": { + "type": "array", + "items": { + "$ref": "#/definitions/Label" + }, + "x-go-name": "Labels" + }, + "merge_base": { + "type": "string", + "x-go-name": "MergeBase" + }, + "merge_commit_sha": { + "type": "string", + "x-go-name": "MergedCommitID" + }, + "mergeable": { + "type": "boolean", + "x-go-name": "Mergeable" + }, + "merged": { + "type": "boolean", + "x-go-name": "HasMerged" + }, + "merged_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Merged" + }, + "merged_by": { + "$ref": "#/definitions/User" + }, + "milestone": { + "$ref": "#/definitions/Milestone" + }, + "number": { + "type": "integer", + "format": "int64", + "x-go-name": "Index" + }, + "patch_url": { + "type": "string", + "x-go-name": "PatchURL" + }, + "state": { + "$ref": "#/definitions/StateType" + }, + "title": { + "type": "string", + "x-go-name": "Title" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Updated" + }, + "url": { + "type": "string", + "x-go-name": "URL" + }, + "user": { + "$ref": "#/definitions/User" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "PullRequestMeta": { + "description": "PullRequestMeta PR info if an issue is a PR", + "type": "object", + "properties": { + "merged": { + "type": "boolean", + "x-go-name": "HasMerged" + }, + "merged_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Merged" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "Release": { + "description": "Release represents a repository release", + "type": "object", + "properties": { + "assets": { + "type": "array", + "items": { + "$ref": "#/definitions/Attachment" + }, + "x-go-name": "Attachments" + }, + "author": { + "$ref": "#/definitions/User" + }, + "body": { + "type": "string", + "x-go-name": "Note" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "CreatedAt" + }, + "draft": { + "type": "boolean", + "x-go-name": "IsDraft" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Title" + }, + "prerelease": { + "type": "boolean", + "x-go-name": "IsPrerelease" + }, + "published_at": { + "type": "string", + "format": "date-time", + "x-go-name": "PublishedAt" + }, + "tag_name": { + "type": "string", + "x-go-name": "TagName" + }, + "tarball_url": { + "type": "string", + "x-go-name": "TarURL" + }, + "target_commitish": { + "type": "string", + "x-go-name": "Target" + }, + "url": { + "type": "string", + "x-go-name": "URL" + }, + "zipball_url": { + "type": "string", + "x-go-name": "ZipURL" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "Repository": { + "description": "Repository represents a repository", + "type": "object", + "properties": { + "clone_url": { + "type": "string", + "x-go-name": "CloneURL" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "default_branch": { + "type": "string", + "x-go-name": "DefaultBranch" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "empty": { + "type": "boolean", + "x-go-name": "Empty" + }, + "fork": { + "type": "boolean", + "x-go-name": "Fork" + }, + "forks_count": { + "type": "integer", + "format": "int64", + "x-go-name": "Forks" + }, + "full_name": { + "type": "string", + "x-go-name": "FullName" + }, + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "mirror": { + "type": "boolean", + "x-go-name": "Mirror" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "open_issues_count": { + "type": "integer", + "format": "int64", + "x-go-name": "OpenIssues" + }, + "owner": { + "$ref": "#/definitions/User" + }, + "parent": { + "$ref": "#/definitions/Repository" + }, + "permissions": { + "$ref": "#/definitions/Permission" + }, + "private": { + "type": "boolean", + "x-go-name": "Private" + }, + "size": { + "type": "integer", + "format": "int64", + "x-go-name": "Size" + }, + "ssh_url": { + "type": "string", + "x-go-name": "SSHURL" + }, + "stars_count": { + "type": "integer", + "format": "int64", + "x-go-name": "Stars" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Updated" + }, + "watchers_count": { + "type": "integer", + "format": "int64", + "x-go-name": "Watchers" + }, + "website": { + "type": "string", + "x-go-name": "Website" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "SearchResults": { + "description": "SearchResults results of a successful search", + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/Repository" + }, + "x-go-name": "Data" + }, + "ok": { + "type": "boolean", + "x-go-name": "OK" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "ServerVersion": { + "description": "ServerVersion wraps the version of the server", + "type": "object", + "properties": { + "version": { + "type": "string", + "x-go-name": "Version" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "StateType": { + "description": "StateType issue state type", + "type": "string", + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "Status": { + "description": "Status holds a single Status of a single Commit", + "type": "object", + "properties": { + "context": { + "type": "string", + "x-go-name": "Context" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "creator": { + "$ref": "#/definitions/User" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "status": { + "$ref": "#/definitions/StatusState" + }, + "target_url": { + "type": "string", + "x-go-name": "TargetURL" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Updated" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "StatusState": { + "description": "StatusState holds the state of a Status\nIt can be \"pending\", \"success\", \"error\", \"failure\", and \"warning\"", + "type": "string", + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "Team": { + "description": "Team represents a team in an organization", + "type": "object", + "properties": { + "description": { + "type": "string", + "x-go-name": "Description" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "permission": { + "type": "string", + "enum": [ + "none", + "read", + "write", + "admin", + "owner" + ], + "x-go-name": "Permission" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "TrackedTime": { + "description": "TrackedTime worked time for an issue / pr", + "type": "object", + "properties": { + "created": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "issue_id": { + "type": "integer", + "format": "int64", + "x-go-name": "IssueID" + }, + "time": { + "description": "Time in seconds", + "type": "integer", + "format": "int64", + "x-go-name": "Time" + }, + "user_id": { + "type": "integer", + "format": "int64", + "x-go-name": "UserID" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "User": { + "description": "User represents a user", + "type": "object", + "properties": { + "avatar_url": { + "description": "URL to the user's avatar", + "type": "string", + "x-go-name": "AvatarURL" + }, + "email": { + "type": "string", + "format": "email", + "x-go-name": "Email" + }, + "full_name": { + "description": "the user's full name", + "type": "string", + "x-go-name": "FullName" + }, + "id": { + "description": "the user's id", + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "language": { + "description": "User locale", + "type": "string", + "x-go-name": "Language" + }, + "login": { + "description": "the user's username", + "type": "string", + "x-go-name": "UserName" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + }, + "WatchInfo": { + "description": "WatchInfo represents an API watch status of one repository", + "type": "object", + "properties": { + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "CreatedAt" + }, + "ignored": { + "type": "boolean", + "x-go-name": "Ignored" + }, + "reason": { + "type": "object", + "x-go-name": "Reason" + }, + "repository_url": { + "type": "string", + "x-go-name": "RepositoryURL" + }, + "subscribed": { + "type": "boolean", + "x-go-name": "Subscribed" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" + } + }, + "responses": { + "AccessToken": { + "description": "AccessToken represents a API access token.", + "headers": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "sha1": { + "type": "string" + } + } + }, + "AccessTokenList": { + "description": "AccessTokenList represents a list of API access token." + }, + "Attachment": { + "description": "Attachment", + "schema": { + "$ref": "#/definitions/Attachment" + } + }, + "AttachmentList": { + "description": "AttachmentList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Attachment" + } + } + }, + "Branch": { + "description": "Branch", + "schema": { + "$ref": "#/definitions/Branch" + } + }, + "BranchList": { + "description": "BranchList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Branch" + } + } + }, + "Comment": { + "description": "Comment", + "schema": { + "$ref": "#/definitions/Comment" + } + }, + "CommentList": { + "description": "CommentList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Comment" + } + } + }, + "DeployKey": { + "description": "DeployKey", + "schema": { + "$ref": "#/definitions/DeployKey" + } + }, + "DeployKeyList": { + "description": "DeployKeyList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/DeployKey" + } + } + }, + "EmailList": { + "description": "EmailList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Email" + } + } + }, + "GPGKey": { + "description": "GPGKey", + "schema": { + "$ref": "#/definitions/GPGKey" + } + }, + "GPGKeyList": { + "description": "GPGKeyList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/GPGKey" + } + } + }, + "Hook": { + "description": "Hook", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Branch" + } + } + }, + "HookList": { + "description": "HookList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Branch" + } + } + }, + "Issue": { + "description": "Issue", + "schema": { + "$ref": "#/definitions/Issue" + } + }, + "IssueList": { + "description": "IssueList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Issue" + } + } + }, + "Label": { + "description": "Label", + "schema": { + "$ref": "#/definitions/Label" + } + }, + "LabelList": { + "description": "LabelList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Label" + } + } + }, + "MarkdownRender": { + "description": "MarkdownRender is a rendered markdown document" + }, + "Milestone": { + "description": "Milestone", + "schema": { + "$ref": "#/definitions/Milestone" + } + }, + "MilestoneList": { + "description": "MilestoneList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Milestone" + } + } + }, + "Organization": { + "description": "Organization", + "schema": { + "$ref": "#/definitions/Organization" + } + }, + "OrganizationList": { + "description": "OrganizationList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Organization" + } + } + }, + "PublicKey": { + "description": "PublicKey", + "schema": { + "$ref": "#/definitions/PublicKey" + } + }, + "PublicKeyList": { + "description": "PublicKeyList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PublicKey" + } + } + }, + "PullRequest": { + "description": "PullRequest", + "schema": { + "$ref": "#/definitions/PullRequest" + } + }, + "PullRequestList": { + "description": "PullRequestList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PullRequest" + } + } + }, + "Release": { + "description": "Release", + "schema": { + "$ref": "#/definitions/Release" + } + }, + "ReleaseList": { + "description": "ReleaseList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Release" + } + } + }, + "Repository": { + "description": "Repository", + "schema": { + "$ref": "#/definitions/Repository" + } + }, + "RepositoryList": { + "description": "RepositoryList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Repository" + } + } + }, + "SearchResults": { + "description": "SearchResults", + "schema": { + "$ref": "#/definitions/SearchResults" + } + }, + "ServerVersion": { + "description": "ServerVersion", + "schema": { + "$ref": "#/definitions/ServerVersion" + } + }, + "Status": { + "description": "Status", + "schema": { + "$ref": "#/definitions/Status" + } + }, + "StatusList": { + "description": "StatusList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Status" + } + } + }, + "Team": { + "description": "Team", + "schema": { + "$ref": "#/definitions/Team" + } + }, + "TeamList": { + "description": "TeamList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Team" + } + } + }, + "TrackedTime": { + "description": "TrackedTime", + "schema": { + "$ref": "#/definitions/TrackedTime" + } + }, + "TrackedTimeList": { + "description": "TrackedTimeList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TrackedTime" + } + } + }, + "User": { + "description": "User", + "schema": { + "$ref": "#/definitions/User" + } + }, + "UserList": { + "description": "UserList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + } + } + }, + "WatchInfo": { + "description": "WatchInfo", + "schema": { + "$ref": "#/definitions/WatchInfo" + } + }, + "empty": { + "description": "APIEmpty is an empty response" + }, + "error": { + "description": "APIError is error format response", + "headers": { + "message": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "forbidden": { + "description": "APIForbiddenError is a forbidden error response", + "headers": { + "message": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "notFound": { + "description": "APINotFound is a not found empty response" + }, + "parameterBodies": { + "description": "parameterBodies", + "schema": { + "$ref": "#/definitions/EditAttachmentOptions" + } + }, + "redirect": { + "description": "APIRedirect is a redirect response" + }, + "validationError": { + "description": "APIValidationError is error format response related to input validation", + "headers": { + "message": { + "type": "string" + }, + "url": { + "type": "string" + } + } + } + }, + "securityDefinitions": { + "AccessToken": { + "type": "apiKey", + "name": "access_token", + "in": "query" + }, + "AuthorizationHeaderToken": { + "type": "apiKey", + "name": "Authorization", + "in": "header" + }, + "BasicAuth": { + "type": "basic" + }, + "Token": { + "type": "apiKey", + "name": "token", + "in": "query" + } + }, + "security": [ + { + "BasicAuth": [] + }, + { + "Token": [] + }, + { + "AccessToken": [] + }, + { + "AuthorizationHeaderToken": [] + } + ] +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/bugs/1621/definitions.yaml b/vendor/github.com/go-openapi/spec/fixtures/bugs/1621/definitions.yaml new file mode 100644 index 0000000000..dcd4cf01d1 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/bugs/1621/definitions.yaml @@ -0,0 +1,618 @@ +definitions: + + # Generic response model + V4GenericResponse: + type: object + properties: + message: + type: string + description: A human readable message + code: + type: string + description: | + A machine readable [response code](https://github.com/giantswarm/api-spec/blob/master/details/RESPONSE_CODES.md) like e. g. `INVALID_CREDENTIALS` + + # Info resposne + V4InfoResponse: + type: object + properties: + general: + description: General information + type: object + properties: + installation_name: + description: Unique name of the installation + type: string + provider: + description: The technical provider used in this installation. Either "kvm", "aws", or "azure". + type: string + datacenter: + description: Identifier of the datacenter or cloud provider region, e. g. "eu-west-1" + type: string + workers: + description: Information related to worker nodes + type: object + properties: + count_per_cluster: + description: Number of workers per cluster + type: object + properties: + max: + description: Maximum number of worker a cluster can have + type: number + default: + description: Default number of workers in a new cluster will have, if not specifiec otherwise + type: number + instance_type: + description: Instance types to be used for worker nodes. Only available for AWS clusters. + type: object + properties: + options: + description: List of available instance types + type: array + items: + type: string + default: + description: The instance type used in new cluster, if not specified + type: string + vm_size: + description: Azure Virtual Machine size to be used for worker nodes. Only available for Azure clusters. + type: object + properties: + options: + description: List of available instance types + type: array + items: + type: string + default: + description: The instance type used in new cluster, if not specified + type: string + + # Request to create a new cluster + V4AddClusterRequest: + type: object + required: + - owner + description: Request model for creating a new cluster + properties: + owner: + type: string + description: Name of the organization owning the cluster + name: + type: string + description: Cluster name + release_version: + type: string + description: | + The [release](https://docs.giantswarm.io/api/#tag/releases) version + to use in the new cluster + kubernetes_version: + type: string + description: | + Kubernetes version number (deprecated). Doesn't have any effect. + This attribute is going to be removed in future API versions. + workers: + type: array + items: + $ref: '#/definitions/V4NodeDefinition' + + V4ModifyClusterRequest: + type: object + required: [] + description: Request body for cluster modification + properties: + name: + type: string + description: Name for the cluster + owner: + type: string + description: Name of the organization owning the cluster + release_version: + type: string + description: Release version to use after an upgrade + workers: + type: array + description: Worker node array + items: + $ref: '#/definitions/V4NodeDefinition' + + # Details on existing cluster + V4ClusterDetailsResponse: + type: object + description: Response model showing details of a cluster + properties: + id: + type: string + description: Unique cluster identifier + api_endpoint: + type: string + description: URI of the Kubernetes API endpoint + create_date: + type: string + description: Date/time of cluster creation + owner: + type: string + description: Name of the organization owning the cluster + name: + type: string + description: Cluster name + release_version: + type: string + description: | + The [release](https://docs.giantswarm.io/api/#tag/releases) version + currently running this cluster. + kubernetes_version: + type: string + description: Deprecated. Will be removed in a future API version. + workers: + type: array + items: + $ref: '#/definitions/V4NodeDefinition' + kvm: + type: object + description: Attributes specific to clusters running on KVM (on-prem) installations. + properties: + port_mappings: + type: array + description: | + Reveals the ports on the host cluster that are mapped to this guest cluster's ingress + and which protocol that port supports. Only shown and relevant on our on-prem KVM clusters. + items: + type: object + properties: + port: + description: | + The port on the host cluster that will forward traffic to the guest cluster + type: integer + protocol: + description: | + The protocol this port mapping is made for. + type: string + + # Definition of a cluster node + V4NodeDefinition: + type: object + properties: + aws: + type: object + description: | + Attributes specific to nodes running on Amazon Web Services (AWS) + properties: + instance_type: + type: string + description: | + EC2 instance type name. Must be the same for all worker nodes + of a cluster. + azure: + type: object + description: | + Attributes specific to nodes running on Microsoft Azure + properties: + vm_size: + type: string + description: | + Azure Virtual Machine size. Must be the same for all worker nodes + of a cluster. + memory: + type: object + properties: + size_gb: + type: number + description: RAM size in GB. Can be an integer or float. + storage: + type: object + properties: + size_gb: + type: number + description: Node storage size in GB. Can be an integer or float. + cpu: + type: object + properties: + cores: + type: integer + description: Number of CPU cores + labels: + type: object + additionalProperties: true + + # List of key pairs + V4GetKeyPairsResponse: + type: array + description: Array of sparse key pair objects + items: + type: object + properties: + id: + type: string + description: Unique identifier of the key pair + description: + type: string + description: Free text information about the key pair + ttl_hours: + type: integer + description: Expiration time (from creation) in hours + create_date: + type: string + description: Date/time of creation + common_name: + type: string + description: The common name of the certificate subject. + certificate_organizations: + type: string + description: The certificate subject's `organization` fields. + + # Add key pair request + V4AddKeyPairRequest: + type: object + required: + - description + properties: + description: + type: string + description: Free text information about the key pair + ttl_hours: + type: integer + format: int32 + description: Expiration time (from creation) in hours + cn_prefix: + type: string + description: The common name prefix of the certificate subject. This only allows characters that are usable in domain names (`a-z`, `0-9`, and `.-`, where `.-` must not occur at either the start or the end). + certificate_organizations: + type: string + description: | + This will set the certificate subject's `organization` fields. + Use a comma seperated list of values. + + V4AddKeyPairResponse: + type: object + properties: + id: + type: string + description: Unique identifier of the key pair + description: + type: string + description: Free text information about the key pair + ttl_hours: + type: integer + description: Expiration time (from creation) in hours + create_date: + type: string + description: Date/time of creation + certificate_authority_data: + type: string + description: PEM-encoded CA certificate of the cluster + client_key_data: + type: string + description: PEM-encoded RSA private key + client_certificate_data: + type: string + description: PEM-encoded certificate + + # cluster metrics + V4GetClusterMetricsResponse: + description: Response for the getClusterMetrics operation + type: object + properties: + workers: + description: Group of metrics regarding workers + type: array + items: + $ref: '#/definitions/V4NodeMetrics' + + V4NodeMetrics: + type: object + properties: + id: + description: String identifying the node + type: string + metrics: + description: Container object for all metrics available for the node + type: object + properties: + container_count: + type: object + properties: + timestamp: + description: Time when the given value has been recorded + type: string + value: + description: The value for the metric. Can be an integer or float. + type: number + pod_count: + type: object + properties: + timestamp: + description: Time when the given value has been recorded + type: string + value: + description: The value for the metric. Can be an integer or float. + type: number + cpu_used: + type: object + properties: + timestamp: + description: Time when the given value has been recorded + type: string + value: + description: The value for the metric. Can be an integer or float. + type: number + ram_free: + type: object + properties: + timestamp: + description: Time when the given value has been recorded + type: string + value: + description: The value for the metric. Can be an integer or float. + type: number + ram_available: + type: object + properties: + timestamp: + description: Time when the given value has been recorded + type: string + value: + description: The value for the metric. Can be an integer or float. + type: number + ram_cached: + type: object + properties: + timestamp: + description: Time when the given value has been recorded + type: string + value: + description: The value for the metric. Can be an integer or float. + type: number + ram_buffers: + type: object + properties: + timestamp: + description: Time when the given value has been recorded + type: string + value: + description: The value for the metric. Can be an integer or float. + type: number + ram_mapped: + type: object + properties: + timestamp: + description: Time when the given value has been recorded + type: string + value: + description: The value for the metric. Can be an integer or float. + type: number + node_storage_used: + type: object + properties: + timestamp: + description: Time when the given value has been recorded + type: string + value: + description: The value for the metric. Can be an integer or float. + type: number + network_rx: + type: object + properties: + timestamp: + description: Time when the given value has been recorded + type: string + value: + description: The value for the metric. Can be an integer or float. + type: number + network_tx: + type: object + properties: + timestamp: + description: Time when the given value has been recorded + type: string + value: + description: The value for the metric. Can be an integer or float. + type: number + resource_cpu_requests: + type: object + properties: + timestamp: + description: Time when the given value has been recorded + type: string + value: + description: The value for the metric. Can be an integer or float. + type: number + resource_cpu_limits: + type: object + properties: + timestamp: + description: Time when the given value has been recorded + type: string + value: + description: The value for the metric. Can be an integer or float. + type: number + resource_ram_requests: + type: object + properties: + timestamp: + description: Time when the given value has been recorded + type: string + value: + description: The value for the metric. Can be an integer or float. + type: number + resource_ram_limits: + type: object + properties: + timestamp: + description: Time when the given value has been recorded + type: string + value: + description: The value for the metric. Can be an integer or float. + type: number + + # a complete organization object + V4Organization: + type: object + properties: + id: + type: string + description: Unique name/identifier of the organization + members: + type: array + description: List of members that belong to this organization + items: + $ref: '#/definitions/V4OrganizationMember' + + # An organization as returned by getOrganizations as an array item + V4OrganizationListItem: + type: object + properties: + id: + type: string + description: Unique name/identifier of the organization + + # A user that belongs to an organization + V4OrganizationMember: + type: object + properties: + email: + type: string + description: Email address of the user + + # One of the users in the array as returned by getUsers + V4UserListItem: + type: object + properties: + email: + type: string + description: Email address of the user + created: + type: string + description: The date and time that this account was created + expiry: + type: string + description: The date and time when this account will expire + + # A cluster array item, as return by getClusters + V4ClusterListItem: + type: object + properties: + id: + type: string + description: Unique cluster identifier + create_date: + type: string + description: Date/time of cluster creation + name: + type: string + description: Cluster name + owner: + type: string + description: Name of the organization owning the cluster + release_version: + type: string + description: The semantic version number of this cluster + + # A cluster array item, as return by getClusters + V4ReleaseListItem: + type: object + required: ["version", "timestamp", "changelog", "components"] + properties: + version: + type: string + description: The semantic version number + timestamp: + type: string + description: Date and time of the release creation + active: + type: boolean + description: | + If true, the version is available for new clusters and cluster + upgrades. Older versions become unavailable and thus have the + value `false` here. + changelog: + description: | + Structured list of changes in this release, in comparison to the + previous version, with respect to the contained components. + type: array + items: + type: object + properties: + component: + type: string + description: | + If the changed item was a component, this attribute is the + name of the component. + description: + type: string + description: Human-friendly description of the change + components: + description: | + List of components and their version contained in the release + type: array + items: + type: object + required: ["name", "version"] + properties: + name: + type: string + description: Name of the component + version: + type: string + description: Version number of the component + + V4CreateUserRequest: + type: object + required: + - password + description: Request model for creating a new user + properties: + password: + type: string + description: A Base64 encoded password + expiry: + type: string + description: The date and time when this account will expire + + V4AddCredentialsRequest: + type: object + required: + - provider + description: Request model for adding a set of credentials + properties: + provider: + type: string + aws: + type: object + description: Credentials specific to an AWS account + required: + - roles + properties: + roles: + type: object + description: IAM roles to assume by certain entities + required: + - awsoperator + - admin + properties: + admin: + type: string + description: ARN of the IAM role to assume by Giant Swarm support staff + awsoperator: + type: string + description: ARN of the IAM role to assume by the software operating clusters + + # A request for an auth token + V4CreateAuthTokenRequest: + type: object + properties: + email: + type: string + description: Your email address + password_base64: + type: string + description: Your password as a base64 encoded string + + # A response to a successful auth token request + V4CreateAuthTokenResponse: + type: object + properties: + auth_token: + type: string + description: The newly created API token + diff --git a/vendor/github.com/go-openapi/spec/fixtures/bugs/1621/fixture-1621.yaml b/vendor/github.com/go-openapi/spec/fixtures/bugs/1621/fixture-1621.yaml new file mode 100644 index 0000000000..5d0b7029e5 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/bugs/1621/fixture-1621.yaml @@ -0,0 +1,1310 @@ +swagger: "2.0" +info: + title: The Giant Swarm API v4 + description: | + This is the documentation for the Giant Swarm API starting at version `v4`. + + For an introduction to Giant Swarm, refer to the [documentation site](https://docs.giantswarm.io/). + + The Giant Swarm API attempts to behave in a __restful__ way. As a developer, you access resources using the `GET` method and, for example, delete them using the same path and the `DELETE` method. + + Accessing resources via GET usually returns all information available about a resource, while collections, like for example the list of all clusters you have access to, only contain a selected few attributes of each member item. + + Some requests, like for example the request to create a new cluster, don't return the resource itself. Instead, the response delivers a standard message body, showing a `code` and a `message` part. The `message` contains information for you or a client's end user. The `code` attribute contains some string (example: `RESOURCE_CREATED`) that is supposed to give you details on the state of the operation, in addition to standard HTTP status codes. This message format is also used in the case of errors. We provide a [list of all response codes](https://github.com/giantswarm/api-spec/blob/master/details/RESPONSE_CODES.md) outside this documentation. + + Feedback on the API as well as this documentation is welcome via `support@giantswarm.io` or on IRC channel [#giantswarm](irc://irc.freenode.org:6667/#giantswarm) on freenode. + + ## Source + + The source of this documentation is available on [GitHub](https://github.com/giantswarm/api-spec). + + termsOfService: https://giantswarm.io/terms/ + version: 4.0.0 + license: + name: Apache 2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html +consumes: + - application/json +produces: + - application/json +tags: + - name: auth tokens + description: | + Auth Tokens are your way of authenticating against this API. You can create one by passing your email and base64 encoded password to the create auth token endpoint. The auth token never expires, in case you want to invalidate it you need to delete it (logout). + - name: clusters + description: | + Clusters are a central resource of the Giant Swarm API. As a user or team using Giant Swarm, you set up Kubernetes clusters to run your own workloads. + + The API currently provides operations to create and delete clusters, as well as list all available clusters and get details on specific clusters. + - name: info + description: Information about the Giant Swarm installation + - name: key pairs + description: A key pair is a unique combination of a X.509 certificate and a private key. Key pairs are used to access the Kubernetes API of a cluster, both using `kubectl` and any standard web browser. + externalDocs: + url: https://docs.giantswarm.io/guides/accessing-services-from-the-outside/ + description: "User guide: Accessing Pods and Services from the Outside" + - name: organizations + description: Organizations are groups of users who own resources like clusters. + - name: users + description: A user represents a person that should have access to the Giant Swarm API. Users can belong to many groups, and are identified by email address. + - name: releases + description: | + A release is a software bundle that constitutes a cluster. + + Releases are identified by their + [semantic version number](http://semver.org/) in the `MAJOR.MINOR.PATCH` + format. + + A release provides _components_, like for example Kubernetes. For each + release the contained components are listed. Changes in components are + detailed in the _changelog_ of a release. +securityDefinitions: + AuthorizationHeaderToken: + description: | + Clients authenticate by passing an auth token via the `Authorization` + header with a value of the format `giantswarm `. Auth tokens can be + obtained using the [createAuthToken](#operation/createAuthToken) + operation. + type: apiKey + name: Authorization + in: header + +security: + - AuthorizationHeaderToken: [] + +paths: + /v4/info/: + get: + operationId: getInfo + tags: + - info + summary: Get information on the installation + description: | + Returns a set of details on the installation. The output varies based + on the provider used in the installation. + + This information is useful for example when creating new cluster, to + prevent creating clusters with more worker nodes than possible. + + ### Example for an AWS-based installation + + ```json + { + "general": { + "installation_name": "shire", + "provider": "aws", + "datacenter": "eu-central-1" + }, + "workers": { + "count_per_cluster": { + "max": 20, + "default": 3 + }, + "instance_type": { + "options": [ + "m3.medium", "m3.large", "m3.xlarge" + ], + "default": "m3.large" + } + } + } + ``` + + ### Example for a KVM-based installation + + ```json + { + "general": { + "installation_name": "isengard", + "provider": "kvm", + "datacenter": "string" + }, + "workers": { + "count_per_cluster": { + "max": 8, + "default": 3 + }, + } + } + ``` + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + responses: + "200": + description: Information + schema: + $ref: "./definitions.yaml#/definitions/V4InfoResponse" + examples: + application/json: + { + "general": { + "installation_name": "shire", + "provider": "aws", + "datacenter": "eu-central-1" + }, + "workers": { + "count_per_cluster": { + "max": 20, + "default": 3 + }, + "instance_type": { + "options": [ + "m3.medium", "m3.large", "m3.xlarge" + ], + "default": "m3.large" + } + } + } + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + default: + description: Error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + + /v4/auth-tokens/: + post: + operationId: createAuthToken + tags: + - auth tokens + summary: Create Auth Token (Login) + description: | + Creates a Auth Token for a given user. Must authenticate with email and password. + parameters: + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + - name: body + in: body + required: true + description: Create Auth Token Request + schema: + $ref: 'definitions.yaml#/definitions/V4CreateAuthTokenRequest' + x-examples: + application/json: + { + "email": "developer@example.com", + "password_base64": "cGFzc3dvcmQ=" + } + responses: + "200": + description: Success + schema: + $ref: "./definitions.yaml#/definitions/V4CreateAuthTokenResponse" + examples: + application/json: + { + "auth_token": "e5239484-2299-41df-b901-d0568db7e3f9" + } + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + + delete: + operationId: deleteAuthToken + tags: + - auth tokens + summary: Delete Auth Token (Logout) + description: | + Deletes the authentication token provided in the Authorization header. This effectively logs you out. + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + responses: + "200": + description: Success + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_DELETED", + "message": "The authentication token has been succesfully deleted." + } + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + + /v4/users/: + get: + operationId: getUsers + tags: + - users + summary: Get users + description: | + Returns a list of all users in the system. Currently this endpoint is only available to users with admin permissions. + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + responses: + "200": + description: Success + schema: + type: array + items: + $ref: "./definitions.yaml#/definitions/V4UserListItem" + examples: + application/json: + [ + {"email": "andy@example.com", "created": "2017-01-15T12:00:00Z", "expiry": "2019-01-15T00:00:00Z"}, + {"email": "bob@example.com", "created": "2017-02-15T12:30:00Z", "expiry": "2020-01-15T00:00:00Z"}, + {"email": "charles@example.com", "created": "2017-03-15T13:00:00Z", "expiry": "2021-01-15T00:00:00Z"} + ] + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + default: + description: Error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + + /v4/user/: + get: + operationId: getCurrentUser + tags: + - users + summary: Get current user + description: | + Returns details about the currently authenticated user + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + responses: + "200": + description: Success + schema: + $ref: "./definitions.yaml#/definitions/V4UserListItem" + examples: + application/json: + {"email": "andy@example.com", "created": "2017-01-15T12:00:00Z", "expiry": "2019-01-15T00:00:00Z"} + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + default: + description: Error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + + /v4/users/{email}/: + get: + operationId: getUser + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + - $ref: "./parameters.yaml#/parameters/UserEmailPathParameter" + tags: + - users + summary: Get user + description: | + Returns details about a specific user + responses: + "200": + description: Success + schema: + $ref: "./definitions.yaml#/definitions/V4UserListItem" + examples: + application/json: + {"email": "andy@example.com", "created": "2017-01-15T12:00:00Z", "expiry": "2019-01-15T00:00:00Z"} + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + "404": + description: User not found + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_NOT_FOUND", + "message": "The user could not be found. (not found: user with email 'bob@example.com' could not be found)" + } + default: + description: Error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + + put: + operationId: createUser + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + - $ref: "./parameters.yaml#/parameters/UserEmailPathParameter" + - name: body + in: body + required: true + description: User account details + schema: + $ref: "./definitions.yaml#/definitions/V4CreateUserRequest" + x-examples: + application/json: + { + "password": "cGFzc3dvcmQ=", + "expiry": "2020-01-01T12:00:00.000Z" + } + tags: + - users + summary: Create user + description: | + Creates a users in the system. Currently this endpoint is only available to users with admin permissions. + responses: + "201": + description: User created + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_CREATED", + "message": "The user with email 'bob@example.com' has been created." + } + "400": + description: User already exists + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_ALREADY_EXISTS", + "message": "The user could not be created. (invalid input: email 'bob@example.com' already exists)" + } + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + default: + description: Error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + + delete: + operationId: deleteUser + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + - $ref: "./parameters.yaml#/parameters/UserEmailPathParameter" + tags: + - users + summary: Delete user + description: | + Deletes a users in the system. Currently this endpoint is only available + to users with admin permissions. + responses: + "200": + description: User deleted + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_DELETED", + "message": "The user with email 'bob@example.com' has been deleted." + } + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + "404": + description: User not found + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_NOT_FOUND", + "message": "The user could not be deleted. (not found: user with email 'bob@example.com' could not be found)" + } + default: + description: Error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + + /v4/clusters/: + get: + operationId: getClusters + tags: + - clusters + summary: Get clusters + description: | + This operation fetches a list of clusters. + + The result depends on the permissions of the user. + A normal user will get all the clusters the user has access + to, via organization membership. + A user with admin permission will receive a list of all existing + clusters. + + The result array items are sparse representations of the cluster objects. + To fetch more details on a cluster, use the [getCluster](#operation/getCluster) + operation. + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + responses: + "200": + description: Success + schema: + type: array + items: + $ref: "./definitions.yaml#/definitions/V4ClusterListItem" + examples: + application/json: + [ + { + "id": "g8s3o", + "create_date": "2017-06-08T12:31:47.215Z", + "name": "Staging Cluster", + "owner": "acme" + }, + { + "id": "3dkr6", + "create_date": "2017-05-22T13:58:02.024Z", + "name": "Test Cluster", + "owner": "testorg" + } + ] + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + default: + description: Error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + post: + operationId: addCluster + tags: + - clusters + summary: Create cluster + description: | + This operation is used to create a new Kubernetes cluster for an + organization. The desired configuration can be specified using the + __cluster definition format__ (see + [external documentation](https://github.com/giantswarm/api-spec/blob/master/details/CLUSTER_DEFINITION.md) + for details). + + The cluster definition format allows to set a number of optional + configuration details, like memory size and number of CPU cores. + However, one attribute is __mandatory__ upon creation: The `owner` + attribute must carry the name of the organization the cluster will + belong to. Note that the acting user must be a member of that + organization in order to create a cluster. + + It is *recommended* to also specify the `name` attribute to give the + cluster a friendly name, like e. g. "Development Cluster". + + Additional definition attributes can be used. Where attributes are + omitted, default configuration values will be applied. For example, if + no `release_version` is specified, the most recent version is used. + + The `workers` attribute, if present, must contain an array of node + definition objects. The number of objects given determines the number + of workers created. + + For example, requesting three worker nodes with default configuration + can be achieved by submitting an array of three empty objects: + + ```"workers": [{}, {}, {}]``` + + For clusters on AWS, note that all worker nodes must use the same instance type. + + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + - name: body + in: body + required: true + description: New cluster definition + schema: + $ref: "./definitions.yaml#/definitions/V4AddClusterRequest" + x-examples: + application/json: + { + "owner": "myteam", + "release_version": "1.4.2", + "name": "Example cluster with 3 default worker nodes", + "workers": [{}, {}, {}] + } + responses: + "201": + description: Cluster created + headers: + Location: + type: string + description: URI to obtain details on the new cluster using the [getCluster](#operation/getCluster) operation + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_CREATED", + "message": "A new cluster has been created with ID 'wqtlq'" + } + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + default: + description: error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + + /v4/clusters/{cluster_id}/: + get: + operationId: getCluster + tags: + - clusters + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + - $ref: "./parameters.yaml#/parameters/ClusterIdPathParameter" + summary: Get cluster details + description: | + This operation allows to obtain all available details on a particular cluster. + responses: + "200": + description: Cluster details + schema: + $ref: "./definitions.yaml#/definitions/V4ClusterDetailsResponse" + examples: + application/json: + { + "id": "wqtlq", + "create_date": "2017-03-03T10:50:45.949270905Z", + "api_endpoint": "https://api.wqtlq.example.com", + "name": "Just a Standard Cluster", + "release_version": "2.5.16", + "kubernetes_version": "", + "owner": "acme", + "workers": [ + { + "memory": {"size_gb": 2.0}, + "storage": {"size_gb": 20.0}, + "cpu": {"cores": 4}, + "labels": { + "beta.kubernetes.io/arch": "amd64", + "beta.kubernetes.io/os": "linux", + "ip": "10.3.11.2", + "kubernetes.io/hostname": "worker-1.x882ofna.k8s.gigantic.io", + "nodetype": "hicpu" + } + }, + { + "memory": {"size_gb": 8.0}, + "storage": {"size_gb": 20.0}, + "cpu": {"cores": 2}, + "labels": { + "beta.kubernetes.io/arch": "amd64", + "beta.kubernetes.io/os": "linux", + "ip": "10.3.62.2", + "kubernetes.io/hostname": "worker-2.x882ofna.k8s.gigantic.io", + "nodetype": "hiram" + } + } + ], + "kvm": { + "port_mappings": [ + { + "port": 30020, + "protocol": "http" + }, + { + "port": 30021, + "protocol": "https" + }, + ] + } + } + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + "404": + description: Cluster not found + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_NOT_FOUND", + "message": "The cluster with ID 'wqtlq' could not be found, or perhaps you do not have access to it. Please make sure the cluster ID is correct, and that you are a member of the organization that it belongs to." + } + default: + description: error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + patch: + operationId: modifyCluster + tags: + - clusters + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + - name: body + in: body + required: true + description: Merge-patch body + schema: + $ref: "./definitions.yaml#/definitions/V4ModifyClusterRequest" + x-examples: + application/merge-patch+json: + { + "name": "New cluster name" + } + - $ref: "./parameters.yaml#/parameters/ClusterIdPathParameter" + summary: Modify cluster + description: | + This operation allows to modify an existing cluster. + + A cluster modification is performed by submitting a `PATCH` request + to the cluster resource (as described in the + [addCluster](#operation/addCluster) and [getCluster](#operation/getCluster)) + in form of a [JSON Patch Merge + (RFC 7386)](https://tools.ietf.org/html/rfc7386). This means, only the + attributes to be modified have to be contained in the request body. + + The following attributes can be modified: + + - `name`: Rename the cluster to something more fitting. + + - `owner`: Changing the owner organization name means to change cluster + ownership from one organization to another. The user performing the + request has to be a member of both organizations. + + - `release_version`: By changing this attribute you can upgrade a + cluster to a newer + [release](https://docs.giantswarm.io/api/#tag/releases). + + - `workers`: By modifying the array of workers, nodes can be added to + increase the cluster's capacity. See details below. + + ### Adding and Removing Worker Nodes (Scaling) + + Adding worker nodes to a cluster or removing worker nodes from a cluster + works by submitting the `workers` attribute, which contains a (sparse) + array of worker node defintions. + + _Sparse_ here means that all configuration details are optional. In the + case that worker nodes are added to a cluster, wherever a configuration + detail is missing, defaults will be applied. See + [Creating a cluster](#operation/addCluster) for details. + + When modifying the cluster resource, you describe the desired state. + For scaling, this means that the worker node array submitted must + contain as many elements as the cluster should have worker nodes. + If your cluster currently has five nodes and you submit a workers + array with four elements, this means that one worker node will be removed. + If your submitted workers array has six elements, this means one will + be added. + + As an example, this request body could be used to scale a cluster to + three worker nodes: + + ```json + { + "workers": [{}, {}, {}] + } + ``` + + If the scaled cluster had four worker nodes before, one would be removed. + If it had two worker nodes before, one with default settings would be + added. + + ### Limitations + + - As of now, existing worker nodes cannot be modified. + - When removing nodes (scaling down), it is not possible to determine + which nodes will be removed. + - On AWS based clusters, all worker nodes must use the same EC2 instance + type (`instance_type` node attribute). By not setting an `instance_type` + when submitting a PATCH request, you ensure that the right instance type + is used automatically. + + responses: + "200": + description: Cluster modified + schema: + $ref: "./definitions.yaml#/definitions/V4ClusterDetailsResponse" + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + "404": + description: Cluster not found + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_NOT_FOUND", + "message": "The cluster with ID 'wqtlq' could not be found, or perhaps you do not have access to it. Please make sure the cluster ID is correct, and that you are a member of the organization that it belongs to." + } + default: + description: error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + delete: + operationId: deleteCluster + tags: + - clusters + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + - $ref: "./parameters.yaml#/parameters/ClusterIdPathParameter" + summary: Delete cluster + description: | + This operation allows to delete a cluster. + + __Caution:__ Deleting a cluster causes the termination of all workloads running on the cluster. Data stored on the worker nodes will be lost. There is no way to undo this operation. + + The response is sent as soon as the request is validated. + At that point, workloads might still be running on the cluster and may be accessible for a little wile, until the cluster is actually deleted. + responses: + "202": + description: Deleting cluster + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_DELETION_STARTED", + "message": "The cluster with ID 'wqtlq' is being deleted." + } + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + "404": + description: Cluster not found + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_NOT_FOUND", + "message": "The cluster with ID 'wqtlq' could not be found, or perhaps you do not have access to it. Please make sure the cluster ID is correct, and that you are a member of the organization that it belongs to." + } + default: + description: error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + + /v4/clusters/{cluster_id}/key-pairs/: + get: + operationId: getKeyPairs + tags: + - key pairs + summary: Get key pairs + description: | + Returns a list of information on all key pairs of a cluster as an array. + + The individual array items contain metadata on the key pairs, but neither the key nor the certificate. These can only be obtained upon creation, using the [addKeypair](#operation/addKeyPair) operation. + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + - $ref: "./parameters.yaml#/parameters/ClusterIdPathParameter" + responses: + "200": + description: Key pairs + schema: + $ref: "./definitions.yaml#/definitions/V4GetKeyPairsResponse" + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + default: + description: error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + post: + operationId: addKeyPair + tags: + - key pairs + summary: Create key pair + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + - $ref: "./parameters.yaml#/parameters/ClusterIdPathParameter" + - name: body + in: body + required: true + description: | + While the `ttl_hours` attribute is optional and will be set to a default value when omitted, the `description` is mandatory. + schema: + $ref: "./definitions.yaml#/definitions/V4AddKeyPairRequest" + x-examples: + application/json: + { + "description": "Admin key pair lasting twelve hours", + "ttl_hours": 12, + "certificate_organizations": "system:masters" + } + description: | + This operation allows to create a new key pair for accessing a specific cluster. + + A key pair consists of an unencrypted private RSA key and an X.509 certificate. In addition, when obtaining a key pair for a cluster, the cluster's certificate authority file (CA certificate) is delivered, which is required by TLS clients to establish trust to the cluster. + + In addition to the credentials itself, a key pair has some metadata like a unique ID, a creation timestamp and a free text `description` that you can use at will, for example to note for whom a key pair has been issued. + + ### Customizing the certificate's subject for K8s RBAC + + It is possible to set the Common Name and Organization fields of the generated certificate's subject. + + - `cn_prefix`: The certificate's common name uses this format: `.user.`. + + `clusterdomain` is specific to your cluster and is not editable. + + The `cn_prefix` however is editable. When left blank it will default + to the email address of the Giant Swarm user that is performing the + create key pair request. + + The common name is used as the username for requests to the Kubernetes API. This allows you + to set up role-based access controls. + + + - `certificate_organizations`: This will set the certificate's `organization` fields. Use a comma separated list of values. + The Kubernetes API will use these values as group memberships. + + __Note:__ The actual credentials coming with the key pair (key, certificate) can only be accessed once, as the result of the `POST` request that triggers their creation. This restriction exists to minimize the risk of credentials being leaked. If you fail to capture the credentials upon creation, you'll have to repeat the creation request. + responses: + "200": + description: Success + schema: + $ref: "./definitions.yaml#/definitions/V4AddKeyPairResponse" + examples: + application/json: + { + "certificate_authority_data": "-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----", + "client_key_data": "-----BEGIN RSA PRIVATE KEY-----...-----END RSA PRIVATE KEY-----", + "client_certificate_data": "-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----", + "create_date": "2016-06-01T12:00:00.000Z", + "description": "Key pair description", + "id": "02:cc:da:f9:fb:ce:c3:e5:e1:f6:27:d8:43:48:0d:37:4a:ee:b9:67", + "ttl_hours": 8640 + } + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + + /v4/organizations/: + get: + operationId: getOrganizations + tags: + - organizations + summary: Get organizations + description: | + This operation allows to fetch a list of organizations the user is a + member of. In the case of an admin user, the result includes all + existing organizations. + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + responses: + "200": + description: Success + schema: + type: array + items: + $ref: "./definitions.yaml#/definitions/V4OrganizationListItem" + examples: + application/json: + [ + {"id": "acme"}, + {"id": "giantswarm"}, + {"id": "testorg"} + ] + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + default: + description: Error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + + /v4/organizations/{organization_id}/: + get: + operationId: getOrganization + tags: + - organizations + summary: Get organization details + description: | + This operation fetches organization details. + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + - $ref: "./parameters.yaml#/parameters/OrganizationIdPathParameter" + responses: + "200": + description: Organization details + schema: + $ref: "./definitions.yaml#/definitions/V4Organization" + examples: + application/json: + { + "id": "acme", + "members": [ + {"email": "user1@example.com"}, + {"email": "user2@example.com"} + ] + } + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + "404": + description: Organization not found + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_NOT_FOUND", + "message": "The organization could not be found. (not found: the organization with id 'acme' could not be found)" + } + default: + description: Error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + put: + operationId: addOrganization + tags: + - organizations + summary: Create an organization + description: | + This operation allows a user to create an organization. + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + - $ref: "./parameters.yaml#/parameters/OrganizationIdPathParameter" + - name: body + in: body + required: true + schema: + $ref: "./definitions.yaml#/definitions/V4Organization" + x-examples: + application/json: + { + "id": "string", + "members": [ + {"email": "myself@example.com"}, + {"email": "colleague@example.com"} + ] + } + responses: + "201": + description: Organization created + schema: + $ref: "./definitions.yaml#/definitions/V4Organization" + examples: + application/json: + { + "id": "acme", + "members": [ + {"email": "user1@example.com"}, + {"email": "user2@example.com"} + ] + } + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + "409": + description: Organization already exists + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_ALREADY_EXISTS", + "message": "The organization could not be created. (org already exists)" + } + default: + description: Error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + patch: + operationId: modifyOrganization + tags: + - organizations + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + - $ref: "./parameters.yaml#/parameters/OrganizationIdPathParameter" + - name: body + in: body + required: true + schema: + type: object + properties: + members: + type: array + description: List of members that belong to this organization + items: + $ref: "./definitions.yaml#/definitions/V4OrganizationMember" + x-examples: + application/merge-patch+json: + { + "members": [{"email": "myself@example.com"}] + } + + summary: Modify organization + description: | + This operation allows you to modify an existing organization. You must be + a member of the organization or an admin in order to use this endpoint. + + The following attributes can be modified: + + - `members`: By modifying the array of members, members can be added to or removed from the organization + + The request body must conform with the [JSON Patch Merge (RFC 7386)](https://tools.ietf.org/html/rfc7386) standard. + Requests have to be sent with the `Content-Type: application/merge-patch+json` header. + + The full request must be valid before it will be executed, currently this + means every member you attempt to add to the organization must actually + exist in the system. If any member you attempt to add is invalid, the entire + patch operation will fail, no members will be added or removed, and an error message + will explain which members in your request are invalid. + responses: + "200": + description: Organization modified + schema: + $ref: "./definitions.yaml#/definitions/V4Organization" + "400": + description: Invalid input + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "INVALID_INPUT", + "message": "The organization could not be modified. (invalid input: user 'invalid-email' does not exist or is invalid)" + } + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + "404": + description: Organization not found + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_NOT_FOUND", + "message": "The organization could not be modified. (not found: the organization with id 'acme' could not be found)" + } + default: + description: error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + delete: + operationId: deleteOrganization + tags: + - organizations + summary: Delete an organization + description: | + This operation allows a user to delete an organization that they are a member of. + Admin users can delete any organization. + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + - $ref: "./parameters.yaml#/parameters/OrganizationIdPathParameter" + responses: + "200": + description: Organization deleted + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_DELETED", + "message": "The organization with ID 'acme' has been deleted." + } + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + "404": + description: Organization not found + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_NOT_FOUND", + "message": "The organization could not be deleted. (not found: the organization with id 'acme' could not be found)" + } + default: + description: Error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + + /v4/organizations/{organization_id}/credentials/: + post: + operationId: addCredentials + tags: + - organizations + summary: Set credentials + description: | + Add a set of credentials to the organization allowing the creation and + operation of clusters within a cloud provider account/subscription. + + The actual type of these credentials depends on the cloud provider the + installation is running on. Currently, only AWS is supported, with + support for Azure being planned for the near future. + + Credentials in an organization are immutable. Each organization can only + have one set of credentials. + + Once credentials have been set for an organization, they are used for + every new cluster that will be created for the organization. + + ### Example request body for AWS + + ```json + { + "provider": "aws", + "aws": { + "roles": { + "admin": "arn:aws:iam::123456789012:role/GiantSwarmAdmin", + "awsoperator": "arn:aws:iam::123456789012:role/GiantSwarmAWSOperator" + } + } + } + ``` + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + - $ref: "./parameters.yaml#/parameters/OrganizationIdPathParameter" + - name: body + in: body + required: true + schema: + $ref: "./definitions.yaml#/definitions/V4AddCredentialsRequest" + x-examples: + application/json: + { + "provider": "aws", + "aws": { + "roles": { + "admin": "arn:aws:iam::123456789012:role/GiantSwarmAdmin", + "awsoperator": "arn:aws:iam::123456789012:role/GiantSwarmAWSOperator" + } + } + } + responses: + "201": + description: Credentials created + headers: + Location: + type: string + description: URI of the new credentials resource + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_CREATED", + "message": "A new set of credentials has been created with ID '5d9h4'" + } + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + "409": + description: Conflict + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "RESOURCE_ALREADY_EXISTS", + "message": "The organisation already has a set of credentials" + } + default: + description: error + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + + /v4/releases/: + get: + operationId: getReleases + tags: + - releases + summary: Get releases + description: | + Lists all releases available for new clusters or for upgrading existing + clusters. Might also serve as an archive to obtain details on older + releases. + parameters: + - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' + - $ref: './parameters.yaml#/parameters/XRequestIDHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' + - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' + responses: + "200": + description: Releases list + schema: + type: array + items: + $ref: "./definitions.yaml#/definitions/V4ReleaseListItem" + examples: + application/json: + [ + { + "version": "1.14.9", + "timestamp": "2017-09-21T08:14:03.37759Z", + "changelog": [ + { + "component": "kubernetes", + "description": "Security fixes" + }, + { + "component": "calico", + "description": "Security fixes" + } + ], + "components": [ + { + "name": "kubernetes", + "version": "1.5.8" + }, + { + "name": "calico", + "version": "0.9.1" + } + ], + "active": false + }, + { + "version": "2.8.4", + "timestamp": "2017-11-11T12:24:56.59969Z", + "changelog": [ + { + "component": "calico", + "description": "Bugfix" + } + ], + "components": [ + { + "name": "kubernetes", + "version": "1.7.3" + }, + { + "name": "calico", + "version": "1.1.1" + } + ], + "active": true + } + ] + "401": + $ref: "./responses.yaml#/responses/V4Generic401Response" + diff --git a/vendor/github.com/go-openapi/spec/fixtures/bugs/1621/parameters.yaml b/vendor/github.com/go-openapi/spec/fixtures/bugs/1621/parameters.yaml new file mode 100644 index 0000000000..de5de08982 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/bugs/1621/parameters.yaml @@ -0,0 +1,61 @@ +parameters: + + RequiredGiantSwarmAuthorizationHeader: + name: Authorization + type: string + in: header + required: true + description: As described in the [authentication](#section/Authentication) section + + ClusterIdPathParameter: + name: cluster_id + in: path + required: true + type: string + description: Cluster ID + + UserEmailPathParameter: + name: email + in: path + required: true + type: string + description: The user's email address + + OrganizationIdPathParameter: + name: organization_id + in: path + required: true + type: string + description: | + An ID for the organization. + This ID must be unique and match this regular + expression: ^[a-z0-9_]{4,30}$ + + XRequestIDHeader: + name: X-Request-ID + in: header + type: string + required: false + description: | + A randomly generated key that can be used to track a request throughout + services of Giant Swarm. + + XGiantSwarmActivityHeader: + name: X-Giant-Swarm-Activity + in: header + type: string + required: false + description: | + Name of an activity to track, like "list-clusters". This allows to + analyze several API requests sent in context and gives an idea on + the purpose. + + XGiantSwarmCmdLineHeader: + name: X-Giant-Swarm-CmdLine + in: header + type: string + required: false + description: | + If activity has been issued by a CLI, this header can contain the + command line + diff --git a/vendor/github.com/go-openapi/spec/fixtures/bugs/1621/responses.yaml b/vendor/github.com/go-openapi/spec/fixtures/bugs/1621/responses.yaml new file mode 100644 index 0000000000..5c0d49c8e2 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/bugs/1621/responses.yaml @@ -0,0 +1,13 @@ +responses: + + V4Generic401Response: + description: Permission denied + schema: + $ref: "./definitions.yaml#/definitions/V4GenericResponse" + examples: + application/json: + { + "code": "PERMISSION_DENIED", + "message": "The requested resource cannot be accessed using the provided authentication details." + } + diff --git a/vendor/github.com/go-openapi/spec/fixtures/bugs/69/dapperbox.json b/vendor/github.com/go-openapi/spec/fixtures/bugs/69/dapperbox.json new file mode 100644 index 0000000000..6a2fbe1c48 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/bugs/69/dapperbox.json @@ -0,0 +1,38329 @@ +{ + "swagger": "2.0", + "info": { + "version": "V2", + "title": "Payroll" + }, + "host": "localhost:9333", + "schemes": [ + "http" + ], + "paths": { + "/api/v2/business/{businessId}/aba": { + "get": { + "tags": [ + "AbaSettings" + ], + "summary": "List ABA Settings", + "description": "Retrieves all the ABA settings associated with the business.\n\nThis operation supports OData queries.", + "operationId": "ABA_GetAbaDetails", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/BusinessAbaModel" + }, + "xml": { + "name": "BusinessAbaModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "AbaSettings" + ], + "summary": "Create ABA Settings Record", + "description": "Creates a new ABA settings record for the business.", + "operationId": "ABA_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "abaDetails", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/BusinessAbaModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/aba/{id}": { + "get": { + "tags": [ + "AbaSettings" + ], + "summary": "Get ABA Settings Record by ID", + "description": "Gets the details for the ABA settings record with the specified ID.", + "operationId": "ABA_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/BusinessAbaModel" + } + } + } + }, + "put": { + "tags": [ + "AbaSettings" + ], + "summary": "Update ABA Settings Record", + "description": "Updates the ABA settings record with the specified ID.", + "operationId": "ABA_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "abaDetails", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/BusinessAbaModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "AbaSettings" + ], + "summary": "Delete ABA Settings Record", + "description": "Deletes the ABA settings record with the specified ID.", + "operationId": "ABA_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/oauth/token": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "OAuth Token", + "description": "See the guide on OAuth2 authentication for more details.", + "operationId": "Token_Post", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "request", + "in": "query", + "required": true, + "type": "object", + "title": "HttpRequestMessage" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/singlesignon": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Single Sign On", + "description": "can either be called via /api/v2/singlesignon or /api/v2/business/singlesignon (which goes to the business controller)", + "operationId": "SingleSignOn_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SingleSignOnRequestModel" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SingleSignOnResponseModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/singlesignon": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Single Sign On", + "description": "can either be called via /api/v2/singlesignon or /api/v2/business/singlesignon (which goes to the business controller)", + "operationId": "SingleSignOn_PostApiV2BusinessByBusinessIdSinglesignon", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SingleSignOnRequestModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SingleSignOnResponseModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/singlesignon": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Single Sign On", + "description": "can either be called via /api/v2/singlesignon or /api/v2/business/singlesignon (which goes to the business controller)", + "operationId": "SingleSignOn_PostApiV2BusinessByBusinessIdEmployeeByEmployeeIdSinglesignon", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SingleSignOnRequestModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SingleSignOnResponseModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/roundingrules": { + "get": { + "tags": [ + "Business" + ], + "summary": "Get Rounding Rules", + "description": "Gets the rounding rules for the business.", + "operationId": "RoundingRules_GetRoundingRules", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/TimesheetRoundingRulesModel" + } + } + } + }, + "post": { + "tags": [ + "Business" + ], + "summary": "Set Rounding Rules", + "description": "Sets the rounding rules for the business.", + "operationId": "RoundingRules_SetRoundingRules", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "roundingRules", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/TimesheetRoundingRulesModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/ato": { + "get": { + "tags": [ + "Business" + ], + "summary": "Get ATO Details", + "description": "Gets the ATO details for the business.", + "operationId": "ATO_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/BusinessAtoSupplierModel" + } + } + } + }, + "post": { + "tags": [ + "Business" + ], + "summary": "Set ATO Details", + "description": "Sets the ATO details for the business.", + "operationId": "ATO_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/BusinessAtoSupplierModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/entitlements": { + "get": { + "tags": [ + "Business" + ], + "summary": "List Entitlements", + "description": "Lists all of the entitlements for the business.", + "operationId": "Entitlements_GetEntitlements", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EntitlementsModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/document": { + "get": { + "tags": [ + "Business" + ], + "summary": "List Business Document Details", + "description": "Lists the details for all of the documents in the business.", + "operationId": "Document_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/DocumentModel" + }, + "xml": { + "name": "DocumentModel", + "wrapped": true + }, + "title": "List" + } + } + } + }, + "post": { + "tags": [ + "Business" + ], + "summary": "Create Business Document", + "description": "Uploads new document(s) for business. The request should be a MIME multipart file upload request.", + "operationId": "Document_Post", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "visibleToAll", + "in": "query", + "required": false, + "type": "boolean", + "default": false, + "title": "Boolean" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/DocumentModel" + }, + "xml": { + "name": "DocumentModel", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/business/{businessId}/document/{id}": { + "get": { + "tags": [ + "Business" + ], + "summary": "Get Business Document Details", + "description": "Gets the details for the specified business document.", + "operationId": "Document_GetApiV2BusinessByBusinessIdDocumentById", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/DocumentModel" + } + } + } + }, + "put": { + "tags": [ + "Business" + ], + "summary": "Update Business Document Permissions", + "description": "Updates permissions for the business document with the specified ID.", + "operationId": "Document_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UpdateDocumentPermissionsModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/DocumentModel" + } + } + } + }, + "delete": { + "tags": [ + "Business" + ], + "summary": "Delete Business Document", + "description": "Deletes the business document with the specified ID.", + "operationId": "Document_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/document/{id}/content": { + "get": { + "tags": [ + "Business" + ], + "summary": "Get Business Document Content", + "description": "Gets the file content for the business document with the specified ID.", + "operationId": "Document_Content", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/DocumentFile" + } + } + } + } + }, + "/api/v2/business": { + "get": { + "tags": [ + "Business" + ], + "summary": "List Businesses", + "description": "Lists all the businesses associated with the current user.\n\nThis operation supports OData queries.", + "operationId": "Business_GetBusinesses", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/BusinessModel" + }, + "xml": { + "name": "BusinessModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "Business" + ], + "summary": "Create New Business", + "description": "Creates a new business.", + "operationId": "Business_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/BusinessModel" + } + }, + { + "name": "setupDefaultData", + "in": "query", + "required": false, + "type": "boolean", + "default": true, + "title": "Boolean" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}": { + "get": { + "tags": [ + "Business" + ], + "summary": "Get Business Details", + "description": "Retrieves the details of the business with the specified ID.", + "operationId": "Business_GetBusiness", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/BusinessModel" + } + } + } + } + }, + "/api/v2/business/externalid": { + "get": { + "tags": [ + "Business" + ], + "summary": "Get Business Details by External ID", + "description": "Retrieves the details of the business with the specified external ID.", + "operationId": "Business_GetBusinessByExternalId", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "externalId", + "in": "query", + "required": true, + "type": "string", + "title": "String" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/BusinessModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/access": { + "get": { + "tags": [ + "Business" + ], + "summary": "List All Business Access Users", + "description": "Lists all of the users with access to this business, as well as the types of access they each have.\n\nThis operation supports OData queries.", + "operationId": "BusinessAccess_GetAll", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/BusinessAccessModel" + }, + "xml": { + "name": "BusinessAccessModel", + "wrapped": true + }, + "title": "IQueryable" + } + } + } + }, + "put": { + "tags": [ + "Business" + ], + "summary": "Update Business Access", + "description": "Updates a user's access to this business.", + "operationId": "BusinessAccess_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "email", + "in": "query", + "required": true, + "type": "string", + "title": "String" + }, + { + "name": "viewModel", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/AccessModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "Business" + ], + "summary": "Assign Business Access", + "description": "Assigns business access to a name/email.", + "operationId": "BusinessAccess_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "viewModel", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateBusinessAccessModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Business" + ], + "summary": "Revoke Business Access", + "description": "Revokes a user's access to the business.", + "operationId": "BusinessAccess_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "email", + "in": "query", + "required": true, + "type": "string", + "title": "String" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/access/user": { + "get": { + "tags": [ + "Business" + ], + "summary": "Get User Business Access", + "description": "Returns the business access assigned to the user with the specified email address.", + "operationId": "BusinessAccess_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "email", + "in": "query", + "required": true, + "type": "string", + "title": "String" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/BusinessAccessModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/deductioncategory": { + "get": { + "tags": [ + "DeductionCategories" + ], + "summary": "List Deduction Categories", + "description": "Lists all the deduction categories for the business.\n\nThis operation supports OData queries.", + "operationId": "DeductionCategory_GetDeductionCategories", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/DeductionCategoryModel" + }, + "xml": { + "name": "DeductionCategoryModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "DeductionCategories" + ], + "summary": "Create Deduction Category", + "description": "Creates a deduction category for the business.", + "operationId": "DeductionCategory_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "deductionCategory", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/DeductionCategoryModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/deductioncategory/{id}": { + "get": { + "tags": [ + "DeductionCategories" + ], + "summary": "Get Deduction Category By ID", + "description": "Gets the deduction category with the specified ID.", + "operationId": "DeductionCategory_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/DeductionCategoryModel" + } + } + } + }, + "put": { + "tags": [ + "DeductionCategories" + ], + "summary": "Update Deduction Category", + "description": "Updates the deduction category with the specified ID.", + "operationId": "DeductionCategory_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "deductionCategory", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/DeductionCategoryModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "DeductionCategories" + ], + "summary": "Delete Deduction Category", + "description": "Deletes the deduction category with the specified ID.", + "operationId": "DeductionCategory_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/worktype": { + "get": { + "tags": [ + "Employee" + ], + "summary": "Get Employee Work Types", + "description": "Lists all the work types for the employee.\n\nThis operation supports OData queries.", + "operationId": "EmployeeWorkType_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/WorkTypeModel" + }, + "xml": { + "name": "WorkTypeModel", + "wrapped": true + }, + "title": "IQueryable" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/image": { + "get": { + "tags": [ + "Employee" + ], + "summary": "Get Employee Profile Image", + "description": "Returns the file content for the employee's current profile image.", + "operationId": "EmployeeProfileImage_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "Employee" + ], + "summary": "Set Employee Profile Image", + "description": "Uploads a new employee profile image. The request should be a MIME multipart file upload request.", + "operationId": "EmployeeProfileImage_Post", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/ProfileImageMetadata" + } + } + } + }, + "delete": { + "tags": [ + "Employee" + ], + "summary": "Delete Employee Profile Image", + "description": "Delete's the employee's profile image.", + "operationId": "EmployeeProfileImage_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/details": { + "get": { + "tags": [ + "Employee" + ], + "summary": "List basic details for employees", + "description": "This endpoint returns a list of employees. The details are a subset of the 'unstructured' employee endpoint.\r\nThis data can be filtered much more efficiently though so if you only need the basic employee details, this endpoint is preferred.\n\nThis operation supports OData queries.", + "operationId": "EmployeeDetails_GetEmployees", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeDetailsModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/details": { + "get": { + "tags": [ + "Employee" + ], + "summary": "Get Employee basic details by ID", + "description": "returns the basic employee details for the specified employee", + "operationId": "EmployeeDetails_GetEmployee", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeDetailsModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/shiftcondition": { + "get": { + "tags": [ + "Employee" + ], + "summary": "Get Employee Shift Conditions", + "description": "Lists all the shift conditions for this employee.\n\nThis operation supports OData queries.", + "operationId": "EmployeeShiftCondition_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/WorkTypeModel" + }, + "xml": { + "name": "WorkTypeModel", + "wrapped": true + }, + "title": "IQueryable" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/unstructured": { + "get": { + "tags": [ + "Employee" + ], + "summary": "List Employees", + "description": "This endpoint returns the unstructured employee details for all matching employees.\r\n

\r\nSee also: List basic details for employees (which is much more efficient if that is all the information that is required)\r\n

\n\nThis operation supports OData queries.", + "operationId": "Employee_GetEmployees", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "filter.payScheduleId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "filter.locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/UnstructuredEmployeeModel" + } + } + } + }, + "post": { + "tags": [ + "Employee" + ], + "summary": "Create or Update Employee", + "description": "If the employee with the specified ID already exists, update it. Otherwise, create a new employee.", + "operationId": "Employee_PostEmployee", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UnstructuredEmployeeModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/unstructured/{employeeId}": { + "get": { + "tags": [ + "Employee" + ], + "summary": "Get Employee By ID", + "description": "Gets the employee with the specified ID.", + "operationId": "Employee_GetEmployeeById", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/UnstructuredEmployeeModel" + } + } + } + }, + "put": { + "tags": [ + "Employee" + ], + "summary": "Update Employee", + "description": "Updates the employee with the specified ID.", + "operationId": "Employee_PutEmployee", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UnstructuredEmployeeModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/unstructured/externalid": { + "get": { + "tags": [ + "Employee" + ], + "summary": "Get Employee By External ID", + "description": "Gets the employee with the specified external ID.", + "operationId": "Employee_GetEmployeeByExternalId", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "externalId", + "in": "query", + "required": true, + "type": "string", + "title": "String" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/UnstructuredEmployeeModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/unstructured/externalreferenceid": { + "get": { + "tags": [ + "Employee" + ], + "summary": "Get Employee By External Reference ID", + "description": "Gets the employee with the specified external reference ID.", + "operationId": "Employee_GetByExternalReferenceId", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "externalReferenceId", + "in": "query", + "required": true, + "type": "string", + "title": "String" + }, + { + "name": "source", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "None", + "Saasu", + "Xero", + "MYOB", + "Deputy", + "EmployeeTimePunch", + "ClickSuper", + "IntegratedTimesheets", + "FileImport", + "FileExport", + "QuickBooks", + "Harmony", + "AwardStore", + "Attache", + "IntegratedRostering", + "ReckonAccounts", + "API", + "MicroPower", + "RosterLive", + "NetSuite", + "Kounta", + "TimeAndAttendanceKiosk", + "DetailedFileExport", + "JonasPremier", + "WageEasy", + "Maestrano", + "WorkZone", + "EmployeePortal", + "RosterTemplate", + "Onboarding", + "Admin", + "WorkZoneClockOnOff" + ], + "title": "ExternalService" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/UnstructuredEmployeeModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}": { + "delete": { + "tags": [ + "Employee" + ], + "summary": "Delete Employee", + "description": "Deletes the employee with the specified ID.", + "operationId": "Employee_DeleteEmployee", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/synctoqbo": { + "post": { + "tags": [ + "Employee" + ], + "summary": "Sync Employee to QBO", + "description": "Syncs an employee record to QBO.", + "operationId": "Employee_SyncEmployeeToQBO", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/activate/{employeeId}": { + "post": { + "tags": [ + "Employee" + ], + "summary": "Activate Employee", + "description": "Activates the employee with the specified ID.", + "operationId": "EmployeeActivate_PostActivate", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/leavebalances": { + "get": { + "tags": [ + "Employee" + ], + "summary": "Get Leave Balances", + "description": "Gets leave balances for this employee.", + "operationId": "LeaveBalances_GetLeaveBalances", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "asAtDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "Nullable" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/LeaveBalanceModel" + }, + "xml": { + "name": "LeaveBalanceModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/notes": { + "get": { + "tags": [ + "Employee" + ], + "summary": "Get Employee Notes", + "description": "Gets the notes for the specified employee.", + "operationId": "Notes_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeNoteModel" + }, + "xml": { + "name": "EmployeeNoteModel", + "wrapped": true + }, + "title": "IList" + } + } + } + }, + "post": { + "tags": [ + "Employee" + ], + "summary": "Set Employee Notes", + "description": "Sets the notes for the specified employee.", + "operationId": "Notes_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateEmployeeNoteModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/payrate": { + "get": { + "tags": [ + "Employee" + ], + "summary": "Get Pay Rates", + "description": "Gets the pay rates for this employee.", + "operationId": "EmployeePayRates_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeePayRateModel" + }, + "xml": { + "name": "EmployeePayRateModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/grantkioskaccess/{employeeId}": { + "post": { + "tags": [ + "Employee" + ], + "summary": "Grant Kiosk Access", + "description": "Grants kiosk access to the specified employee.", + "operationId": "EmployeeKioskAccess_PostGrantKioskAccess", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/revokekioskaccess/{employeeId}": { + "post": { + "tags": [ + "Employee" + ], + "summary": "Revoke Kiosk Access", + "description": "Revokes kiosk access from the specified employee.", + "operationId": "EmployeeKioskAccess_PostRevokeKioskAccess", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/OpeningBalances": { + "get": { + "tags": [ + "Employee" + ], + "summary": "Get Opening Balances", + "description": "Gets the opening balances for this employee.", + "operationId": "OpeningBalances_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/OpeningBalancesEditModel" + } + } + } + }, + "post": { + "tags": [ + "Employee" + ], + "summary": "Set Opening Balances", + "description": "Sets the opening balances for this employee.", + "operationId": "OpeningBalances_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/OpeningBalancesEditModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/access": { + "get": { + "tags": [ + "EmployeeAccess" + ], + "summary": "Get Users With Access to Employee", + "description": "Gets a list of all users with access to this employee.\n\nThis operation supports OData queries.", + "operationId": "EmployeeAccess_GetAll", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeAccessModel" + }, + "xml": { + "name": "EmployeeAccessModel", + "wrapped": true + }, + "title": "IQueryable" + } + } + } + }, + "put": { + "tags": [ + "EmployeeAccess" + ], + "summary": "Update Employee Access Record", + "description": "Updates the employee access record for the specified user.", + "operationId": "EmployeeAccess_UpdateUserAccess", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "email", + "in": "query", + "required": true, + "type": "string", + "title": "String" + }, + { + "name": "viewModel", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/AccessModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "EmployeeAccess" + ], + "summary": "Grant Employee Access", + "description": "Grants a user access to the employee.", + "operationId": "EmployeeAccess_AddEmployeeAccess", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "viewModel", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateEmployeeAccessModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "EmployeeAccess" + ], + "summary": "Revoke Employee Access", + "description": "Revoke a user's access to the employee.", + "operationId": "EmployeeAccess_DeleteEmployeeAccess", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "email", + "in": "query", + "required": true, + "type": "string", + "title": "String" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/access/email": { + "get": { + "tags": [ + "EmployeeAccess" + ], + "summary": "Get Employee Access for User", + "description": "Gets a list of all employees to which the user (specified by email) has access.", + "operationId": "EmployeeAccess_ListEmployeeAccess", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "email", + "in": "query", + "required": true, + "type": "string", + "title": "String" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeAccessModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/bankaccount": { + "get": { + "tags": [ + "EmployeeBankAccount" + ], + "summary": "List Bank Accounts", + "description": "Lists all of the bank accounts for this employee.", + "operationId": "EmployeeBankAccount_List", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/BankAccountModel" + }, + "xml": { + "name": "BankAccountModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "EmployeeBankAccount" + ], + "summary": "Create Bank Account", + "description": "Creates a new bank account for the employee.", + "operationId": "EmployeeBankAccount_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/BankAccountModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SaveBankAccountResponseModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/bankaccount/{bankAccountId}": { + "get": { + "tags": [ + "EmployeeBankAccount" + ], + "summary": "Get Bank Account by ID", + "description": "Gets the bank account for this employee with the specified ID.", + "operationId": "EmployeeBankAccount_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "bankAccountId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/BankAccountModel" + } + } + } + }, + "delete": { + "tags": [ + "EmployeeBankAccount" + ], + "summary": "Delete Bank Account", + "description": "Deletes the employee's bank account with the specified ID.", + "operationId": "EmployeeBankAccount_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "bankAccountId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SaveBankAccountResponseModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/bankaccount/{id}": { + "put": { + "tags": [ + "EmployeeBankAccount" + ], + "summary": "Update Bank Account", + "description": "Updates the employee's bank account with the specified ID.", + "operationId": "EmployeeBankAccount_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/BankAccountModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SaveBankAccountResponseModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/document/{documentId}/timesheet/{id}": { + "post": { + "tags": [ + "EmployeeDocument" + ], + "summary": "Link Employee Document to Timesheet", + "description": "Takes the specified employee document and adds it as an attachment to the timesheet with the specified ID.", + "operationId": "EmployeeDocumentTimesheetLink_CreateLink", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "documentId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "EmployeeDocument" + ], + "summary": "Unlink Employee Document from Timesheet", + "description": "If the specified employee document is attached to the specified timesheet, unattach it.", + "operationId": "EmployeeDocumentTimesheetLink_RemoveLink", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "documentId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/document": { + "get": { + "tags": [ + "EmployeeDocument" + ], + "summary": "List Employee Documents", + "description": "Lists all the documents for this employee.", + "operationId": "EmployeeDocument_List", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeDocumentModel" + }, + "xml": { + "name": "EmployeeDocumentModel", + "wrapped": true + }, + "title": "List" + } + } + } + }, + "put": { + "tags": [ + "EmployeeDocument" + ], + "summary": "Update Employee Document Permissions", + "description": "Updates permissions for the employee document with the specified ID.", + "operationId": "EmployeeDocument_UpdatePermissions", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UpdateEmployeeDocumentPermissionsModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeDocumentModel" + } + } + } + }, + "post": { + "tags": [ + "EmployeeDocument" + ], + "summary": "Create Employee Document", + "description": "Uploads new document(s) for this employee. The request should be a MIME multipart file upload request.", + "operationId": "EmployeeDocument_Upload", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "visible", + "in": "query", + "required": false, + "type": "boolean", + "default": false, + "title": "Boolean" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeDocumentModel" + }, + "xml": { + "name": "EmployeeDocumentModel", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/document/{id}": { + "get": { + "tags": [ + "EmployeeDocument" + ], + "summary": "Get Employee Document Details", + "description": "Gets the details for the employee document with the specified ID.", + "operationId": "EmployeeDocument_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeDocumentModel" + } + } + } + }, + "delete": { + "tags": [ + "EmployeeDocument" + ], + "summary": "Delete Employee Document", + "description": "Deletes the employee document with the specified ID.", + "operationId": "EmployeeDocument_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/document/{id}/content": { + "get": { + "tags": [ + "EmployeeDocument" + ], + "summary": "Get Employee Document Content", + "description": "Get the file content for the employee document with the specified ID.", + "operationId": "EmployeeDocument_Content", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/DocumentFile" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/document/{documentId}/leave/{id}": { + "post": { + "tags": [ + "EmployeeDocument" + ], + "summary": "Link Employee Document to Leave Request", + "description": "Takes the specified employee document and adds it as an attachment to the leave request with the specified ID.", + "operationId": "EmployeeDocumentLeaveLink_CreateLink", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "documentId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "EmployeeDocument" + ], + "summary": "Unlink Employee Document from Leave Request", + "description": "If the specified employee document is attached to the specified leave request, unattach it.", + "operationId": "EmployeeDocumentLeaveLink_RemoveLink", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "documentId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employeeexpensecategory": { + "get": { + "tags": [ + "EmployeeExpenseCategories" + ], + "summary": "List Employee Expense Categories", + "description": "Lists all the employee expense categories for the business.\n\nThis operation supports OData queries.", + "operationId": "EmployeeExpenseCategory_GetEmployeeExpenseCategories", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeExpenseCategoryModel" + }, + "xml": { + "name": "EmployeeExpenseCategoryModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "EmployeeExpenseCategories" + ], + "summary": "Create Employee Expense Category", + "description": "Creates an employee expense category for the business.", + "operationId": "EmployeeExpenseCategory_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeExpenseCategory", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeExpenseCategoryModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employeeexpensecategory/{id}": { + "get": { + "tags": [ + "EmployeeExpenseCategories" + ], + "summary": "Get Employee Expense Category by ID", + "description": "Gets the employee expense category with the specified ID.", + "operationId": "EmployeeExpenseCategory_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeExpenseCategoryModel" + } + } + } + }, + "put": { + "tags": [ + "EmployeeExpenseCategories" + ], + "summary": "Update Employee Expense Category", + "description": "Updates the employee expense category with the specified ID.", + "operationId": "EmployeeExpenseCategory_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeExpenseCategory", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeExpenseCategoryModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "EmployeeExpenseCategories" + ], + "summary": "Delete Employee Expense Category", + "description": "Deletes the employee expense category with the specified ID.", + "operationId": "EmployeeExpenseCategory_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employeeexpensecategory/taxcodes": { + "get": { + "tags": [ + "EmployeeExpenseCategories" + ], + "summary": "Get Tax Codes", + "description": "Gets a list of the business' tax codes.", + "operationId": "EmployeeExpenseCategory_TaxCodes", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/JournalServiceTaxCode" + }, + "xml": { + "name": "JournalServiceTaxCode", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/expenserequest": { + "get": { + "tags": [ + "EmployeeExpenseRequest" + ], + "summary": "List Expense Requests", + "description": "Lists all of the expense requests for this employee.\n\nThis operation supports OData queries.", + "operationId": "ExpenseRequest_GetExpenseRequests", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ExpenseRequestResponseModel" + }, + "xml": { + "name": "ExpenseRequestResponseModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "EmployeeExpenseRequest" + ], + "summary": "Create Expense Request", + "description": "Creates a new expense request for this employee.", + "operationId": "ExpenseRequest_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ExpenseRequestEditModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/expenserequest/{expenseRequestId}": { + "get": { + "tags": [ + "EmployeeExpenseRequest" + ], + "summary": "Get Expense Request by ID", + "description": "Gets the expense request with the specified ID.", + "operationId": "ExpenseRequest_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "expenseRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/ExpenseRequestResponseModel" + } + } + } + }, + "put": { + "tags": [ + "EmployeeExpenseRequest" + ], + "summary": "Update Expense Request", + "description": "Updates the expense request with the specified ID.", + "operationId": "ExpenseRequest_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "expenseRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ExpenseRequestEditModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "EmployeeExpenseRequest" + ], + "summary": "Delete Expense Request", + "description": "Deletes the expense request with the specified ID.", + "operationId": "ExpenseRequest_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "expenseRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/expenserequest/{expenseRequestId}/approve": { + "post": { + "tags": [ + "EmployeeExpenseRequest" + ], + "summary": "Approve Expense Request", + "description": "Approves the expense request with the specified ID.", + "operationId": "ExpenseRequest_Approve", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "expenseRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/expenserequest/{expenseRequestId}/decline": { + "post": { + "tags": [ + "EmployeeExpenseRequest" + ], + "summary": "Decline Expense Request", + "description": "Declines the expense request with the specified ID.", + "operationId": "ExpenseRequest_Decline", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "expenseRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "reason", + "in": "body", + "required": true, + "schema": { + "type": "string", + "title": "String" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/expenserequest/{expenseRequestId}/attachment": { + "put": { + "tags": [ + "EmployeeExpenseRequest" + ], + "summary": "Upload Attachment to Expense Request", + "description": "Uploads an attachment to the expense request with the specified ID. \r\nThe request should be a MIME multipart file upload request.", + "operationId": "ExpenseRequest_UploadAttachment", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "expenseRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "title": "IHttpActionResult" + } + } + } + } + }, + "/api/v2/business/{businessId}/employeegroup": { + "get": { + "tags": [ + "EmployeeGroups" + ], + "summary": "List Employee Groups", + "description": "Lists all the employee groups for the business.\n\nThis operation supports OData queries.", + "operationId": "EmployeeGroup_GetGroups", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeGroupModel" + }, + "xml": { + "name": "EmployeeGroupModel", + "wrapped": true + }, + "title": "IQueryable" + } + } + } + }, + "post": { + "tags": [ + "EmployeeGroups" + ], + "summary": "Create Employee Group", + "description": "Creates a new employee group for the business.", + "operationId": "EmployeeGroup_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeGroup", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeGroupModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employeegroup/{id}": { + "get": { + "tags": [ + "EmployeeGroups" + ], + "summary": "Get Employee Group by ID", + "description": "Gets the employee group with the specified ID.", + "operationId": "EmployeeGroup_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/DetailedEmployeeGroupModel" + } + } + } + }, + "put": { + "tags": [ + "EmployeeGroups" + ], + "summary": "Update Employee Group", + "description": "Updates the specified employee group.", + "operationId": "EmployeeGroup_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeGroup", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeGroupModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "EmployeeGroups" + ], + "summary": "Delete Employee Group", + "description": "Deletes the employee group with the specified ID.", + "operationId": "EmployeeGroup_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/qualification/{qualificationId}/document": { + "get": { + "tags": [ + "EmployeeQualifications" + ], + "summary": "List Documents for Employee Qualification", + "description": "Lists all the documents associated with a specific employee qualification.", + "operationId": "EmployeeQualificationDocument_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "qualificationId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeQualificationDocumentModel" + }, + "xml": { + "name": "EmployeeQualificationDocumentModel", + "wrapped": true + }, + "title": "List" + } + } + } + }, + "post": { + "tags": [ + "EmployeeQualifications" + ], + "summary": "Create Employee Qualification Document", + "description": "Uploads an employee qualification document. Note: the request should be a MIME multipart file upload request.", + "operationId": "EmployeeQualificationDocument_Post", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "qualificationId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "visible", + "in": "query", + "required": false, + "type": "boolean", + "default": false, + "title": "Boolean" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeQualificationDocumentModel" + }, + "xml": { + "name": "EmployeeQualificationDocumentModel", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/qualification/{qualificationId}/document/{id}": { + "get": { + "tags": [ + "EmployeeQualifications" + ], + "summary": "Get Qualification Document by ID", + "description": "Gets the details for a qualification document by ID.", + "operationId": "EmployeeQualificationDocument_GetApiV2BusinessByBusinessIdEmployeeByEmployeeIdQualificationByQualificationIdDocumentById", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "qualificationId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeQualificationDocumentModel" + } + } + } + }, + "delete": { + "tags": [ + "EmployeeQualifications" + ], + "summary": "Delete Employee Qualification Document", + "description": "Deletes a specific employee qualification document.", + "operationId": "EmployeeQualificationDocument_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "qualificationId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/qualification/{qualificationId}/document/{id}/content": { + "get": { + "tags": [ + "EmployeeQualifications" + ], + "summary": "Get Qualification Document File", + "description": "Gets the file for an employee qualification document by ID.", + "operationId": "EmployeeQualificationDocument_Content", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "qualificationId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/DocumentFile" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/qualification": { + "get": { + "tags": [ + "EmployeeQualifications" + ], + "summary": "Get Qualifications for Employee", + "description": "Retrieves the qualification details for a single employee.", + "operationId": "EmployeeQualification_GetQualifications", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeQualificationModel" + }, + "xml": { + "name": "EmployeeQualificationModel", + "wrapped": true + }, + "title": "IQueryable" + } + } + } + }, + "post": { + "tags": [ + "EmployeeQualifications" + ], + "summary": "Add/Update Employee Qualification", + "description": "Adds or updates a qualification for an employee.", + "operationId": "EmployeeQualification_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "qualification", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeQualificationModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "EmployeeQualifications" + ], + "summary": "Delete Employee Qualification", + "description": "Deletes an employee qualification. Denotes that the employee is no longer qualified for the specified qualification.", + "operationId": "EmployeeQualification_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/qualification/{id}": { + "get": { + "tags": [ + "EmployeeQualifications" + ], + "summary": "Get Qualification Details", + "description": "Gets the details for the qualification with a specific ID.", + "operationId": "EmployeeQualification_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeQualificationModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/taxadjustment": { + "get": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "List Employee Tax Adjustments", + "description": "Lists all the recurring employee tax adjustments for the employee", + "operationId": "EmployeeRecurringTaxAdjustment_List", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeRecurringTaxAdjustmentModel" + }, + "xml": { + "name": "EmployeeRecurringTaxAdjustmentModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Create Employee Tax Adjustment", + "description": "Creates a new recurring tax adjustment for the employee.", + "operationId": "EmployeeRecurringTaxAdjustment_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeRecurringTaxAdjustmentModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeRecurringTaxAdjustmentModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/taxadjustment/{id}": { + "get": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Get Employee Tax Adjustment by ID", + "description": "Gets the employee's recurring tax adjustment with the specified ID.", + "operationId": "EmployeeRecurringTaxAdjustment_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeRecurringTaxAdjustmentModel" + } + } + } + }, + "put": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Update Employee Tax Adjustment", + "description": "Updates the employee's recurring tax adjustment with the specified ID.", + "operationId": "EmployeeRecurringTaxAdjustment_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeRecurringTaxAdjustmentModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeRecurringTaxAdjustmentModel" + } + } + } + }, + "delete": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Delete Employee Tax Adjustment", + "description": "Deletes the employee recurring tax adjustment with the specified ID.", + "operationId": "EmployeeRecurringTaxAdjustment_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/superadjustment": { + "get": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "List Employee Super Adjustments", + "description": "Lists all the recurring employee super adjustments for the employee", + "operationId": "EmployeeRecurringSuperAdjustment_List", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeRecurringSuperAdjustmentModel" + }, + "xml": { + "name": "EmployeeRecurringSuperAdjustmentModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Create Employee Super Adjustment", + "description": "Creates a new recurring super adjustment for the employee.", + "operationId": "EmployeeRecurringSuperAdjustment_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeRecurringSuperAdjustmentModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeRecurringSuperAdjustmentModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/superadjustment/{id}": { + "get": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Get Employee Super Adjustment by ID", + "description": "Gets the employee's recurring super adjustment with the specified ID.", + "operationId": "EmployeeRecurringSuperAdjustment_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeRecurringSuperAdjustmentModel" + } + } + } + }, + "put": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Update Employee Super Adjustment", + "description": "Updates the employee's recurring super adjustment with the specified ID.", + "operationId": "EmployeeRecurringSuperAdjustment_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeRecurringSuperAdjustmentModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeRecurringSuperAdjustmentModel" + } + } + } + }, + "delete": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Delete Employee Super Adjustment", + "description": "Deletes the employee recurring super adjustment with the specified ID.", + "operationId": "EmployeeRecurringSuperAdjustment_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/employerliability": { + "get": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "List Employer liabilities", + "description": "Lists all the recurring employer liabilities for the employee", + "operationId": "Employerrecurringliability_List", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployerRecurringLiabilityModel" + }, + "xml": { + "name": "EmployerRecurringLiabilityModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Create Employer liability", + "description": "Creates a new recurring employer liability for the employee.", + "operationId": "Employerrecurringliability_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployerRecurringLiabilityModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployerRecurringLiabilityModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/employerliability/{id}": { + "get": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Get Employer liability by ID", + "description": "Gets the employee's recurring employer liabilities with the specified ID.", + "operationId": "Employerrecurringliability_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployerRecurringLiabilityModel" + } + } + } + }, + "put": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Update Employer liability", + "description": "Updates the employee's recurring employer liability with the specified ID.", + "operationId": "Employerrecurringliability_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployerRecurringLiabilityModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployerRecurringLiabilityModel" + } + } + } + }, + "delete": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Delete Employer liability", + "description": "Deletes the recurring employer liability with the specified ID.", + "operationId": "Employerrecurringliability_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/deduction": { + "get": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "List Employee Deductions", + "description": "Lists all the recurring employee deductions for the employee", + "operationId": "EmployeeRecurringDeduction_List", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeRecurringDeductionModel" + }, + "xml": { + "name": "EmployeeRecurringDeductionModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Create Employee Deduction", + "description": "Creates a new recurring deduction for the employee.", + "operationId": "EmployeeRecurringDeduction_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeRecurringDeductionModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeRecurringDeductionModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/deduction/{id}": { + "get": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Get Employee Deduction by ID", + "description": "Gets the employee's recurring deduction with the specified ID.", + "operationId": "EmployeeRecurringDeduction_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeRecurringDeductionModel" + } + } + } + }, + "put": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Update Employee Deduction", + "description": "Updates the employee's recurring deduction with the specified ID.", + "operationId": "EmployeeRecurringDeduction_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeRecurringDeductionModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeRecurringDeductionModel" + } + } + } + }, + "delete": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Delete Employee Deduction", + "description": "Deletes the employee recurring deduction with the specified ID.", + "operationId": "EmployeeRecurringDeduction_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/expense": { + "get": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "List Employee Expenses", + "description": "Lists all the recurring employee expenses for the employee", + "operationId": "EmployeeRecurringExpense_List", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeRecurringExpenseModel" + }, + "xml": { + "name": "EmployeeRecurringExpenseModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Create Employee Expense", + "description": "Creates a new recurring expense for the employee.", + "operationId": "EmployeeRecurringExpense_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeRecurringExpenseModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeRecurringExpenseModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/expense/{id}": { + "get": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Get Employee Expense by ID", + "description": "Gets the employee's recurring expense with the specified ID.", + "operationId": "EmployeeRecurringExpense_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeRecurringExpenseModel" + } + } + } + }, + "put": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Update Employee Expense", + "description": "Updates the employee's recurring expense with the specified ID.", + "operationId": "EmployeeRecurringExpense_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeRecurringExpenseModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeRecurringExpenseModel" + } + } + } + }, + "delete": { + "tags": [ + "EmployeeRecurringTransactions" + ], + "summary": "Delete Employee Expense", + "description": "Deletes the employee recurring expense with the specified ID.", + "operationId": "EmployeeRecurringExpense_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/superfund": { + "get": { + "tags": [ + "EmployeeSuperFund" + ], + "summary": "List Super Funds", + "description": "Lists all of the super funds for this employee.", + "operationId": "EmployeeSuperFund_List", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/SuperFundModel" + }, + "xml": { + "name": "SuperFundModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "EmployeeSuperFund" + ], + "summary": "Create Super Fund", + "description": "Creates a new super fund for the employee.", + "operationId": "EmployeeSuperFund_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SaveSuperFundModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SaveSuperFundResponseModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/superfund/{superFundId}": { + "get": { + "tags": [ + "EmployeeSuperFund" + ], + "summary": "Get Super Fund by ID", + "description": "Gets the super fund for this employee with the specified ID.", + "operationId": "EmployeeSuperFund_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "superFundId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SuperFundModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/superfund/{id}": { + "put": { + "tags": [ + "EmployeeSuperFund" + ], + "summary": "Update Super Fund", + "description": "Updates the employee's super fund with the specified ID.", + "operationId": "EmployeeSuperFund_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SaveSuperFundModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SaveSuperFundResponseModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/superfund/{superfundId}": { + "delete": { + "tags": [ + "EmployeeSuperFund" + ], + "summary": "Delete Super Fund", + "description": "Deletes the employee's super fund with the specified ID.", + "operationId": "EmployeeSuperFund_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "superfundId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SaveSuperFundResponseModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employerliabilitycategory": { + "get": { + "tags": [ + "EmployerLiabilityCategories" + ], + "summary": "List Employer Liability Categories", + "description": "Lists all the employer liability categories for this business.\n\nThis operation supports OData queries.", + "operationId": "EmployerLiabilityCategory_GetEmployerLiabilityCategories", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployerLiabilityCategoryModel" + }, + "xml": { + "name": "EmployerLiabilityCategoryModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "EmployerLiabilityCategories" + ], + "summary": "Create Employer Liability Category", + "description": "Creates an employer liability category for the business.", + "operationId": "EmployerLiabilityCategory_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employerLiabilityCategory", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployerLiabilityCategoryModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employerliabilitycategory/{id}": { + "get": { + "tags": [ + "EmployerLiabilityCategories" + ], + "summary": "Get Employer Liability Category", + "description": "Gets the employer liability category with the specified ID.", + "operationId": "EmployerLiabilityCategory_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployerLiabilityCategoryModel" + } + } + } + }, + "put": { + "tags": [ + "EmployerLiabilityCategories" + ], + "summary": "Update Employer Liability Category", + "description": "Updates the employer liability category with the specified ID.", + "operationId": "EmployerLiabilityCategory_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employerLiabilityCategory", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployerLiabilityCategoryModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "EmployerLiabilityCategories" + ], + "summary": "Delete Employer Liability Category", + "description": "Deletes the employer liability category with the specified ID.", + "operationId": "EmployerLiabilityCategory_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employingentity": { + "get": { + "tags": [ + "EmployingEntities" + ], + "summary": "List Employing Entities", + "description": "Lists all the employing entities for the business.\n\nThis operation supports OData queries.", + "operationId": "EmployingEntity_GetEmployingEntities", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployingEntityModel" + }, + "xml": { + "name": "EmployingEntityModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "EmployingEntities" + ], + "summary": "Create Employing Entity", + "description": "Creates a new employing entity for the business.", + "operationId": "EmployingEntity_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employingEntity", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployingEntityModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employingentity/{id}": { + "get": { + "tags": [ + "EmployingEntities" + ], + "summary": "Get Employing Entity By ID", + "description": "Gets the employing entity with the specified ID.", + "operationId": "EmployingEntity_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployingEntityModel" + } + } + } + }, + "put": { + "tags": [ + "EmployingEntities" + ], + "summary": "Update Employing Entity", + "description": "Updates the employing entity with the specified ID.", + "operationId": "EmployingEntity_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employingEntity", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployingEntityModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "EmployingEntities" + ], + "summary": "Delete Employing Entity", + "description": "Deletes the employing entity with the specified ID.", + "operationId": "EmployingEntity_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employmentagreement": { + "get": { + "tags": [ + "EmploymentAgreement" + ], + "summary": "List Employment Agreements", + "description": "Lists all of the employment agreements for the business.\n\nThis operation supports OData queries.", + "operationId": "EmploymentAgreement_GetAll", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/BasicEmploymentAgreementModel" + }, + "xml": { + "name": "BasicEmploymentAgreementModel", + "wrapped": true + }, + "title": "IQueryable" + } + } + } + } + }, + "/api/v2/business/{businessId}/employmentagreement/{id}": { + "get": { + "tags": [ + "EmploymentAgreement" + ], + "summary": "Get Employment Agreement by ID", + "description": "Gets the employment agreement with the specified ID.", + "operationId": "EmploymentAgreement_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmploymentAgreementModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employmentagreement/{id}/shiftperiods": { + "post": { + "tags": [ + "EmploymentAgreement" + ], + "summary": "Get Shift Periods", + "description": "Gets all the shift periods for the employment agreement with the specified ID.", + "operationId": "EmploymentAgreement_ShiftPeriods", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/GetShiftPeriodsModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ShiftPeriodModel" + }, + "xml": { + "name": "ShiftPeriodModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/business/{businessId}/employmentagreement/{id}/shiftcosting": { + "post": { + "tags": [ + "EmploymentAgreement" + ], + "summary": "Evaluate Shift Costings", + "description": "Evaluates shift costings for the employment agreement with the specified ID.", + "operationId": "EmploymentAgreement_Evaluate", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ShiftCostingsRequestModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/ShiftCostingsResponseModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/timesheet/shiftperiods": { + "post": { + "tags": [ + "EmploymentAgreement" + ], + "summary": "Get Shift Periods for Employee", + "description": "Gets the shift periods for the specified employee.", + "operationId": "EmploymentAgreement_EmployeeShiftPeriods", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/GetShiftPeriodsModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ShiftPeriodModel" + }, + "xml": { + "name": "ShiftPeriodModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/timesheet/shiftcosting": { + "post": { + "tags": [ + "EmploymentAgreement" + ], + "summary": "Get Shift Costings for Employee", + "description": "Gets the shift costings for the specified employee.", + "operationId": "EmploymentAgreement_EvaluateEmployee", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ShiftCostingsRequestModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/ShiftCostingsResponseModel" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/leave": { + "get": { + "tags": [ + "Ess" + ], + "summary": "List Leave Requests", + "description": "Lists all leave requests for this employee, with optional filters", + "operationId": "EssLeave_LeaveRequests", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "filter.showOtherEmployees", + "in": "query", + "required": false, + "type": "boolean", + "title": "Boolean" + }, + { + "name": "filter.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "Nullable" + }, + { + "name": "filter.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EssLeaveRequestModel" + }, + "xml": { + "name": "EssLeaveRequestModel", + "wrapped": true + }, + "title": "List" + } + } + } + }, + "post": { + "tags": [ + "Ess" + ], + "summary": "Create Leave Request", + "description": "Creates a new leave request for the employee.", + "operationId": "EssLeave_ApplyForLeave", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "leaveApplication", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EssLeaveApplicationModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/leave/{leaveRequestId}": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Leave Request by ID", + "description": "Gets the details for a leave request with the specified ID.", + "operationId": "EssLeave_LeaveRequest", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "leaveRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EssLeaveRequestModel" + } + } + } + }, + "post": { + "tags": [ + "Ess" + ], + "summary": "Update Leave Request", + "description": "Updates the leave request with the specified ID.", + "operationId": "EssLeave_EditLeave", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "leaveRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "leaveApplication", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EssLeaveApplicationModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Ess" + ], + "summary": "Delete Leave Request", + "description": "Deletes the leave request with the specified ID.", + "operationId": "EssLeave_Cancel", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "leaveRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/leave/{leaveRequestId}/attachment": { + "put": { + "tags": [ + "Ess" + ], + "summary": "Upload Attachment to Leave Request", + "description": "Uploads a file as a new employee document, and attaches it to the leave request with the specified ID. \r\nThe request should be a MIME multipart file upload request.", + "operationId": "EssLeave_Upload", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "leaveRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "title": "IHttpActionResult" + } + } + } + }, + "delete": { + "tags": [ + "Ess" + ], + "summary": "Delete Attachment from Leave Request", + "description": "Deletes the attachment on the leave request with the specified ID.", + "operationId": "EssLeave_DeleteAttachment", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "leaveRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/leave/balances": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Leave Balances", + "description": "Gets the leave balances for the employee.", + "operationId": "EssLeave_Balances", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "asAtDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "Nullable" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/LeaveBalanceModel" + }, + "xml": { + "name": "LeaveBalanceModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/leave/leavecategories": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Leave Categories", + "description": "Gets the available leave categories for the employee.", + "operationId": "EssLeave_LeaveCategories", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EssLeaveCategoryModel" + }, + "xml": { + "name": "EssLeaveCategoryModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/leave/estimate": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Estimate Leave Hours", + "description": "Estimates the number of hours of leave required based on date and leave category.", + "operationId": "EssLeave_Estimate", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "filter.leaveCategoryId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "filter.fromDate", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "filter.toDate", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EssLeaveEstimate" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/profileimage": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Employee Profile Image", + "description": "Returns the file content for the employee's current profile image.", + "operationId": "EssProfileImage_GetImage", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "Ess" + ], + "summary": "Set Employee Profile Image", + "description": "Uploads a new employee profile image. The request should be a MIME multipart file upload request.", + "operationId": "EssProfileImage_Post", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/ProfileImageMetadata" + } + } + } + }, + "delete": { + "tags": [ + "Ess" + ], + "summary": "Delete Employee Profile Image", + "description": "Delete's the employee's profile image.", + "operationId": "EssProfileImage_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/details": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Details", + "description": "Gets ESS details for the specified employee.", + "operationId": "EssEmployee_GetDetails", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EssEmployeeDetailsModel" + } + } + } + }, + "post": { + "tags": [ + "Ess" + ], + "summary": "Save Details", + "description": "Saves any employee details that the employee is allowed to set.", + "operationId": "EssEmployee_SaveDetails", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeePartialEditModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/emergencycontacts": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Emergency Contacts", + "description": "Gets emergency contacts for the specified employee.", + "operationId": "EssEmployee_GetEmergencyContacts", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EmployeeEmergencyContactsEditModel" + } + } + } + }, + "post": { + "tags": [ + "Ess" + ], + "summary": "Save Emergency Contacts", + "description": "Saves the employee's emergency contact details.", + "operationId": "EssEmployee_SaveEmergencyContacts", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EmployeeEmergencyContactsEditModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/security/features": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Enabled Features", + "description": "Gets details as to which ESS features are enabled for the business.", + "operationId": "EssEmployee_Features", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/FeaturesModel" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/dashboard": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Dashboard", + "description": "Gets a set of useful information that the employee may need for self service tasks.", + "operationId": "EssEmployee_GetDashboard", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/DashboardModel" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/location": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Locations", + "description": "Gets all the locations for the employee.", + "operationId": "EssEmployee_Locations", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/LocationModel" + }, + "xml": { + "name": "LocationModel", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/satisfaction": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Satisfaction Survey Results", + "description": "Gets satisfaction survey results for the employee", + "operationId": "EssEmployee_GetSatisfactionSurveys", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "Nullable" + }, + { + "name": "toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "Nullable" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EssSatisfactionSurvey" + }, + "xml": { + "name": "EssSatisfactionSurvey", + "wrapped": true + }, + "title": "IList" + } + } + } + }, + "post": { + "tags": [ + "Ess" + ], + "summary": "Submit Satisfaction Survey", + "description": "Submit a satisfaction survey for this employee.", + "operationId": "EssEmployee_SaveSatisfaction", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "survey", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EssSatisfactionSurvey" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/timesheet": { + "get": { + "tags": [ + "Ess" + ], + "summary": "List Timesheets", + "description": "Lists timesheets for the employee.", + "operationId": "EssTimesheet_List", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "filter.fromDate", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "filter.toDate", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EssTimesheetModel" + }, + "xml": { + "name": "EssTimesheetModel", + "wrapped": true + }, + "title": "IList" + } + } + } + }, + "post": { + "tags": [ + "Ess" + ], + "summary": "Submit or Update Timesheet", + "description": "If no ID is specified, create a new timesheet for the employee. \r\nOtherwise, update the timesheet with the specified ID.", + "operationId": "EssTimesheet_Save", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "timesheet", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/TimesheetLineViewModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/timesheet/{timesheetId}": { + "post": { + "tags": [ + "Ess" + ], + "summary": "Edit Timesheet", + "description": "Edits the timesheet with the specified ID.", + "operationId": "EssTimesheet_Edit", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "timesheetId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "timesheet", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/TimesheetLineViewModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Ess" + ], + "summary": "Delete Timesheet", + "description": "Deletes the timesheet with the specified ID.", + "operationId": "EssTimesheet_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "timesheetId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/lookup/title": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Business Titles", + "description": "Gets all the titles for the business.", + "operationId": "EssLookup_Title", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TitleViewModel" + }, + "xml": { + "name": "TitleViewModel", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/lookup/worktype": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Work Types", + "description": "Gets all the work types for the employee.", + "operationId": "EssLookup_WorkType", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/WorkTypeModel" + }, + "xml": { + "name": "WorkTypeModel", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/lookup/shiftcondition": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Shift Conditions", + "description": "Gets all the shift conditions for the employee.", + "operationId": "EssLookup_ShiftCondition", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/WorkTypeModel" + }, + "xml": { + "name": "WorkTypeModel", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/lookup/location": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Locations", + "description": "Gets all the locations for the employee.", + "operationId": "EssLookup_Location", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/LocationModel" + }, + "xml": { + "name": "LocationModel", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/ess/devicetoken/register": { + "post": { + "tags": [ + "Ess" + ], + "summary": "Register Device Token", + "description": "Registers a device token.", + "operationId": "EssDeviceToken_Register", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/DeviceTokenModel" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/devicetoken/unregister": { + "post": { + "tags": [ + "Ess" + ], + "summary": "Unregister Device Token", + "description": "Unregisters a device token.", + "operationId": "EssDeviceToken_Unregister", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/DeviceTokenModel" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/timeandattendance/lookupdata": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Lookup Data", + "description": "Gets relevant lookup data for the employee in relation to a kiosk.", + "operationId": "EssTimeAndAttendance_GetLookupData", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/TimeAndAttendanceLookupDataModel" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/timeandattendance/clockon": { + "post": { + "tags": [ + "Ess" + ], + "summary": "Clock In Employee", + "description": "Clocks in an employee for a new shift.", + "operationId": "EssTimeAndAttendance_ClockOn", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ClockOnModel" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/timeandattendance/clockoff": { + "post": { + "tags": [ + "Ess" + ], + "summary": "Clock Out Employee", + "description": "Clocks out the employee from their existing shift. \r\nIf they are on a break, it will be ended automatically.", + "operationId": "EssTimeAndAttendance_ClockOff", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ClockOffModel" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/timeandattendance/startbreak": { + "post": { + "tags": [ + "Ess" + ], + "summary": "Start Break", + "description": "Starts a break for the employee who is clocked on for a shift.", + "operationId": "EssTimeAndAttendance_StartBreak", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/StartBreakModel" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/timeandattendance/endbreak": { + "post": { + "tags": [ + "Ess" + ], + "summary": "End Break", + "description": "Ends the employee's current break.", + "operationId": "EssTimeAndAttendance_EndBreak", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EndBreakModel" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/timeandattendance/discard": { + "post": { + "tags": [ + "Ess" + ], + "summary": "Discard current shift", + "description": "Discards the current shift for an employee. \r\nIf they are on a break, it will be ended automatically.", + "operationId": "EssTimeAndAttendance_DiscardShift", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ClockOffModel" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/timeandattendance/shifts": { + "post": { + "tags": [ + "Ess" + ], + "summary": "Shifts", + "description": "Gets shifts based on certain optional criteria.", + "operationId": "EssTimeAndAttendance_Shifts", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/GetShiftsModel" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TimeAndAttendanceShiftModel" + }, + "xml": { + "name": "TimeAndAttendanceShiftModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/timeandattendance/shift/{shiftId}/notes": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Shift Notes", + "description": "Gets shifts based on certain optional criteria.", + "operationId": "EssTimeAndAttendance_GetShiftNotes", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "shiftId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model.employeeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model.isAdminInitiated", + "in": "query", + "required": false, + "type": "boolean", + "title": "Boolean" + }, + { + "name": "model.type", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "Shift", + "ClockOn", + "ClockOff" + ], + "title": "Nullable" + }, + { + "name": "model.visibility", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "Hidden", + "Visible" + ], + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "Ess" + ], + "summary": "Add Note to Shift", + "description": "Adds a note to an existing shift.", + "operationId": "EssTimeAndAttendance_AddNote", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "shiftId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/AddNoteModel" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/timeandattendance/shift/{shiftId}/notes/read-state": { + "post": { + "tags": [ + "Ess" + ], + "summary": "Mark Shift Notes Read", + "description": "Marks some shift notes as either read or unread.", + "operationId": "EssTimeAndAttendance_MarkNotesRead", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/MarkNotesReadViewModel" + } + }, + { + "name": "shiftId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/superfunds": { + "get": { + "tags": [ + "Ess" + ], + "summary": "List Super Funds", + "description": "Lists all of the super funds for this employee.", + "operationId": "EssSuperFund_List", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/SuperFundModel" + }, + "xml": { + "name": "SuperFundModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "Ess" + ], + "summary": "Create Super Fund", + "description": "Creates a new super fund for the employee.", + "operationId": "EssSuperFund_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SaveSuperFundModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SaveSuperFundResponseModel" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/superfunds/{superFundId}": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Super Fund by ID", + "description": "Gets the super fund for this employee with the specified ID.", + "operationId": "EssSuperFund_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "superFundId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SuperFundModel" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/superfunds/{id}": { + "put": { + "tags": [ + "Ess" + ], + "summary": "Update Super Fund", + "description": "Updates the employee's super fund with the specified ID.", + "operationId": "EssSuperFund_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SaveSuperFundModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SaveSuperFundResponseModel" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/superfunds/{superfundId}": { + "delete": { + "tags": [ + "Ess" + ], + "summary": "Delete Super Fund", + "description": "Deletes the employee's super fund with the specified ID.", + "operationId": "EssSuperFund_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "superfundId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SaveSuperFundResponseModel" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/document/payslip": { + "get": { + "tags": [ + "Ess" + ], + "summary": "List Pay Slips", + "description": "Lists all pay slips for the employee.", + "operationId": "EssDocument_Payslips", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EssPayslipModel" + }, + "xml": { + "name": "EssPayslipModel", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/document/payslip/{payrunId}": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Pay Slip by Pay Run ID", + "description": "Gets the pay slip for the pay run with the specified ID.", + "operationId": "EssDocument_Payslip", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payrunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/document/paymentsummaries": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Payment Summaries", + "description": "List all the employee's payment summaries.", + "operationId": "EssDocument_PaymentSummaries", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EssPaymentSummaryModel" + }, + "xml": { + "name": "EssPaymentSummaryModel", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/document/paymentsummary/{documentId}": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Payment Summary PDF", + "description": "Gets the PDF for the payment summary with the specified ID.", + "operationId": "EssDocument_PaymentSummary", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "documentId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/document": { + "get": { + "tags": [ + "Ess" + ], + "summary": "List all Documents", + "description": "Lists all documents visible to this employee, including both business and employee documents.", + "operationId": "EssDocument_List", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EssDocumentModel" + }, + "xml": { + "name": "EssDocumentModel", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/document/{documentId}": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Document Details by ID", + "description": "Gets details for the specified document which is visible to the employee.", + "operationId": "EssDocument_GetDocument", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "documentId", + "in": "path", + "required": true, + "type": "string", + "title": "String" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/document/download/{documentId}": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Download Document", + "description": "Downloads the document with the specified ID so long as it is visible to the employee.", + "operationId": "EssDocument_Download", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "documentId", + "in": "path", + "required": true, + "type": "string", + "title": "String" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/unavailability": { + "get": { + "tags": [ + "Ess" + ], + "summary": "List Unavailabilities", + "description": "Lists all of the unavailabilities for this employee, with optional filters.", + "operationId": "EssUnavailability_List", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "filter.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "Nullable" + }, + { + "name": "filter.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EssUnavailabilityModel" + }, + "xml": { + "name": "EssUnavailabilityModel", + "wrapped": true + }, + "title": "IList" + } + } + } + }, + "post": { + "tags": [ + "Ess" + ], + "summary": "Create Unavailability", + "description": "Creates a new unavailability for the employee.", + "operationId": "EssUnavailability_Create", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "unavailability", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UnavailabilityEditModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EssUnavailabilityModel" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/unavailability/{unavailabilityId}": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get unavailability by ID", + "description": "Gets the unavailability with the specified ID (so long as the unavailability is from the specified employee).", + "operationId": "EssUnavailability_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "unavailabilityId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EssUnavailabilityModel" + } + } + } + }, + "put": { + "tags": [ + "Ess" + ], + "summary": "Update Unavailability", + "description": "Updates the unavailability with the specified ID.", + "operationId": "EssUnavailability_Save", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "unavailabilityId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "unavailability", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UnavailabilityEditModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Ess" + ], + "summary": "Delete Unavailability", + "description": "Deletes the unavailability with the specified ID.", + "operationId": "EssUnavailability_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "unavailabilityId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/bankaccounts": { + "get": { + "tags": [ + "Ess" + ], + "summary": "List Bank Accounts", + "description": "Lists all of the bank accounts for this employee.", + "operationId": "EssBankAccount_List", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/BankAccountModel" + }, + "xml": { + "name": "BankAccountModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "Ess" + ], + "summary": "Create Bank Account", + "description": "Creates a new bank account for the employee.", + "operationId": "EssBankAccount_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/BankAccountModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SaveBankAccountResponseModel" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/bankaccounts/{bankAccountId}": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Bank Account by ID", + "description": "Gets the bank account for this employee with the specified ID.", + "operationId": "EssBankAccount_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "bankAccountId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/BankAccountModel" + } + } + } + }, + "delete": { + "tags": [ + "Ess" + ], + "summary": "Delete Bank Account", + "description": "Deletes the employee's bank account with the specified ID.", + "operationId": "EssBankAccount_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "bankAccountId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SaveBankAccountResponseModel" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/bankaccounts/{id}": { + "put": { + "tags": [ + "Ess" + ], + "summary": "Update Bank Account", + "description": "Updates the employee's bank account with the specified ID.", + "operationId": "EssBankAccount_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/BankAccountModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SaveBankAccountResponseModel" + } + } + } + } + }, + "/api/v2/ess/security/employees": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Employees", + "description": "Returns all the employees the user can access.", + "operationId": "EssSecurity_Employees", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/AvailableEmployeeModel" + }, + "xml": { + "name": "AvailableEmployeeModel", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/ess/security/forgottenpassword": { + "post": { + "tags": [ + "Ess" + ], + "summary": "Recover Forgotten Password", + "description": "Sends an email so that the user can reset their password", + "operationId": "EssSecurity_ForgottenPassword", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/RecoverPasswordModel" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/expense/summary": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Expense Payment Summary", + "description": "Gets a summary of the employee's expense payments.", + "operationId": "EssExpense_Summary", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeExpensePaymentSummaryModel" + }, + "xml": { + "name": "EmployeeExpensePaymentSummaryModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/expense/categories": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Expense Categories", + "description": "Gets all the expense categories for the employee.", + "operationId": "EssExpense_ExpenseCategories", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ExpenseCategoryResponseModel" + }, + "xml": { + "name": "ExpenseCategoryResponseModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/expense/taxcodes": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Tax Codes", + "description": "Gets all the tax codes for the employee.", + "operationId": "EssExpense_TaxCodes", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/JournalServiceTaxCode" + }, + "xml": { + "name": "JournalServiceTaxCode", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/expense": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Expense Requests", + "description": "Gets a paged view of expense requests for this employee.", + "operationId": "EssExpense_GetExpenseRequests", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "currentPage", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "default": 1, + "title": "Int32" + }, + { + "name": "pageSize", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "default": 100, + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EssExpenseRequestResponseModel" + }, + "xml": { + "name": "EssExpenseRequestResponseModel", + "wrapped": true + }, + "title": "IList" + } + } + } + }, + "post": { + "tags": [ + "Ess" + ], + "summary": "Create Expense Request", + "description": "Creates a new expense request for the employee.", + "operationId": "EssExpense_CreateExpenseRequest", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ExpenseRequestEditModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/expense/{expenseRequestId}": { + "get": { + "tags": [ + "Ess" + ], + "summary": "Get Expense Request by ID", + "description": "Gets the expense request with the specified ID.", + "operationId": "EssExpense_GetExpenseRequest", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "expenseRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EssExpenseRequestResponseModel" + } + } + } + }, + "put": { + "tags": [ + "Ess" + ], + "summary": "Update Expense Request", + "description": "Updates the expense request with the specified ID.", + "operationId": "EssExpense_UpdateExpenseRequest", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "expenseRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ExpenseRequestEditModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Ess" + ], + "summary": "Delete Expense Request", + "description": "Deletes the expense request with the specified ID.", + "operationId": "EssExpense_CancelExpenseRequest", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "expenseRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EssExpenseRequestResponseModel" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/expense/{expenseRequestId}/attachment": { + "put": { + "tags": [ + "Ess" + ], + "summary": "Upload Attachment to Expense Request", + "description": "Uploads an attachment to the expense request with the specified ID. \r\nThe request should be a MIME multipart file upload request.", + "operationId": "EssExpense_UploadAttachment", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "expenseRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "title": "IHttpActionResult" + } + } + } + } + }, + "/api/v2/business/{businessId}/leaveallowances": { + "get": { + "tags": [ + "LeaveAllowance" + ], + "summary": "Get Leave Allowances", + "description": "Creates a deduction category for the business.", + "operationId": "LeaveAllowances_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/LeaveAllowanceModel" + }, + "xml": { + "name": "LeaveAllowanceModel", + "wrapped": true + }, + "title": "List" + }, + "title": "Dictionary" + } + } + } + }, + "post": { + "tags": [ + "LeaveAllowance" + ], + "summary": "Create Leave Allowances", + "description": "Create leave allowances for specific employees (dictionary keyed by employee ID).", + "operationId": "LeaveAllowances_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SubmitEmployeeLeaveAllowancesRequest" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/leaveallowancetemplate": { + "get": { + "tags": [ + "LeaveAllowance" + ], + "summary": "List Leave Allowance Templates", + "description": "Lists all the leave allowance templates for this business.\n\nThis operation supports OData queries.", + "operationId": "LeaveAllowanceTemplate_GetLeaveAllowanceTemplates", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/LeaveAllowanceTemplateModel" + }, + "xml": { + "name": "LeaveAllowanceTemplateModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "LeaveAllowance" + ], + "summary": "Create Leave Allowance Template", + "description": "Creates a new leave allowance template for the business.", + "operationId": "LeaveAllowanceTemplate_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "leaveAllowanceTemplate", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/LeaveAllowanceTemplateModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/leaveallowancetemplate/{id}": { + "get": { + "tags": [ + "LeaveAllowance" + ], + "summary": "Get Leave Allowance Template by ID", + "description": "Gets the details for the leave allowance template with the specified ID.", + "operationId": "LeaveAllowanceTemplate_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/LeaveAllowanceTemplateModel" + } + } + } + }, + "put": { + "tags": [ + "LeaveAllowance" + ], + "summary": "Update Leave Allowance Template", + "description": "Updates the leave allowance template with the specified ID.", + "operationId": "LeaveAllowanceTemplate_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "leaveAllowanceTemplate", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/LeaveAllowanceTemplateModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "LeaveAllowance" + ], + "summary": "Delete Leave Allowance Template", + "description": "Deletes the leave allowance template with the specified ID.", + "operationId": "LeaveAllowanceTemplate_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/leavecategory": { + "get": { + "tags": [ + "LeaveCategories" + ], + "summary": "List Leave Categories", + "description": "Lists all of the leave categories for the business.\n\nThis operation supports OData queries.", + "operationId": "LeaveCategory_GetLeaveCategories", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/LeaveCategoryModel" + }, + "xml": { + "name": "LeaveCategoryModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "LeaveCategories" + ], + "summary": "Create Leave Category", + "description": "Creates a new leave category for the business.", + "operationId": "LeaveCategory_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "leaveCategory", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/LeaveCategoryModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/leavecategory/{id}": { + "get": { + "tags": [ + "LeaveCategories" + ], + "summary": "Get Leave Category by ID", + "description": "Gets the leave category with the specified ID.", + "operationId": "LeaveCategory_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/LeaveCategoryModel" + } + } + } + }, + "put": { + "tags": [ + "LeaveCategories" + ], + "summary": "Update Leave Category", + "description": "Updates the leave category with the specified ID.", + "operationId": "LeaveCategory_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "leaveCategory", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/LeaveCategoryModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "LeaveCategories" + ], + "summary": "Delete Leave Category", + "description": "Deletes the leave category with the specified ID.", + "operationId": "LeaveCategory_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/leaverequest": { + "get": { + "tags": [ + "LeaveRequests" + ], + "summary": "List Leave Requests", + "description": "Lists all the leave requests for the business.", + "operationId": "BusinessLeaveRequest_ListLeaveRequests", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "filter.status", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "Pending", + "Approved", + "Cancelled", + "Rejected" + ], + "title": "Nullable" + }, + { + "name": "filter.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "Nullable" + }, + { + "name": "filter.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "Nullable" + }, + { + "name": "filter.leaveCategoryId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "filter.locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "filter.employeeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "filter.groupBy", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "Employee", + "LeaveType" + ], + "title": "LeaveRequestGroupBy" + }, + { + "name": "filter.restrictOverlappingLeave", + "in": "query", + "required": false, + "type": "boolean", + "title": "Boolean" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/LeaveRequestResponseModel" + }, + "xml": { + "name": "LeaveRequestResponseModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/leaverequest": { + "get": { + "tags": [ + "LeaveRequests" + ], + "summary": "Get Leave Requests for Employee", + "description": "Returns all leave requests for this employee, optionally filtered by OData parameters.\n\nThis operation supports OData queries.", + "operationId": "LeaveRequest_GetLeaveRequests", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/LeaveRequestResponseModel" + }, + "xml": { + "name": "LeaveRequestResponseModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "LeaveRequests" + ], + "summary": "Create Leave Request", + "description": "Creates a new leave request for an employee.", + "operationId": "LeaveRequest_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ApiLeaveApplicationModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/leaverequest/{leaveRequestId}": { + "get": { + "tags": [ + "LeaveRequests" + ], + "summary": "Get Leave Request by ID", + "description": "Gets the details for a leave request with the specified ID.", + "operationId": "LeaveRequest_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "leaveRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/LeaveRequestResponseModel" + } + } + } + }, + "put": { + "tags": [ + "LeaveRequests" + ], + "summary": "Update Leave Request", + "description": "Updates the leave request with the specified ID.", + "operationId": "LeaveRequest_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "leaveRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ApiLeaveApplicationModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "LeaveRequests" + ], + "summary": "Delete Leave Request", + "description": "Deletes the leave request with the specified ID.", + "operationId": "LeaveRequest_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "leaveRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/leaverequest/{leaveRequestId}/approve": { + "post": { + "tags": [ + "LeaveRequests" + ], + "summary": "Approve Leave Request", + "description": "Approves the leave request with the specified ID.", + "operationId": "LeaveRequest_Approve", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "leaveRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/leaverequest/{leaveRequestId}/decline": { + "post": { + "tags": [ + "LeaveRequests" + ], + "summary": "Decline Leave Request", + "description": "Declines the leave request with the specified ID.", + "operationId": "LeaveRequest_Decline", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "leaveRequestId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "decline", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/DeclineLeaveRequest" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/leaverequest/estimate": { + "get": { + "tags": [ + "LeaveRequests" + ], + "summary": "Estimate Leave Hours", + "description": "Estimates the leave hours required for a leave request between fromDate and toDate.", + "operationId": "LeaveRequest_Estimate", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "fromDate", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "toDate", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/LeaveEstimate" + } + } + } + } + }, + "/api/v2/business/{businessId}/location": { + "get": { + "tags": [ + "Location" + ], + "summary": "List Business Locations", + "description": "Lists all the locations for a business.\n\nThis operation supports OData queries.", + "operationId": "Location_GetLocations", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/LocationModel" + }, + "xml": { + "name": "LocationModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "Location" + ], + "summary": "Create Location", + "description": "Creates a business location.", + "operationId": "Location_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "location", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/LocationModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/location": { + "get": { + "tags": [ + "Location" + ], + "summary": "List Business Locations", + "description": "Lists all the locations for a business.\n\nThis operation supports OData queries.", + "operationId": "Location_GetApiV2BusinessByBusinessIdEmployeeByEmployeeIdLocation", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/LocationModel" + }, + "xml": { + "name": "LocationModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + } + }, + "/api/v2/business/{businessId}/location/{id}": { + "get": { + "tags": [ + "Location" + ], + "summary": "Get Location By Id", + "description": "Retrieves the details of the location with the specified ID.", + "operationId": "Location_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/LocationModel" + } + } + } + }, + "put": { + "tags": [ + "Location" + ], + "summary": "Update Location", + "description": "Updates the business location with the specified ID.", + "operationId": "Location_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "location", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/LocationModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Location" + ], + "summary": "Delete Location", + "description": "Deletes the location with the specified ID.", + "operationId": "Location_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/lookupdata/reports": { + "get": { + "tags": [ + "LookupData" + ], + "summary": "List Report Types", + "description": "Lists all of the report types.", + "operationId": "LookupData_Reports", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/NameIdPair" + }, + "xml": { + "name": "NameIdPair", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/business/{businessId}/lookupdata/employeegrouppermissions": { + "get": { + "tags": [ + "LookupData" + ], + "summary": "List Employee Group Permission Types", + "description": "Lists all of the employee group permission types.", + "operationId": "LookupData_EmployeeGroupPermissions", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/NameIdPair" + }, + "xml": { + "name": "NameIdPair", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/business/{businessId}/lookupdata/timezones": { + "get": { + "tags": [ + "LookupData" + ], + "summary": "List Time Zone Types", + "description": "Lists all of the time zone types.", + "operationId": "LookupData_TimeZones", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/NameIdPair" + }, + "xml": { + "name": "NameIdPair", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/shift": { + "get": { + "tags": [ + "Other" + ], + "summary": "List Roster Shifts", + "description": "Gets the employee's roster shifts within the date range.", + "operationId": "EssShift_Shifts", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "fromDate", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "toDate", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EssRosterShiftModel" + }, + "xml": { + "name": "EssRosterShiftModel", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/shift/{shiftId}": { + "get": { + "tags": [ + "Other" + ], + "summary": "Get Roster Shift by ID", + "description": "Gets the roster shift with the specified ID (as long as it is assigned to this employee).", + "operationId": "EssShift_Shift", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "shiftId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/EssRosterShiftModel" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/shift/{shiftId}/decline": { + "post": { + "tags": [ + "Other" + ], + "summary": "Decline Roster Shift", + "description": "Declines the roster shift with the specified ID.", + "operationId": "EssShift_DeclineShift", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "shiftId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EssDeclineRosterShiftModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/shift/{shiftId}/accept": { + "post": { + "tags": [ + "Other" + ], + "summary": "Accept Roster Shift", + "description": "Accepts the roster shift with the specified ID.", + "operationId": "EssShift_AcceptShift", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "shiftId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/shift/accept": { + "post": { + "tags": [ + "Other" + ], + "summary": "Bulk Accept Roster Shifts", + "description": "Accepts a number of roster shifts by ID.", + "operationId": "EssShift_AcceptShifts", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EssBulkAcceptRosterShiftsModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/shift/decline": { + "post": { + "tags": [ + "Other" + ], + "summary": "Bulk Decline Roster Shifts", + "description": "Declines a number of roster shifts by ID.", + "operationId": "EssShift_DeclineShifts", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EssBulkDeclineRosterShiftsModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/shift/nearby": { + "get": { + "tags": [ + "Other" + ], + "summary": "Find Nearby Roster Shifts", + "description": "Finds any of the employee's roster shifts that are nearby to the specified local time.", + "operationId": "EssShift_NearbyRosterShifts", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "localTime", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EssRosterShiftModel" + }, + "xml": { + "name": "EssRosterShiftModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/shift/matchingclockon": { + "get": { + "tags": [ + "Other" + ], + "summary": "Find Matching Clock On Roster Shift", + "description": "If a roster shift exists that could match for this employee to clock on at this time \r\ngiven ESS settings for shift matching, returns that shift.\r\nOtherwise, the Shift result will be null.\r\nNote that if the time matches a shift exactly, the Shift result will also be null.", + "operationId": "EssShift_MatchingClockOnRosterShift", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "localTime", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/RosterShiftMatchingResultModel" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/shift/matchingclockoff": { + "get": { + "tags": [ + "Other" + ], + "summary": "Find Matching Clock Off Roster Shift", + "description": "If a roster shift exists that could match for this employee to clock off at this time \r\ngiven ESS settings for shift matching, returns that shift.\r\nOtherwise, the Shift result will be null.\r\nNote that if the time matches a shift exactly, the Shift result will also be null.", + "operationId": "EssShift_MatchingClockOffRosterShift", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "localTime", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/RosterShiftMatchingResultModel" + } + } + } + } + }, + "/api/v2/ess/{employeeId}/shift/{shiftId}/swap/candidates": { + "get": { + "tags": [ + "Other" + ], + "operationId": "EssShift_EmployeesEligibleForSwap", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "shiftId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/shift/swap/propose": { + "post": { + "tags": [ + "Other" + ], + "operationId": "EssShift_ProposeShiftSwap", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SwapShiftModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/shift/{shiftId}/swap/cancel": { + "post": { + "tags": [ + "Other" + ], + "operationId": "EssShift_CancelShiftSwap", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "shiftId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/shift/{shiftId}/swap/accept": { + "post": { + "tags": [ + "Other" + ], + "operationId": "EssShift_AcceptShiftSwap", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "shiftId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/shift/{shiftId}/swap/decline": { + "post": { + "tags": [ + "Other" + ], + "operationId": "EssShift_DeclineShiftSwap", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "shiftId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/shift/swap/accept": { + "post": { + "tags": [ + "Other" + ], + "summary": "Bulk Accept Roster Shift Swaps", + "description": "Accepts a number of roster shift swaps by shift ID.", + "operationId": "EssShift_AcceptShiftSwaps", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EssBulkRosterShiftSwapModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/shift/swap/decline": { + "post": { + "tags": [ + "Other" + ], + "summary": "Bulk Decline Roster Shift Swaps", + "description": "Declines a number of roster shift swaps by shift ID.", + "operationId": "EssShift_DeclineShiftSwaps", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EssBulkRosterShiftSwapModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/ess/{employeeId}/shift/swap/cancel": { + "post": { + "tags": [ + "Other" + ], + "summary": "Bulk Cancel Roster Shift Swaps", + "description": "Cancels a number of roster shift swaps by shift ID.", + "operationId": "EssShift_CancelShiftSwaps", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EssBulkRosterShiftSwapModel" + } + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/report/tasks": { + "get": { + "tags": [ + "Other" + ], + "operationId": "ReportsTasksReport_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "request.employeeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.payRunId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "Nullable" + }, + { + "name": "request.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "Nullable" + }, + { + "name": "request.payScheduleId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.status", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "All", + "Completed", + "NotCompleted" + ], + "title": "TasksReportStatusEnum" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TasksReportExportModel" + }, + "xml": { + "name": "TasksReportExportModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/business/{businessId}/report/shiftswapping": { + "get": { + "tags": [ + "Other" + ], + "operationId": "ReportsShiftSwapping_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "request.fromEmployeeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "request.toEmployeeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "request.includeCosts", + "in": "query", + "required": false, + "type": "boolean", + "title": "Boolean" + }, + { + "name": "request.statuses", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string", + "enum": [ + "Created", + "Cancelled", + "Accepted", + "Declined", + "AwaitingManagerApproval", + "ApprovedByManager", + "RejectedByManager" + ], + "title": "RosterShiftSwapStatusEnum" + }, + "collectionFormat": "multi", + "title": "IList" + }, + { + "name": "request.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.employingEntityId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ShiftSwappingReportExportModel" + }, + "xml": { + "name": "ShiftSwappingReportExportModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/business/{businessId}/paycategory": { + "get": { + "tags": [ + "PayCategory" + ], + "summary": "List Pay Categories", + "description": "Lists all the pay categories for the business\n\nThis operation supports OData queries.", + "operationId": "PayCategory_GetPayCategories", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PayCategoryModel" + }, + "xml": { + "name": "PayCategoryModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "PayCategory" + ], + "summary": "Create Pay Category", + "description": "Creates a new pay category for the business.", + "operationId": "PayCategory_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payCategory", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PayCategoryModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/paycategory/{id}": { + "get": { + "tags": [ + "PayCategory" + ], + "summary": "Get Pay Category by ID", + "description": "Gets the pay category with the specified ID.", + "operationId": "PayCategory_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayCategoryModel" + } + } + } + }, + "put": { + "tags": [ + "PayCategory" + ], + "summary": "Update Pay Category", + "description": "Updates the pay category with the specified ID.", + "operationId": "PayCategory_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "payCategory", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PayCategoryModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "PayCategory" + ], + "summary": "Delete Pay Category", + "description": "Deletes the pay category with the specified ID.", + "operationId": "PayCategory_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/paymentsummary/{financialYearEnding}": { + "get": { + "tags": [ + "PaymentSummary" + ], + "summary": "List Payment Summaries", + "description": "Lists all the payment summaries for the specified financial year.\n\nThis operation supports OData queries.", + "operationId": "PaymentSummary_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "financialYearEnding", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PaygPaymentSummaryModel" + }, + "xml": { + "name": "PaygPaymentSummaryModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "put": { + "tags": [ + "PaymentSummary" + ], + "summary": "Generate Payment Summaries", + "description": "Generates (or regenerates) payment summaries for the specified financial year/business. Only unpublished payment summaries will be regenerated.", + "operationId": "PaymentSummary_Put", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "financialYearEnding", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "employingEntityId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "PaymentSummary" + ], + "summary": "Publish Payment Summaries", + "description": "Publish payment summaries for the specified financial year.", + "operationId": "PaymentSummary_Post", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "financialYearEnding", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "employingEntityId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "PaymentSummary" + ], + "summary": "Unpublish Payment Summaries", + "description": "Unpublish payment summaries for the specified financial year.", + "operationId": "PaymentSummary_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "financialYearEnding", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "employingEntityId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payratetemplate": { + "get": { + "tags": [ + "PayRateTemplate" + ], + "summary": "List Pay Rate Templates", + "description": "Lists all the pay rate templates for the business.\n\nThis operation supports OData queries.", + "operationId": "PayRateTemplate_GetPayRateTemplates", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PayRateTemplateModel" + }, + "xml": { + "name": "PayRateTemplateModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "PayRateTemplate" + ], + "summary": "Create Pay Rate Template", + "description": "Creates a new pay rate template for the business.", + "operationId": "PayRateTemplate_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRateTemplate", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PayRateTemplateModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payratetemplate/{id}": { + "get": { + "tags": [ + "PayRateTemplate" + ], + "summary": "Get Pay Rate Template by ID", + "description": "Gets the pay rate template with the specified ID.", + "operationId": "PayRateTemplate_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRateTemplateModel" + } + } + } + }, + "put": { + "tags": [ + "PayRateTemplate" + ], + "summary": "Update Pay Rate Template", + "description": "Updates the pay rate template with the specified ID.", + "operationId": "PayRateTemplate_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "payRateTemplate", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PayRateTemplateModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "PayRateTemplate" + ], + "summary": "Delete Pay Rate Template", + "description": "Deletes the pay rate template with the specified ID.", + "operationId": "PayRateTemplate_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/EmployeeExpenses": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "List Employee Expenses", + "description": "Lists all the employee expenses for a pay run.", + "operationId": "PayRunEmployeeExpenses_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRunEmployeeExpenseResponse" + } + } + } + }, + "post": { + "tags": [ + "PayRun" + ], + "summary": "Create Employee Expenses", + "description": "Add employee expenses to the specified pay run.", + "operationId": "PayRunEmployeeExpenses_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SubmitPayRunEmployeeExpenseRequest" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "PayRun" + ], + "summary": "Delete Employee Expense", + "description": "Deletes the employee expense with the specified ID from the pay run.", + "operationId": "PayRunEmployeeExpenses_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "id", + "in": "query", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/EmployeeExpenses/{employeeId}": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "Get Employee Expenses by Employee ID", + "description": "Gets all the employee expenses for a specific employee in a pay run.", + "operationId": "PayRunEmployeeExpenses_GetApiV2BusinessByBusinessIdPayrunByPayRunIdEmployeeExpensesByEmployeeId", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRunEmployeeExpenseResponse" + } + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/details": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "Get Pay Run Details", + "description": "Gets the details for the specified pay run.", + "operationId": "PayRunDetails_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRunDetailsModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/terminate": { + "post": { + "tags": [ + "PayRun" + ], + "summary": "Terminate Employee in Pay Run", + "description": "Terminates an employee in the specified pay run.", + "operationId": "PayRunTerminate_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/TerminateEmployeeRequest" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/payslips": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "List Pay Slip Data", + "description": "Lists all the pay slips for the specified pay run.", + "operationId": "PayRunPaySlip_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "showAllData", + "in": "query", + "required": false, + "type": "boolean", + "default": false, + "title": "Boolean" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ApiPaySlipModel" + }, + "title": "Dictionary" + } + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/payslips/{employeeId}": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "Get Pay Slip Data by Employee ID", + "description": "Gets the pay slip data for an employee in a payrun.", + "operationId": "PayRunPaySlip_GetApiV2BusinessByBusinessIdPayrunByPayRunIdPayslipsByEmployeeId", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "showAllData", + "in": "query", + "required": false, + "type": "boolean", + "default": false, + "title": "Boolean" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/ApiPaySlipModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/earningslines": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "List Earnings Lines", + "description": "Lists all the earnings lines for a pay run.", + "operationId": "PayRunEarningsLine_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRunEarningsLineResponse" + } + } + } + }, + "post": { + "tags": [ + "PayRun" + ], + "summary": "Create Earnings Lines", + "description": "Adds earnings lines to the specified pay run.", + "operationId": "PayRunEarningsLine_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SubmitPayRunEarningsLineRequest" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "PayRun" + ], + "summary": "Delete Earnings Line", + "description": "Deletes the earnings with the specified ID from the pay run.", + "operationId": "PayRunEarningsLine_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "id", + "in": "query", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/earningslines/{employeeId}": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "Get Earnings Lines by Employee ID", + "description": "Gets all the earnings lines for a specific employee in a pay run.", + "operationId": "PayRunEarningsLine_GetApiV2BusinessByBusinessIdPayrunByPayRunIdEarningslinesByEmployeeId", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRunEarningsLineResponse" + } + } + } + } + }, + "/api/v2/business/{businessId}/employee/{employeeId}/payruntotals": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "List Pay Run Totals for Employee", + "description": "Lists all the pay run totals for the employee with the specified ID.", + "operationId": "EmployeePayRunTotal_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PayRunTotalModel" + }, + "xml": { + "name": "PayRunTotalModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/leaveaccrued": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "Get Leave Accruals", + "description": "Lists all the leave accruals for the pay run.", + "operationId": "PayRunLeaveAccrued_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "includeLeaveTaken", + "in": "query", + "required": false, + "type": "boolean", + "default": false, + "title": "Boolean" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/LeaveAccrualResponse" + } + } + } + }, + "post": { + "tags": [ + "PayRun" + ], + "summary": "Save Leave Accruals", + "description": "Saves a set of leave accruals for the pay run.", + "operationId": "PayRunLeaveAccrued_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SubmitLeaveAccrualsModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "PayRun" + ], + "summary": "Delete Leave Accrual", + "description": "Deletes the manually added leave accrual, leave taken or leave adjustment with the specified ID from the pay run.", + "operationId": "PayRunLeaveAccrued_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "id", + "in": "query", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/leaveaccrued/{employeeId}": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "Get Leave Accruals for Employee", + "description": "Gets the leave accruals for the specified employee in the pay run.", + "operationId": "PayRunLeaveAccrued_GetApiV2BusinessByBusinessIdPayrunByPayRunIdLeaveaccruedByEmployeeId", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "includeLeaveTaken", + "in": "query", + "required": false, + "type": "boolean", + "default": false, + "title": "Boolean" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/LeaveAccrualResponse" + } + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/paygadjustments": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "List PAYG Adjustments", + "description": "Lists all the PAYG adjustments for a pay run.", + "operationId": "PayRunPaygAdjustments_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRunPaygAdjustmentResponse" + } + } + } + }, + "post": { + "tags": [ + "PayRun" + ], + "summary": "Create PAYG Adjustments", + "description": "Adds PAYG adjustments to the specified pay run.", + "operationId": "PayRunPaygAdjustments_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SubmitPayRunPaygAdjustmentRequest" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "PayRun" + ], + "summary": "Delete PAYG Adjustment", + "description": "Deletes the PAYG adjustment with the specified ID from the pay run.", + "operationId": "PayRunPaygAdjustments_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "id", + "in": "query", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/paygadjustments/{employeeId}": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "Get PAYG Adjustments by Employee ID", + "description": "Gets all the PAYG adjustments for a specific employee in a pay run.", + "operationId": "PayRunPaygAdjustments_GetApiV2BusinessByBusinessIdPayrunByPayRunIdPaygadjustmentsByEmployeeId", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRunPaygAdjustmentResponse" + } + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/superadjustments": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "List Super Adjustments", + "description": "Lists all the super adjustments for a pay run.", + "operationId": "PayRunSuperAdjustments_GetAll", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRunSuperAdjustmentResponse" + } + } + } + }, + "post": { + "tags": [ + "PayRun" + ], + "summary": "Create Super Adjustments", + "description": "Adds super adjustments to the specified pay run.", + "operationId": "PayRunSuperAdjustments_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SubmitPayRunSuperAdjustmentRequest" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "PayRun" + ], + "summary": "Delete Super Adjustment", + "description": "Deletes the super adjustment with the specified ID from the pay run.", + "operationId": "PayRunSuperAdjustments_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "id", + "in": "query", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/superadjustments/{employeeId}": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "Get Super Adjustments by Employee ID", + "description": "Gets all super adjustments for a specific employee in a pay run.", + "operationId": "PayRunSuperAdjustments_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRunSuperAdjustmentResponse" + } + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/unlock": { + "post": { + "tags": [ + "PayRun" + ], + "summary": "Unlock Pay Run", + "description": "Unlocks the specified pay run.", + "operationId": "PayRunUnlock_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PayRunUnlockRequest" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "List Pay Runs", + "description": "Get a list of pay runs associated with the business.\n\nThis operation supports OData queries.", + "operationId": "PayRun_GetPayRuns", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PayRunModel" + }, + "xml": { + "name": "PayRunModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "PayRun" + ], + "summary": "Create Pay Run", + "description": "Creates a new pay run for this business.", + "operationId": "PayRun_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PayRunCreateRequest" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "Get Pay Run", + "description": "Gets the pay run with the specified ID.", + "operationId": "PayRun_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRunModel" + } + } + } + }, + "delete": { + "tags": [ + "PayRun" + ], + "summary": "Delete Pay Run", + "description": "Deletes the pay run with the specified ID.", + "operationId": "PayRun_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/async": { + "post": { + "tags": [ + "PayRun" + ], + "summary": "Create Pay Run (Async)", + "description": "Creates a new pay run for this business asynchronously (the request will return before the pay run is created).", + "operationId": "PayRun_Async", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PayRunCreateRequest" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/creationstatus/{jobId}": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "Get Creation Status", + "description": "Gets the creation status of a pay run that was created asynchronously.", + "operationId": "PayRun_CreationStatus", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "jobId", + "in": "path", + "required": true, + "type": "string", + "format": "uuid", + "title": "Guid" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/file/aba/{abaId}": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "Get ABA File", + "description": "Gets an ABA file associated with a pay run.", + "operationId": "PayRun_AbaFile", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "abaId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/file/payslip/{employeeId}": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "Get Pay Slip File", + "description": "Gets the pay slip for an employee in a pay run.", + "operationId": "PayRun_PaySlipFile", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/recalculate": { + "post": { + "tags": [ + "PayRun" + ], + "summary": "Recalculate", + "description": "Recalculates a pay run.", + "operationId": "PayRun_Recalculate", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/notation": { + "post": { + "tags": [ + "PayRun" + ], + "summary": "Set Pay Run Notation", + "description": "Sets the notation for this pay run. The pay run notation is the message that is shown on all pay slips for this pay run.", + "operationId": "PayRun_Notation", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PayRunNotationModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "PayRun" + ], + "summary": "Delete Pay Run Notation", + "description": "Deletes the notation for this pay run. The pay run notation is the message that is shown on all pay slips for this pay run.", + "operationId": "PayRun_DeleteApiV2BusinessByBusinessIdPayrunByPayRunIdNotation", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/employerliabilities": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "List Employer Liabilities", + "description": "Lists all the employer liabilities for a pay run.", + "operationId": "PayRunEmployerLiabilities_GetAll", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRunEmployerLiabilityResponse" + } + } + } + }, + "post": { + "tags": [ + "PayRun" + ], + "summary": "Create Employer Liabilities", + "description": "Add employer liabilities to the specified pay run.", + "operationId": "PayRunEmployerLiabilities_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SubmitPayRunEmployerLiabilityRequest" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "PayRun" + ], + "summary": "Delete Employer Liability", + "description": "Deletes the employer liability with the specified ID from the pay run.", + "operationId": "PayRunEmployerLiabilities_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "id", + "in": "query", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/employerliabilities/{employeeId}": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "Get Employer Liabilities by Employee ID", + "description": "Gets all the employer liabilities for a specific employee in a pay run.", + "operationId": "PayRunEmployerLiabilities_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRunEmployerLiabilityResponse" + } + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/finalise": { + "post": { + "tags": [ + "PayRun" + ], + "summary": "Finalise Pay Run", + "description": "Finalises the specified pay run. A pay run can only be finalised if there are no calculations in progress.", + "operationId": "PayRunFinalise_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "options", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/FinalisePayRunOptions" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRunFinaliseResult" + } + } + } + } + }, + "/api/v2/business/{businessId}/journal/{payRunId}": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "Get Journal Details", + "description": "Gets the journal details for this pay run.", + "operationId": "Journal_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/JournalItemResponse" + }, + "xml": { + "name": "JournalItemResponse", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/setuiunlockstate": { + "post": { + "tags": [ + "PayRun" + ], + "summary": "Set UI Unlock enabled", + "description": "Sets whether a pay run can be unlocked by the UI or not. Only applies to finalized pay runs.", + "operationId": "PayRunUnlockState_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SetPayRunUIUnlockStateRequest" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/totals": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "List Pay Run Totals", + "description": "Lists all of the pay run totals in a pay run.", + "operationId": "PayRunTotals_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRunTotalResponse" + } + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/totals/{employeeId}": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "Get Pay Slip Data by Employee ID", + "description": "Gets the pay run totals for a specific employee in a pay run.", + "operationId": "PayRunTotals_GetApiV2BusinessByBusinessIdPayrunByPayRunIdTotalsByEmployeeId", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRunTotalResponse" + } + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/notation/{employeeId}": { + "post": { + "tags": [ + "PayRun" + ], + "summary": "Create Note for Employee", + "description": "Creates a note for an employee record in a pay run.", + "operationId": "PayRunTotals_Notation", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PayRunTotalNotationModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "PayRun" + ], + "summary": "Delete Note for Employee", + "description": "Deletes the note for an employee record in a pay run.", + "operationId": "PayRunTotals_DeleteApiV2BusinessByBusinessIdPayrunByPayRunIdNotationByEmployeeId", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/deductions": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "List Deductions", + "description": "Gets all the deductions for a pay run.", + "operationId": "PayRunDeductions_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRunDeductionResponse" + } + } + } + }, + "post": { + "tags": [ + "PayRun" + ], + "summary": "Create Deductions", + "description": "Add deductions to the specified pay run.", + "operationId": "PayRunDeductions_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SubmitPayRunDeductionRequest" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "PayRun" + ], + "summary": "Delete Deduction", + "description": "Deletes the deduction with the specified ID from the pay run.", + "operationId": "PayRunDeductions_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "id", + "in": "query", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payrun/{payRunId}/deductions/{employeeId}": { + "get": { + "tags": [ + "PayRun" + ], + "summary": "Get Deductions by Employee ID", + "description": "Gets all the deductions for a specific employee in a pay run.", + "operationId": "PayRunDeductions_GetApiV2BusinessByBusinessIdPayrunByPayRunIdDeductionsByEmployeeId", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "payRunId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayRunDeductionResponse" + } + } + } + } + }, + "/api/v2/business/{businessId}/payschedule": { + "get": { + "tags": [ + "PaySchedule" + ], + "summary": "List Pay Schedules", + "description": "Lists all the pay schedules for the business.\n\nThis operation supports OData queries.", + "operationId": "PaySchedule_GetPaySchedules", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PayScheduleModel" + }, + "xml": { + "name": "PayScheduleModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "PaySchedule" + ], + "summary": "Create Pay Schedule", + "description": "Creates a new pay schedule for the business.", + "operationId": "PaySchedule_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "paySchedule", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PayScheduleModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/payschedule/{id}": { + "get": { + "tags": [ + "PaySchedule" + ], + "summary": "Get Pay Schedule by ID", + "description": "Gets the pay schedule with the specified ID.", + "operationId": "PaySchedule_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PayScheduleModel" + } + } + } + }, + "put": { + "tags": [ + "PaySchedule" + ], + "summary": "Update Pay Schedule", + "description": "Updates the pay schedule with the specified ID.", + "operationId": "PaySchedule_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "paySchedule", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PayScheduleModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "PaySchedule" + ], + "summary": "Delete Pay Schedule", + "description": "Deletes the pay schedule with the specified ID.", + "operationId": "PaySchedule_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/publicholiday": { + "get": { + "tags": [ + "PublicHoliday" + ], + "summary": "Get Public Holidays for Year", + "description": "Retrieves all the public holidays for a specific year.", + "operationId": "PublicHoliday_GetPublicHolidays", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "year", + "in": "query", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PublicHolidayModel" + }, + "xml": { + "name": "PublicHolidayModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "PublicHoliday" + ], + "summary": "Add a public holiday", + "description": "Adds a new public holiday.", + "operationId": "PublicHoliday_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "publicHoliday", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PublicHolidayModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "PublicHoliday" + ], + "summary": "Delete Public Holiday by Date", + "description": "Deletes all the public holidays on a specific date.", + "operationId": "PublicHoliday_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "date", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/publicholiday/{id}": { + "get": { + "tags": [ + "PublicHoliday" + ], + "summary": "Get Public Holiday Details", + "description": "Gets the details for a public holiday with a specific ID", + "operationId": "PublicHoliday_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/PublicHolidayModel" + } + } + } + }, + "put": { + "tags": [ + "PublicHoliday" + ], + "summary": "Update Public Holiday", + "description": "Updates the public holiday with the specific ID.", + "operationId": "PublicHoliday_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "publicHoliday", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PublicHolidayModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "PublicHoliday" + ], + "summary": "Delete Public Holiday", + "description": "Deletes the public holiday with the specified ID.", + "operationId": "PublicHoliday_DeleteApiV2BusinessByBusinessIdPublicholidayById", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/qualification": { + "get": { + "tags": [ + "Qualifications" + ], + "summary": "List Qualifications", + "description": "Lists all of the qualifications for the business.\n\nThis operation supports OData queries.", + "operationId": "Qualification_GetQualifications", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/QualificationModel" + }, + "xml": { + "name": "QualificationModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "Qualifications" + ], + "summary": "Create Qualification", + "description": "Creates a new employee qualification for the business.", + "operationId": "Qualification_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "qualification", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/QualificationModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/qualification/{id}": { + "get": { + "tags": [ + "Qualifications" + ], + "summary": "Get Qualification by ID", + "description": "Gets the qualification with the specified ID.", + "operationId": "Qualification_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/QualificationModel" + } + } + } + }, + "put": { + "tags": [ + "Qualifications" + ], + "summary": "Update Qualification", + "description": "Updates the qualification with the specified ID.", + "operationId": "Qualification_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "qualification", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/QualificationModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Qualifications" + ], + "summary": "Delete Qualification", + "description": "Deletes the qualification with the specified ID.", + "operationId": "Qualification_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/report/supercontributions/byemployee": { + "get": { + "tags": [ + "Reporting" + ], + "summary": "Super Contribution Report (By Employee)", + "description": "Generates a super contribution report by employee.", + "operationId": "ReportsSuperContributions_ByEmployee", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "request.payScheduleId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.employingEntityId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/SuperAccrualExportModel" + }, + "xml": { + "name": "SuperAccrualExportModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + } + }, + "/api/v2/business/{businessId}/report/supercontributions/bysuperfund": { + "get": { + "tags": [ + "Reporting" + ], + "summary": "Super Contribution Report (By Super Fund)", + "description": "Generates a super contribution report by super fund.", + "operationId": "ReportsSuperContributions_BySuperFund", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "request.payScheduleId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.employingEntityId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/SuperContributionsReportExportModel" + }, + "xml": { + "name": "SuperContributionsReportExportModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + } + }, + "/api/v2/business/{businessId}/report/leavebalances": { + "get": { + "tags": [ + "Reporting" + ], + "summary": "Leave Balances Report", + "description": "Generates a leave balances report.", + "operationId": "ReportsLeaveBalances_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "request.locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.leaveTypeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.groupBy", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "AccrualLocation", + "DefaultLocation" + ], + "title": "LeaveReportDisplayEnum" + }, + { + "name": "request.employingEntityId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "request.asAtDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/LeaveBalancesReportExportModel" + }, + "xml": { + "name": "LeaveBalancesReportExportModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + } + }, + "/api/v2/business/{businessId}/report/deductions": { + "get": { + "tags": [ + "Reporting" + ], + "summary": "Deductions Report", + "description": "Generates a deductions report.", + "operationId": "ReportsDeductions_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "request.employeeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.deductionCategoryId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.disableRollupReporting", + "in": "query", + "required": false, + "type": "boolean", + "title": "Boolean" + }, + { + "name": "request.payScheduleId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.employingEntityId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/DeductionsReportExportModel" + }, + "xml": { + "name": "DeductionsReportExportModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/business/{businessId}/report/payrunactivity": { + "get": { + "tags": [ + "Reporting" + ], + "summary": "Pay Run Activity Report", + "description": "Generates a pay run activity report.", + "operationId": "ReportsPayRunActivity_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "fromDate", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "toDate", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "payScheduleId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "default": 0, + "title": "Int32" + }, + { + "name": "locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "default": 0, + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ActivityReportExportModel" + }, + "xml": { + "name": "ActivityReportExportModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + } + }, + "/api/v2/business/{businessId}/report/employeedetails": { + "get": { + "tags": [ + "Reporting" + ], + "summary": "Employee Details Report", + "description": "Generates an employee details report.", + "operationId": "ReportsEmployeeDetails_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json" + ], + "parameters": [ + { + "name": "selectedColumns", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "collectionFormat": "multi", + "title": "List" + }, + { + "name": "locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "default": 0, + "title": "Int32" + }, + { + "name": "employingEntityId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "includeActive", + "in": "query", + "required": false, + "type": "boolean", + "default": true, + "title": "Boolean" + }, + { + "name": "includeInactive", + "in": "query", + "required": false, + "type": "boolean", + "default": true, + "title": "Boolean" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "object", + "title": "JObject" + }, + "xml": { + "name": "JObject", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + } + }, + "/api/v2/business/{businessId}/report/leavehistory": { + "get": { + "tags": [ + "Reporting" + ], + "summary": "Leave History Report", + "description": "Generates a leave history report.", + "operationId": "ReportsLeaveHistoryReport_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "model.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "model.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "model.payScheduleId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model.locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model.employeeId", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "collectionFormat": "multi", + "title": "IList" + }, + { + "name": "model.leaveCategoryId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/LeaveHistoryReportGroupModel" + }, + "xml": { + "name": "LeaveHistoryReportGroupModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + } + }, + "/api/v2/business/{businessId}/report/employeedetails/fields": { + "get": { + "tags": [ + "Reporting" + ], + "summary": "Get Employee Details Report Fields", + "description": "Gets the fields for the Employee Details Report.", + "operationId": "ReportsEmployeeDetailsFields_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeDetailsReportField" + }, + "xml": { + "name": "EmployeeDetailsReportField", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/business/{businessId}/report/paycategories": { + "get": { + "tags": [ + "Reporting" + ], + "summary": "Pay Categories Report", + "description": "Generates a pay categories report.", + "operationId": "ReportsPayCategories_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "request.payScheduleId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.employeeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.groupByEarningsLocation", + "in": "query", + "required": false, + "type": "boolean", + "title": "Boolean" + }, + { + "name": "request.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.employingEntityId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PayCategoriesReportExportModel" + }, + "xml": { + "name": "PayCategoriesReportExportModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + } + }, + "/api/v2/business/{businessId}/report/payg": { + "get": { + "tags": [ + "Reporting" + ], + "summary": "PAYG Report", + "description": "Generates a PAYG report.", + "operationId": "ReportsPayg_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "request.state", + "in": "query", + "required": false, + "type": "string", + "title": "String" + }, + { + "name": "request.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.employingEntityId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PaygReportExportModel" + }, + "xml": { + "name": "PaygReportExportModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/business/{businessId}/report/detailedactivity": { + "get": { + "tags": [ + "Reporting" + ], + "summary": "Detailed Activity Report", + "description": "Generates a detailed activity report.", + "operationId": "ReportsDetailedActivity_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "request.payScheduleId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.employingEntityId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/DetailedActivityReportExportModel" + }, + "xml": { + "name": "DetailedActivityReportExportModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + } + }, + "/api/v2/business/{businessId}/report/payrolltax": { + "get": { + "tags": [ + "Reporting" + ], + "summary": "Payroll Tax Report", + "description": "Generates a payroll tax report.", + "operationId": "ReportsPayrollTax_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "request.groupBy", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "EarningsLocation", + "DefaultLocation" + ], + "title": "PayrollTaxGroupByEnum" + }, + { + "name": "request.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.employingEntityId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PayrollTaxReportExportModel" + }, + "xml": { + "name": "PayrollTaxReportExportModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/business/{businessId}/report/timesheet": { + "get": { + "tags": [ + "Reporting" + ], + "summary": "Timesheet report", + "description": "Generates a timesheet report.", + "operationId": "ReportsTimesheet_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "request.employeeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "request.includeCosts", + "in": "query", + "required": false, + "type": "boolean", + "title": "Boolean" + }, + { + "name": "request.statuses", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string", + "enum": [ + "Missing", + "Submitted", + "Approved", + "Rejected", + "Processed" + ], + "title": "TimesheetLineStatusType" + }, + "collectionFormat": "multi", + "title": "IList" + }, + { + "name": "request.workTypeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "request.payScheduleId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.employingEntityId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TimesheetReportExportModel" + }, + "xml": { + "name": "TimesheetReportExportModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/business/{businessId}/report/paymenthistory": { + "get": { + "tags": [ + "Reporting" + ], + "summary": "Employee Payment History Report", + "description": "Generates an employee payment history report.", + "operationId": "ReportsEmployeePaymentHistory_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "request.employeeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "request.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.employingEntityId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PaymentHistoryReportExportModel" + }, + "xml": { + "name": "PaymentHistoryReportExportModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + } + }, + "/api/v2/business/{businessId}/report/birthday": { + "get": { + "tags": [ + "Reporting" + ], + "summary": "Birthday Report", + "description": "Generates a birthday report.", + "operationId": "ReportsBirthday_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "fromDate", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "toDate", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "default": 0, + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/BirthdayReportExportModel" + }, + "xml": { + "name": "BirthdayReportExportModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + } + }, + "/api/v2/business/{businessId}/report/grosstonet": { + "get": { + "tags": [ + "Reporting" + ], + "summary": "Gross To Net Report", + "description": "Generates a Gross To Net Report.", + "operationId": "ReportsGrossToNet_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "request.employeeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.payCategoryIds", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "integer", + "format": "int32", + "title": "Int32" + }, + "collectionFormat": "multi", + "title": "List" + }, + { + "name": "request.payScheduleId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "request.locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request.employingEntityId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/GrossToNetReportLineItem" + }, + "xml": { + "name": "GrossToNetReportLineItem", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + } + }, + "/api/v2/business/{businessId}/report/leaveliability": { + "get": { + "tags": [ + "Reporting" + ], + "summary": "Leave Liability Report", + "description": "Generates a leave liability report.", + "operationId": "ReportsLeaveLiability_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "model.locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model.leaveTypeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model.includeApprovedLeave", + "in": "query", + "required": false, + "type": "boolean", + "title": "Boolean" + }, + { + "name": "model.asAtDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "Nullable" + }, + { + "name": "model.employingEntityId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/LeaveLiabilityReportExportModel" + }, + "xml": { + "name": "LeaveLiabilityReportExportModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + } + }, + "/api/v2/business/{businessId}/rostershift": { + "get": { + "tags": [ + "RosterShift" + ], + "summary": "Get Roster Shifts", + "description": "Gets roster shifts, optionally filtered by a number of parameters.", + "operationId": "RosterShift_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "filter.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "filter.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "filter.resourceView", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "Employee", + "Location" + ], + "title": "ResourceViewEnum" + }, + { + "name": "filter.shiftStatus", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "All", + "Published", + "Unpublished", + "Accepted" + ], + "title": "RosterShiftStatus" + }, + { + "name": "filter.shiftStatuses", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string", + "enum": [ + "All", + "Published", + "Unpublished", + "Accepted" + ], + "title": "RosterShiftStatus" + }, + "collectionFormat": "multi", + "title": "IList" + }, + { + "name": "filter.selectedLocations", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "collectionFormat": "multi", + "title": "IList" + }, + { + "name": "filter.selectedEmployees", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "collectionFormat": "multi", + "title": "IList" + }, + { + "name": "filter.selectedRoles", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "collectionFormat": "multi", + "title": "IList" + }, + { + "name": "filter.includeSublocations", + "in": "query", + "required": false, + "type": "boolean", + "title": "Boolean" + }, + { + "name": "filter.currentView", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "resourceDay", + "resourceWeek", + "resourceNextWeeks" + ], + "title": "RosterViewMode" + }, + { + "name": "filter.budgetWarningPercent", + "in": "query", + "required": false, + "type": "number", + "format": "double", + "title": "Decimal" + }, + { + "name": "filter.employeeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "filter.locationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "filter.employeeGroupId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "filter.unassignedShiftsOnly", + "in": "query", + "required": false, + "type": "boolean", + "title": "Boolean" + }, + { + "name": "filter.showCosts", + "in": "query", + "required": false, + "type": "boolean", + "title": "Boolean" + }, + { + "name": "filter.groupBy", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "Business", + "Location" + ], + "title": "RosterGroupByEnum" + }, + { + "name": "filter.groupByThen", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "Employee", + "Role", + "StartingTime" + ], + "title": "RosterGroupByThenEnum" + }, + { + "name": "filter.excludeUnassignedEmployees", + "in": "query", + "required": false, + "type": "boolean", + "title": "Boolean" + }, + { + "name": "filter.selectAllRoles", + "in": "query", + "required": false, + "type": "boolean", + "title": "Boolean" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/RosterShiftGenerateTimesheetModel" + }, + "xml": { + "name": "RosterShiftGenerateTimesheetModel", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/business/{businessId}/rostershift/{rosterShiftId}/stub": { + "post": { + "tags": [ + "RosterShift" + ], + "summary": "Stub Shift Timesheets", + "description": "Generates timesheets for the roster shift with the specified ID.", + "operationId": "RosterShift_StubShiftTimesheets", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [], + "parameters": [ + { + "name": "rosterShiftId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/StubRosterShiftViewModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/api/v2/business/{businessId}/rostershift/{employeeId}/nearby": { + "get": { + "tags": [ + "RosterShift" + ], + "summary": "Find Nearby Roster Shifts", + "description": "Finds any of the employee's roster shifts that are nearby to the specified local time.", + "operationId": "RosterShift_NearbyRosterShifts", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "localTime", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/EssRosterShiftModel" + }, + "xml": { + "name": "EssRosterShiftModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/business/{businessId}/rostershift/{employeeId}/matchingclockon": { + "get": { + "tags": [ + "RosterShift" + ], + "summary": "Find Matching Clock On Roster Shift", + "description": "If a roster shift exists that could match for this employee to clock on at this time \r\ngiven kiosk settings for shift matching, returns that shift.\r\nOtherwise, the Shift result will be null.\r\nNote that if the time matches a shift exactly, the Shift result will also be null.", + "operationId": "RosterShift_MatchingClockOnRosterShift", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "kioskId", + "in": "query", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "dateUtc", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/RosterShiftMatchingResultModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/rostershift/{employeeId}/matchingclockoff": { + "get": { + "tags": [ + "RosterShift" + ], + "summary": "Find Matching Clock Off Roster Shift", + "description": "If a roster shift exists that could match for this employee to clock off at this time \r\ngiven kiosk settings for shift matching, returns that shift.\r\nOtherwise, the Shift result will be null.\r\nNote that if the time matches a shift exactly, the Shift result will also be null.", + "operationId": "RosterShift_MatchingClockOffRosterShift", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "kioskId", + "in": "query", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "dateUtc", + "in": "query", + "required": true, + "type": "string", + "format": "date-time", + "title": "DateTime" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/RosterShiftMatchingResultModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/selfmanagedsuperfund": { + "get": { + "tags": [ + "SuperFund" + ], + "summary": "List Self Managed Super Funds", + "description": "Lists all the self managed super funds for the business.\n\nThis operation supports OData queries.", + "operationId": "SelfManagedSuperFund_GetFunds", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/SelfManagedSuperFundModel" + }, + "xml": { + "name": "SelfManagedSuperFundModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "SuperFund" + ], + "summary": "Create Self Managed Super Fund", + "description": "Creates a new self managed super fund for the business.", + "operationId": "SelfManagedSuperFund_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "fund", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SelfManagedSuperFundModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/selfmanagedsuperfund/{id}": { + "get": { + "tags": [ + "SuperFund" + ], + "summary": "Get Self Managed Super Fund by ID", + "description": "Gets the self managed super fund with the specified ID.", + "operationId": "SelfManagedSuperFund_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/SelfManagedSuperFundModel" + } + } + } + }, + "put": { + "tags": [ + "SuperFund" + ], + "summary": "Update Self Managed Super Fund", + "description": "Updates .", + "operationId": "SelfManagedSuperFund_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "fund", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SelfManagedSuperFundModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/superfund/productsearch": { + "get": { + "tags": [ + "SuperFund" + ], + "summary": "Search Super Funds", + "description": "Search for super funds based on a string.", + "operationId": "SuperFund_ProductSearch", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "term", + "in": "query", + "required": true, + "type": "string", + "title": "String" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/SuperProductEditModel" + }, + "xml": { + "name": "SuperProductEditModel", + "wrapped": true + }, + "title": "List" + } + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/hasaccess/{employeeId}": { + "get": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Employee Has Access", + "description": "Check if an employee has access to a kiosk.", + "operationId": "TimeAndAttendance_GetHasAccess", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/{kioskId}/staff": { + "get": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "List Kiosk Staff", + "description": "Lists all the staff associated with a kiosk.", + "operationId": "TimeAndAttendance_GetStaff", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "kioskId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/BasicKioskEmployeeModel" + }, + "xml": { + "name": "BasicKioskEmployeeModel", + "wrapped": true + }, + "title": "List" + } + } + } + }, + "post": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Add an Employee", + "description": "Quickly add an employee with minimal details and kiosk enabled. If the employee already exists, the kiosk will be enabled for that employee.", + "operationId": "TimeAndAttendance_PostStaff", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "kioskId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/KioskCreateEmployeeModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/{kioskId}/checkid": { + "post": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Check Employee", + "description": "If the specified employee has kiosk access, returns details about the employee and their current shift.", + "operationId": "TimeAndAttendance_CheckId", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CheckKioskEmployeeIdModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "kioskId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/{kioskId}/checkpin": { + "post": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Verify Kiosk PIN", + "description": "Verifies the employee's kiosk PIN. Returns error code 400 if the PIN is incorrect.", + "operationId": "TimeAndAttendance_CheckPin", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CheckKioskPinModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "kioskId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/{kioskId}/clockon": { + "post": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Clock In Employee", + "description": "Clocks in an employee for a new shift.", + "operationId": "TimeAndAttendance_ClockOn", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "kioskId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ClockOnModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/{kioskId}/clockoff": { + "post": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Clock Out Employee", + "description": "Clocks out an employee from their existing shift. \r\nIf they are on a break, it will be ended automatically.", + "operationId": "TimeAndAttendance_ClockOff", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "kioskId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ClockOffModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/{kioskId}/startbreak": { + "post": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Start Break", + "description": "Starts a break for an employee who is clocked on for a shift.", + "operationId": "TimeAndAttendance_StartBreak", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "kioskId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/StartBreakModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/{kioskId}/endbreak": { + "post": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "End Break", + "description": "Ends the employee's current break.", + "operationId": "TimeAndAttendance_EndBreak", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "kioskId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EndBreakModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/shifts": { + "post": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Shifts", + "description": "Gets shifts based on certain optional criteria.", + "operationId": "TimeAndAttendance_Shifts", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/GetShiftsModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TimeAndAttendanceShiftModel" + }, + "xml": { + "name": "TimeAndAttendanceShiftModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/{kioskId}/changepin": { + "post": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Change PIN", + "description": "Changes the kiosk PIN for an employee, given their old PIN.", + "operationId": "TimeAndAttendance_ChangePin", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "kioskId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ChangeKioskPinModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/{kioskId}/emailreset": { + "post": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Send PIN Reset Email", + "description": "Sends kiosk PIN reset instructions to an employee by email.", + "operationId": "TimeAndAttendance_EmailReset", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PinResetModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "kioskId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/{kioskId}/smsreset": { + "post": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Send PIN Reset SMS", + "description": "Sends kiosk PIN reset instructions to an employee by SMS. Note that the current business must have SMS notifications enabled.", + "operationId": "TimeAndAttendance_SmsReset", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PinResetModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "kioskId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/{kioskId}/discard": { + "post": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Discard current shift", + "description": "Discards the current shift for an employee. \r\nIf they are on a break, it will be ended automatically.", + "operationId": "TimeAndAttendance_DiscardShift", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "kioskId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ClockOffModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/{kioskId}/lookupdata/{employeeId}": { + "get": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Get Employee Lookup Data", + "description": "Gets relevant lookup data for an employee in relation to a kiosk.", + "operationId": "TimeAndAttendance_GetLookupData", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "kioskId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "employeeId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/TimeAndAttendanceLookupDataModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/{kioskId}/shift/{shiftId}/notes": { + "get": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Get Shift Notes", + "description": "Gets all the notes for a specific shift.", + "operationId": "TimeAndAttendance_GetShiftNotes", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "kioskId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "shiftId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "model.employeeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model.isAdminInitiated", + "in": "query", + "required": false, + "type": "boolean", + "title": "Boolean" + }, + { + "name": "model.type", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "Shift", + "ClockOn", + "ClockOff" + ], + "title": "Nullable" + }, + { + "name": "model.visibility", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "Hidden", + "Visible" + ], + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Add Note to Shift", + "description": "Adds a note to an existing shift.", + "operationId": "TimeAndAttendance_AddNote", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "kioskId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "shiftId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/AddNoteModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/{kioskId}/shift/{shiftId}/notes/{noteId}": { + "delete": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Delete Note from Shift", + "description": "Deletes a note from an existing shift.", + "operationId": "TimeAndAttendance_DeleteNote", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "kioskId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "shiftId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "noteId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/{kioskId}/shift/{shiftId}/notes/read-state": { + "post": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Mark Shift Notes Read", + "description": "Marks some shift notes as either read or unread.", + "operationId": "TimeAndAttendance_MarkNotesRead", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/MarkNotesReadViewModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "kioskId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "shiftId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/kiosk": { + "get": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "List Kiosks", + "description": "Lists all kiosks for the specified business.\n\nThis operation supports OData queries.", + "operationId": "Kiosk_GetAll", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TimeAndAttendanceKioskModel" + }, + "xml": { + "name": "TimeAndAttendanceKioskModel", + "wrapped": true + }, + "title": "IQueryable" + } + } + } + }, + "post": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Create Kiosk", + "description": "Creates a new kiosk for the business.", + "operationId": "Kiosk_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "kiosk", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/TimeAndAttendanceKioskModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/kiosk/{id}": { + "get": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Get Kiosk by ID", + "description": "Gets the kiosk with the specified ID.", + "operationId": "Kiosk_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/TimeAndAttendanceKioskModel" + } + } + } + }, + "put": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Update Kiosk", + "description": "Updates the kiosk with the specified ID.", + "operationId": "Kiosk_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "kiosk", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/TimeAndAttendanceKioskModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "TimeAndAttendance" + ], + "summary": "Delete Kiosk", + "description": "Deletes the kiosk with the specified ID.", + "operationId": "Kiosk_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/timesheet": { + "get": { + "tags": [ + "Timesheets" + ], + "summary": "Get Business Timesheets", + "description": "Retrieves all timesheets for the specified business.\n\nThis operation supports OData queries.", + "operationId": "Timesheet_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TimesheetLineModel" + }, + "xml": { + "name": "TimesheetLineModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + } + }, + "/api/v2/business/{businessId}/timesheet/bulk": { + "put": { + "tags": [ + "Timesheets" + ], + "summary": "Update/Replace timesheets", + "description": "Performs the same action as 'Bulk Insert Timesheets', but any existing timesheets \r\nfor the specified employees within the specified time period \r\n(StartTime - EndTime) will be replaced with the timesheets specified.", + "operationId": "Timesheet_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SubmitTimesheetsRequest" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "Timesheets" + ], + "summary": "Bulk Insert Timesheets", + "description": "Adds timesheets for the specified business. This will not replace any existing timesheets.", + "operationId": "Timesheet_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SubmitTimesheetsRequest" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/unavailability": { + "get": { + "tags": [ + "Unavailability" + ], + "summary": "List Unavailabilities", + "description": "Lists all of the unavailabilities for this business, with optional filters.", + "operationId": "Unavailability_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "filter.fromDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "Nullable" + }, + { + "name": "filter.toDate", + "in": "query", + "required": false, + "type": "string", + "format": "date-time", + "title": "Nullable" + }, + { + "name": "filter.employeeId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "filter.defaultLocationId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/UnavailabilityModel" + }, + "xml": { + "name": "UnavailabilityModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "Unavailability" + ], + "summary": "Create Unavailability", + "description": "Creates a new unavailability for the employee.", + "operationId": "Unavailability_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "unavailabilityModel", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UnavailabilityModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/UnavailabilityModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/unavailability/{id}": { + "get": { + "tags": [ + "Unavailability" + ], + "summary": "Get unavailability by ID", + "description": "Gets the unavailability with the specified ID.", + "operationId": "Unavailability_GetApiV2BusinessByBusinessIdUnavailabilityById", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/UnavailabilityModel" + } + } + } + }, + "put": { + "tags": [ + "Unavailability" + ], + "summary": "Update Unavailability", + "description": "Updates the unavailability with the specified ID.", + "operationId": "Unavailability_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "unavailabilityModel", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UnavailabilityModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Unavailability" + ], + "summary": "Delete Unavailability", + "description": "Deletes the unavailability with the specified ID.", + "operationId": "Unavailability_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/user": { + "get": { + "tags": [ + "User" + ], + "summary": "Get User Details", + "description": "Gets details about the user.", + "operationId": "User_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/UserModel" + } + } + } + }, + "post": { + "tags": [ + "User" + ], + "summary": "Create New User", + "description": "Creates a new user.", + "operationId": "User_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "model", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/NewUserModel" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/webhookregistrations": { + "get": { + "tags": [ + "Webhook" + ], + "summary": "List Web Hook Registrations", + "description": "Returns a collection containing the registered web hook instances for the user.", + "operationId": "WebHookRegistrations_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/WebHook" + }, + "xml": { + "name": "WebHook", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "Webhook" + ], + "summary": "Register Web Hook", + "description": "Registers a new web hook.", + "operationId": "WebHookRegistrations_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "webHook", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/WebHook" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/WebHook" + } + } + } + }, + "delete": { + "tags": [ + "Webhook" + ], + "summary": "Delete all Web Hook Registrations", + "description": "Deletes all the web hook registrations.", + "operationId": "WebHookRegistrations_DeleteAll", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "title": "IHttpActionResult" + } + } + } + } + }, + "/api/v2/business/{businessId}/webhookregistrations/{id}": { + "get": { + "tags": [ + "Webhook" + ], + "summary": "Get Web Hook Registration by ID", + "description": "Gets the registered web hook instance with the specified ID.", + "operationId": "WebHookRegistrations_Lookup", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string", + "title": "String" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/WebHook" + } + } + } + }, + "put": { + "tags": [ + "Webhook" + ], + "summary": "Update Web Hook Registration", + "description": "Updates the web hook registration with the specified ID.", + "operationId": "WebHookRegistrations_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string", + "title": "String" + }, + { + "name": "webHook", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/WebHook" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "title": "IHttpActionResult" + } + } + } + }, + "delete": { + "tags": [ + "Webhook" + ], + "summary": "Delete Web Hook Registration", + "description": "Deletes the web hook registration with the specified ID.", + "operationId": "WebHookRegistrations_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string", + "title": "String" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "title": "IHttpActionResult" + } + } + } + } + }, + "/api/v2/business/{businessId}/webhookregistrations/{id}/test": { + "get": { + "tags": [ + "Webhook" + ], + "summary": "Test Web Hook", + "description": "Tests a web hook given a registration ID and a filter string.", + "operationId": "WebHookRegistrations_Test", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string", + "title": "String" + }, + { + "name": "filter", + "in": "query", + "required": true, + "type": "string", + "title": "String" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "title": "IHttpActionResult" + } + } + } + } + }, + "/api/v2/whitelabel": { + "get": { + "tags": [ + "WhiteLabel" + ], + "summary": "List White Labels", + "description": "Lists all the white labels to which you have access.", + "operationId": "WhiteLabel_GetWhiteLabels", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/WhiteLabelModel" + }, + "xml": { + "name": "WhiteLabelModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + } + }, + "/api/v2/whitelabel/{id}": { + "get": { + "tags": [ + "WhiteLabel" + ], + "summary": "Get White Label by ID", + "description": "Gets the white label with the specified ID.", + "operationId": "WhiteLabel_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/WhiteLabelModel" + } + } + } + } + }, + "/api/v2/whitelabel/{whiteLabelId}/Invoice": { + "get": { + "tags": [ + "WhiteLabel" + ], + "summary": "Get Invoices", + "description": "Get invoices for the specified business or white label.", + "operationId": "Invoice_GetInvoices", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "whiteLabelId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/InvoiceModel" + }, + "xml": { + "name": "InvoiceModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/business/{businessId}/Invoice": { + "get": { + "tags": [ + "WhiteLabel" + ], + "summary": "Get Invoices", + "description": "Get invoices for the specified business or white label.", + "operationId": "Invoice_GetApiV2BusinessByBusinessIdInvoice", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "whiteLabelId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/InvoiceModel" + }, + "xml": { + "name": "InvoiceModel", + "wrapped": true + }, + "title": "IList" + } + } + } + } + }, + "/api/v2/whitelabel/{whiteLabelId}/Invoice/{id}": { + "get": { + "tags": [ + "WhiteLabel" + ], + "summary": "Get Invoice By ID", + "description": "Gets the invoice with the specified ID.", + "operationId": "Invoice_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "whiteLabelId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/InvoiceModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/Invoice/{id}": { + "get": { + "tags": [ + "WhiteLabel" + ], + "summary": "Get Invoice By ID", + "description": "Gets the invoice with the specified ID.", + "operationId": "Invoice_GetApiV2BusinessByBusinessIdInvoiceById", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Nullable" + }, + { + "name": "whiteLabelId", + "in": "query", + "required": false, + "type": "integer", + "format": "int32", + "title": "Nullable" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/InvoiceModel" + } + } + } + } + }, + "/api/v2/business/{businessId}/worktype": { + "get": { + "tags": [ + "WorkType" + ], + "summary": "List Work Types", + "description": "Lists all the work types for the business.\n\nThis operation supports OData queries.", + "operationId": "WorkType_GetWorkTypes", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/WorkTypeModel" + }, + "xml": { + "name": "WorkTypeModel", + "wrapped": true + }, + "title": "IEnumerable" + } + } + } + }, + "post": { + "tags": [ + "WorkType" + ], + "summary": "Create Work Type", + "description": "Creates a new work type for the business.", + "operationId": "WorkType_Post", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "workType", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/WorkTypeModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v2/business/{businessId}/worktype/{id}": { + "get": { + "tags": [ + "WorkType" + ], + "summary": "Get Work Type by ID", + "description": "Gets the work type with the specified ID.", + "operationId": "WorkType_Get", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/WorkTypeModel" + } + } + } + }, + "put": { + "tags": [ + "WorkType" + ], + "summary": "Update Work Type", + "description": "Updates the work type with the specified ID.", + "operationId": "WorkType_Put", + "consumes": [ + "application/json", + "text/json", + "application/xml", + "text/xml", + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "workType", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/WorkTypeModel" + } + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "WorkType" + ], + "summary": "Delete Work Type", + "description": "Deletes the work type with the specified ID.", + "operationId": "WorkType_Delete", + "consumes": [], + "produces": [ + "application/json", + "text/json", + "application/xml", + "text/xml" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "title": "Int32" + }, + { + "name": "businessId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + } + }, + "definitions": { + "ODataQueryOptions[AbaDetails]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "ODataQueryContext": { + "type": "object", + "properties": { + "model": { + "$ref": "#/definitions/IEdmModel", + "readOnly": true + }, + "elementType": { + "$ref": "#/definitions/IEdmType", + "readOnly": true + }, + "elementClrType": { + "type": "string", + "readOnly": true, + "title": "Type" + } + }, + "xml": { + "name": "ODataQueryContext" + }, + "title": "ODataQueryContext" + }, + "ODataRawQueryOptions": { + "type": "object", + "properties": { + "filter": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "orderBy": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "top": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "skip": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "select": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "expand": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "inlineCount": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "format": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "skipToken": { + "type": "string", + "readOnly": true, + "title": "String" + } + }, + "xml": { + "name": "ODataRawQueryOptions" + }, + "title": "ODataRawQueryOptions" + }, + "SelectExpandQueryOption": { + "type": "object", + "properties": { + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "rawSelect": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "rawExpand": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "validator": { + "$ref": "#/definitions/SelectExpandQueryValidator" + }, + "selectExpandClause": { + "$ref": "#/definitions/SelectExpandClause", + "readOnly": true + } + }, + "xml": { + "name": "SelectExpandQueryOption" + }, + "title": "SelectExpandQueryOption" + }, + "FilterQueryOption": { + "type": "object", + "properties": { + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/FilterQueryValidator" + }, + "filterClause": { + "$ref": "#/definitions/FilterClause", + "readOnly": true + }, + "rawValue": { + "type": "string", + "readOnly": true, + "title": "String" + } + }, + "xml": { + "name": "FilterQueryOption" + }, + "title": "FilterQueryOption" + }, + "OrderByQueryOption": { + "type": "object", + "properties": { + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "orderByNodes": { + "type": "array", + "items": { + "$ref": "#/definitions/OrderByNode" + }, + "readOnly": true, + "xml": { + "name": "OrderByNode", + "wrapped": true + }, + "title": "IList" + }, + "rawValue": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "validator": { + "$ref": "#/definitions/OrderByQueryValidator" + }, + "orderByClause": { + "$ref": "#/definitions/OrderByClause", + "readOnly": true + } + }, + "xml": { + "name": "OrderByQueryOption" + }, + "title": "OrderByQueryOption" + }, + "SkipQueryOption": { + "type": "object", + "properties": { + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "rawValue": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "value": { + "format": "int32", + "type": "integer", + "readOnly": true, + "title": "Int32" + }, + "validator": { + "$ref": "#/definitions/SkipQueryValidator" + } + }, + "xml": { + "name": "SkipQueryOption" + }, + "title": "SkipQueryOption" + }, + "TopQueryOption": { + "type": "object", + "properties": { + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "rawValue": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "value": { + "format": "int32", + "type": "integer", + "readOnly": true, + "title": "Int32" + }, + "validator": { + "$ref": "#/definitions/TopQueryValidator" + } + }, + "xml": { + "name": "TopQueryOption" + }, + "title": "TopQueryOption" + }, + "InlineCountQueryOption": { + "type": "object", + "properties": { + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "rawValue": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "value": { + "enum": [ + "None", + "AllPages" + ], + "type": "string", + "readOnly": true, + "title": "InlineCountValue" + } + }, + "xml": { + "name": "InlineCountQueryOption" + }, + "title": "InlineCountQueryOption" + }, + "ODataQueryValidator": { + "type": "object", + "properties": {}, + "xml": { + "name": "ODataQueryValidator" + }, + "title": "ODataQueryValidator" + }, + "IEdmModel": { + "type": "object", + "properties": { + "schemaElements": { + "type": "array", + "items": { + "$ref": "#/definitions/IEdmSchemaElement" + }, + "readOnly": true, + "xml": { + "name": "IEdmSchemaElement", + "wrapped": true + }, + "title": "IEnumerable" + }, + "vocabularyAnnotations": { + "type": "array", + "items": { + "$ref": "#/definitions/IEdmVocabularyAnnotation" + }, + "readOnly": true, + "xml": { + "name": "IEdmVocabularyAnnotation", + "wrapped": true + }, + "title": "IEnumerable" + }, + "referencedModels": { + "type": "array", + "items": { + "$ref": "#/definitions/IEdmModel" + }, + "readOnly": true, + "xml": { + "name": "IEdmModel", + "wrapped": true + }, + "title": "IEnumerable" + }, + "directValueAnnotationsManager": { + "$ref": "#/definitions/IEdmDirectValueAnnotationsManager", + "readOnly": true + } + }, + "xml": { + "name": "IEdmModel" + }, + "title": "IEdmModel" + }, + "IEdmType": { + "type": "object", + "properties": { + "typeKind": { + "enum": [ + "None", + "Primitive", + "Entity", + "Complex", + "Row", + "Collection", + "EntityReference", + "Enum" + ], + "type": "string", + "readOnly": true, + "title": "EdmTypeKind" + } + }, + "xml": { + "name": "IEdmType" + }, + "title": "IEdmType" + }, + "SelectExpandQueryValidator": { + "type": "object", + "properties": {}, + "xml": { + "name": "SelectExpandQueryValidator" + }, + "title": "SelectExpandQueryValidator" + }, + "SelectExpandClause": { + "type": "object", + "properties": { + "selectedItems": { + "type": "array", + "items": { + "$ref": "#/definitions/SelectItem" + }, + "readOnly": true, + "xml": { + "name": "SelectItem", + "wrapped": true + }, + "title": "IEnumerable" + }, + "allSelected": { + "type": "boolean", + "readOnly": true, + "title": "Boolean" + } + }, + "xml": { + "name": "SelectExpandClause" + }, + "title": "SelectExpandClause" + }, + "FilterQueryValidator": { + "type": "object", + "properties": {}, + "xml": { + "name": "FilterQueryValidator" + }, + "title": "FilterQueryValidator" + }, + "FilterClause": { + "type": "object", + "properties": { + "expression": { + "$ref": "#/definitions/SingleValueNode", + "readOnly": true + }, + "rangeVariable": { + "$ref": "#/definitions/RangeVariable", + "readOnly": true + }, + "itemType": { + "$ref": "#/definitions/IEdmTypeReference", + "readOnly": true + } + }, + "xml": { + "name": "FilterClause" + }, + "title": "FilterClause" + }, + "OrderByNode": { + "type": "object", + "properties": { + "direction": { + "enum": [ + "Ascending", + "Descending" + ], + "type": "string", + "readOnly": true, + "title": "OrderByDirection" + } + }, + "xml": { + "name": "OrderByNode" + }, + "title": "OrderByNode" + }, + "OrderByQueryValidator": { + "type": "object", + "properties": {}, + "xml": { + "name": "OrderByQueryValidator" + }, + "title": "OrderByQueryValidator" + }, + "OrderByClause": { + "type": "object", + "properties": { + "thenBy": { + "$ref": "#/definitions/OrderByClause", + "readOnly": true + }, + "expression": { + "$ref": "#/definitions/SingleValueNode", + "readOnly": true + }, + "direction": { + "enum": [ + "Ascending", + "Descending" + ], + "type": "string", + "readOnly": true, + "title": "OrderByDirection" + }, + "rangeVariable": { + "$ref": "#/definitions/RangeVariable", + "readOnly": true + }, + "itemType": { + "$ref": "#/definitions/IEdmTypeReference", + "readOnly": true + } + }, + "xml": { + "name": "OrderByClause" + }, + "title": "OrderByClause" + }, + "SkipQueryValidator": { + "type": "object", + "properties": {}, + "xml": { + "name": "SkipQueryValidator" + }, + "title": "SkipQueryValidator" + }, + "TopQueryValidator": { + "type": "object", + "properties": {}, + "xml": { + "name": "TopQueryValidator" + }, + "title": "TopQueryValidator" + }, + "IEdmSchemaElement": { + "type": "object", + "properties": { + "schemaElementKind": { + "enum": [ + "None", + "TypeDefinition", + "Function", + "ValueTerm", + "EntityContainer" + ], + "type": "string", + "readOnly": true, + "title": "EdmSchemaElementKind" + }, + "namespace": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "name": { + "type": "string", + "readOnly": true, + "title": "String" + } + }, + "xml": { + "name": "IEdmSchemaElement" + }, + "title": "IEdmSchemaElement" + }, + "IEdmVocabularyAnnotation": { + "type": "object", + "properties": { + "qualifier": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "term": { + "$ref": "#/definitions/IEdmTerm", + "readOnly": true + }, + "target": { + "$ref": "#/definitions/IEdmVocabularyAnnotatable", + "readOnly": true + } + }, + "xml": { + "name": "IEdmVocabularyAnnotation" + }, + "title": "IEdmVocabularyAnnotation" + }, + "IEdmDirectValueAnnotationsManager": { + "type": "object", + "properties": {}, + "xml": { + "name": "IEdmDirectValueAnnotationsManager" + }, + "title": "IEdmDirectValueAnnotationsManager" + }, + "SelectItem": { + "type": "object", + "properties": {}, + "xml": { + "name": "SelectItem" + }, + "title": "SelectItem" + }, + "SingleValueNode": { + "type": "object", + "properties": { + "typeReference": { + "$ref": "#/definitions/IEdmTypeReference", + "readOnly": true + }, + "kind": { + "enum": [ + "None", + "Constant", + "Convert", + "NonentityRangeVariableReference", + "BinaryOperator", + "UnaryOperator", + "SingleValuePropertyAccess", + "CollectionPropertyAccess", + "SingleValueFunctionCall", + "Any", + "CollectionNavigationNode", + "SingleNavigationNode", + "SingleValueOpenPropertyAccess", + "SingleEntityCast", + "All", + "EntityCollectionCast", + "EntityRangeVariableReference", + "SingleEntityFunctionCall", + "CollectionFunctionCall", + "EntityCollectionFunctionCall", + "NamedFunctionParameter" + ], + "type": "string", + "readOnly": true, + "title": "QueryNodeKind" + } + }, + "xml": { + "name": "SingleValueNode" + }, + "title": "SingleValueNode" + }, + "RangeVariable": { + "type": "object", + "properties": { + "name": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "typeReference": { + "$ref": "#/definitions/IEdmTypeReference", + "readOnly": true + }, + "kind": { + "format": "int32", + "type": "integer", + "readOnly": true, + "title": "Int32" + } + }, + "xml": { + "name": "RangeVariable" + }, + "title": "RangeVariable" + }, + "IEdmTypeReference": { + "type": "object", + "properties": { + "isNullable": { + "type": "boolean", + "readOnly": true, + "title": "Boolean" + }, + "definition": { + "$ref": "#/definitions/IEdmType", + "readOnly": true + } + }, + "xml": { + "name": "IEdmTypeReference" + }, + "title": "IEdmTypeReference" + }, + "IEdmTerm": { + "type": "object", + "properties": { + "termKind": { + "enum": [ + "None", + "Type", + "Value" + ], + "type": "string", + "readOnly": true, + "title": "EdmTermKind" + }, + "schemaElementKind": { + "enum": [ + "None", + "TypeDefinition", + "Function", + "ValueTerm", + "EntityContainer" + ], + "type": "string", + "readOnly": true, + "title": "EdmSchemaElementKind" + }, + "namespace": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "name": { + "type": "string", + "readOnly": true, + "title": "String" + } + }, + "xml": { + "name": "IEdmTerm" + }, + "title": "IEdmTerm" + }, + "IEdmVocabularyAnnotatable": { + "type": "object", + "properties": {}, + "xml": { + "name": "IEdmVocabularyAnnotatable" + }, + "title": "IEdmVocabularyAnnotatable" + }, + "BusinessAbaModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "bsb": { + "type": "string", + "title": "String" + }, + "accountNumber": { + "type": "string", + "title": "String" + }, + "accountName": { + "type": "string", + "title": "String" + }, + "financialInstitutionCode": { + "type": "string", + "title": "String" + }, + "lodgementReference": { + "type": "string", + "title": "String" + }, + "userName": { + "type": "string", + "title": "String" + }, + "userId": { + "type": "string", + "title": "String" + }, + "includeSelfBalancingTransaction": { + "type": "boolean", + "title": "Boolean" + }, + "mergeMultipleAccountPayments": { + "type": "boolean", + "title": "Boolean" + }, + "balanceLodgementReference": { + "type": "string", + "title": "String" + }, + "paymentAdditionalContent": { + "enum": [ + "None", + "PeriodEndingDate", + "PaymentDate", + "EmployeeId" + ], + "type": "string", + "title": "Nullable" + }, + "balanceAdditionalContent": { + "enum": [ + "None", + "PeriodEndingDate", + "PaymentDate", + "PayRunId" + ], + "type": "string", + "title": "Nullable" + } + }, + "xml": { + "name": "BusinessAbaModel" + }, + "title": "BusinessAbaModel" + }, + "SingleSignOnRequestModel": { + "type": "object", + "properties": { + "businessId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "userName": { + "type": "string", + "title": "String" + }, + "url": { + "type": "string", + "title": "String" + }, + "navigation": { + "enum": [ + "Full", + "Primary", + "Secondary", + "None" + ], + "type": "string", + "title": "NavigationDisplayEnum" + }, + "hostName": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "SingleSignOnRequestModel" + }, + "title": "SingleSignOnRequestModel" + }, + "SingleSignOnResponseModel": { + "type": "object", + "properties": { + "url": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "SingleSignOnResponseModel" + }, + "title": "SingleSignOnResponseModel" + }, + "TimesheetRoundingRulesModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "shiftStartRoundingDirection": { + "enum": [ + "None", + "Up", + "Down", + "ToTheNearest" + ], + "type": "string", + "title": "RoundingDirectionEnum" + }, + "shiftStartRoundingInterval": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "shiftEndRoundingDirection": { + "enum": [ + "None", + "Up", + "Down", + "ToTheNearest" + ], + "type": "string", + "title": "RoundingDirectionEnum" + }, + "shiftEndRoundingInterval": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "breakStartRoundingDirection": { + "enum": [ + "None", + "Up", + "Down", + "ToTheNearest" + ], + "type": "string", + "title": "RoundingDirectionEnum" + }, + "breakStartRoundingInterval": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "breakEndRoundingDirection": { + "enum": [ + "None", + "Up", + "Down", + "ToTheNearest" + ], + "type": "string", + "title": "RoundingDirectionEnum" + }, + "breakEndRoundingInterval": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "roundUpToShiftStartTimeRoundingInterval": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "roundDownToShiftStartTimeRoundingInterval": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "roundUpToShiftEndTimeRoundingInterval": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "roundDownToShiftEndTimeRoundingInterval": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "TimesheetRoundingRulesModel" + }, + "title": "TimesheetRoundingRulesModel" + }, + "BusinessAtoSupplierModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "abn": { + "type": "string", + "title": "String" + }, + "name": { + "type": "string", + "title": "String" + }, + "addressLine1": { + "type": "string", + "title": "String" + }, + "addressLine2": { + "type": "string", + "title": "String" + }, + "suburb": { + "type": "string", + "title": "String" + }, + "state": { + "type": "string", + "title": "String" + }, + "postCode": { + "type": "string", + "title": "String" + }, + "contactName": { + "type": "string", + "title": "String" + }, + "signatoryName": { + "type": "string", + "title": "String" + }, + "phoneNumber": { + "type": "string", + "title": "String" + }, + "faxNumber": { + "type": "string", + "title": "String" + }, + "country": { + "type": "string", + "title": "String" + }, + "branch": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "BusinessAtoSupplierModel" + }, + "title": "BusinessAtoSupplierModel" + }, + "EntitlementsModel": { + "type": "object", + "properties": { + "planName": { + "type": "string", + "title": "String" + }, + "trialExpiryDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "features": { + "type": "array", + "items": { + "$ref": "#/definitions/EntitlementFeatureModel" + }, + "xml": { + "name": "EntitlementFeatureModel", + "wrapped": true + }, + "title": "IList" + } + }, + "xml": { + "name": "EntitlementsModel" + }, + "title": "EntitlementsModel" + }, + "EntitlementFeatureModel": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EntitlementFeatureModel" + }, + "title": "EntitlementFeatureModel" + }, + "DocumentModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "friendlyName": { + "type": "string", + "title": "String" + }, + "dateCreated": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "visibleToAllEmployees": { + "type": "boolean", + "title": "Boolean" + }, + "selectedGroups": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeGroupItemModel" + }, + "xml": { + "name": "EmployeeGroupItemModel", + "wrapped": true + }, + "title": "List" + } + }, + "xml": { + "name": "DocumentModel" + }, + "title": "DocumentModel" + }, + "EmployeeGroupItemModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EmployeeGroupItemModel" + }, + "title": "EmployeeGroupItemModel" + }, + "UpdateDocumentPermissionsModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "visibleToAll": { + "type": "boolean", + "title": "Boolean" + }, + "employeeGroups": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "List" + } + }, + "xml": { + "name": "UpdateDocumentPermissionsModel" + }, + "title": "UpdateDocumentPermissionsModel" + }, + "DocumentFile": { + "type": "object", + "properties": { + "contentLength": { + "format": "int64", + "type": "integer", + "title": "Int64" + }, + "contentType": { + "type": "string", + "title": "String" + }, + "bytes": { + "format": "byte", + "type": "string", + "title": "Byte[]" + }, + "filename": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "DocumentFile" + }, + "title": "DocumentFile" + }, + "ODataQueryOptions[Business]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "BusinessModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "abn": { + "type": "string", + "title": "String" + }, + "registrationNumber": { + "type": "string", + "title": "String" + }, + "legalName": { + "type": "string", + "title": "String" + }, + "contactName": { + "type": "string", + "title": "String" + }, + "contactEmailAddress": { + "type": "string", + "title": "String" + }, + "contactPhoneNumber": { + "type": "string", + "title": "String" + }, + "contactFaxNumber": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "standardHoursPerDay": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "integratedTimesheetsEnabled": { + "type": "boolean", + "title": "Boolean" + }, + "journalService": { + "type": "string", + "title": "String" + }, + "endOfWeek": { + "enum": [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday" + ], + "type": "string", + "title": "DayOfWeek" + }, + "initialFinancialYearStart": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "managersCanEditRosterBudgets": { + "type": "boolean", + "title": "Nullable" + }, + "budgetWarningPercent": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "budgetEntryMethod": { + "enum": [ + "PercentageOfSales", + "Direct" + ], + "type": "string", + "title": "BudgetEntryMethodEnum" + }, + "addressLine1": { + "type": "string", + "title": "String" + }, + "addressLine2": { + "type": "string", + "title": "String" + }, + "suburb": { + "type": "string", + "title": "String" + }, + "postCode": { + "type": "string", + "title": "String" + }, + "state": { + "type": "string", + "title": "String" + }, + "whiteLabelName": { + "type": "string", + "title": "String" + }, + "dateCreated": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "city": { + "type": "string", + "title": "String" + }, + "county": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "BusinessModel" + }, + "title": "BusinessModel" + }, + "BusinessAccessModel": { + "type": "object", + "properties": { + "accessType": { + "enum": [ + "Unrestricted", + "Restricted" + ], + "type": "string", + "title": "RelatedUserType" + }, + "employeeGroups": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeGroupAccessModel" + }, + "xml": { + "name": "EmployeeGroupAccessModel", + "wrapped": true + }, + "title": "IList" + }, + "locationAccess": { + "type": "array", + "items": { + "$ref": "#/definitions/LocationAccessModel" + }, + "xml": { + "name": "LocationAccessModel", + "wrapped": true + }, + "title": "IList" + }, + "reports": { + "$ref": "#/definitions/ReportAccessModel" + }, + "name": { + "type": "string", + "title": "String" + }, + "email": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "BusinessAccessModel" + }, + "title": "BusinessAccessModel" + }, + "EmployeeGroupAccessModel": { + "type": "object", + "properties": { + "employeeGroupId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "permissions": { + "enum": [ + "ApproveTimesheets", + "ApproveLeaveRequests", + "CreateTimesheets", + "CreateLeaveRequests", + "ViewLeaveRequests", + "ManageRosters", + "ViewRosters", + "ViewShiftCosts", + "ViewExpenses", + "CreateExpenses", + "ApproveExpenses", + "CreateTasks" + ], + "type": "string", + "title": "UserPermission" + } + }, + "xml": { + "name": "EmployeeGroupAccessModel" + }, + "title": "EmployeeGroupAccessModel" + }, + "LocationAccessModel": { + "type": "object", + "properties": { + "filterType": { + "enum": [ + "Location", + "LocationOrParents" + ], + "type": "string", + "title": "LocationRestrictionFilterTypeEnum" + }, + "locationIds": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "List" + }, + "permissions": { + "enum": [ + "ApproveTimesheets", + "ApproveLeaveRequests", + "CreateTimesheets", + "CreateLeaveRequests", + "ViewLeaveRequests", + "ManageRosters", + "ViewRosters", + "ViewShiftCosts", + "ViewExpenses", + "CreateExpenses", + "ApproveExpenses", + "CreateTasks" + ], + "type": "string", + "title": "UserPermission" + } + }, + "xml": { + "name": "LocationAccessModel" + }, + "title": "LocationAccessModel" + }, + "ReportAccessModel": { + "type": "object", + "properties": { + "accessType": { + "enum": [ + "None", + "AllReports", + "SpecificReports" + ], + "type": "string", + "title": "ReportAccessType" + }, + "specificReports": { + "enum": [ + "DetailedActivityReport", + "PayRunComparisonReport", + "SuperContributionsReport", + "OrdinaryTimeEarningsReport", + "DeductionsReport", + "PayrollTaxReport", + "PaygReport", + "PayCategoriesReport", + "PayRunAuditReport", + "CostingReport", + "TimesheetReport", + "ExpensesReport", + "PaymentHistoryReport", + "LeaveBalancesReport", + "LeaveLiabilityReport", + "LeaveHistoryReport", + "BirthdayReport", + "EmployeeDetailsReport", + "UnpaidEmployeesReport", + "QualificationsReport", + "EmployeeSatisfactionReport", + "AttendanceReport", + "EmergencyContactsReport", + "EmployerLiabilitiesReport", + "PayRunVarianceReport", + "EmployeeDetailsAuditReport", + "GrossToNetReport", + "LiveView", + "TasksReport", + "ShiftSwappingReport" + ], + "type": "string", + "title": "ReportEnum" + } + }, + "xml": { + "name": "ReportAccessModel" + }, + "title": "ReportAccessModel" + }, + "CreateBusinessAccessModel": { + "type": "object", + "properties": { + "suppressNotificationEmails": { + "type": "boolean", + "title": "Boolean" + }, + "accessType": { + "enum": [ + "Unrestricted", + "Restricted" + ], + "type": "string", + "title": "RelatedUserType" + }, + "employeeGroups": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeGroupAccessModel" + }, + "xml": { + "name": "EmployeeGroupAccessModel", + "wrapped": true + }, + "title": "IList" + }, + "locationAccess": { + "type": "array", + "items": { + "$ref": "#/definitions/LocationAccessModel" + }, + "xml": { + "name": "LocationAccessModel", + "wrapped": true + }, + "title": "IList" + }, + "reports": { + "$ref": "#/definitions/ReportAccessModel" + }, + "name": { + "type": "string", + "title": "String" + }, + "email": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "CreateBusinessAccessModel" + }, + "title": "CreateBusinessAccessModel" + }, + "AccessModel": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "String" + }, + "email": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "AccessModel" + }, + "title": "AccessModel" + }, + "ODataQueryOptions[DeductionCategory]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "DeductionCategoryModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "taxExempt": { + "type": "boolean", + "title": "Boolean" + }, + "source": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "sgcCalculationImpact": { + "enum": [ + "None", + "ReducesOTE", + "ReducesOTEAndSGC" + ], + "type": "string", + "title": "SGCCalculationImpactEnum" + }, + "paymentSummaryClassification": { + "enum": [ + "Default", + "UnionOrProfessionalAssociationFees", + "WorkplaceGiving" + ], + "type": "string", + "title": "DeductionCategoryPaymentSummaryClassification" + }, + "expenseGeneralLedgerMappingCode": { + "type": "string", + "title": "String" + }, + "liabilityGeneralLedgerMappingCode": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "DeductionCategoryModel" + }, + "title": "DeductionCategoryModel" + }, + "WorkTypeModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "payCategoryId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "leaveCategoryId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "source": { + "type": "string", + "title": "String" + }, + "accruesLeave": { + "type": "boolean", + "title": "Boolean" + }, + "employmentTypes": { + "type": "array", + "items": { + "enum": [ + "Unknown", + "FullTime", + "PartTime", + "LabourHire", + "SuperannuationIncomeStream", + "Casual" + ], + "type": "string", + "title": "EmploymentTypeEnum" + }, + "xml": { + "name": "EmploymentTypeEnum", + "wrapped": true + }, + "title": "IList" + }, + "mappingType": { + "enum": [ + "PayCategory", + "LeaveCategory", + "PrimaryPayCategory", + "ShiftCondition" + ], + "type": "string", + "title": "Nullable" + }, + "shortCode": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "WorkTypeModel" + }, + "title": "WorkTypeModel" + }, + "ProfileImageMetadata": { + "type": "object", + "properties": { + "contentType": { + "type": "string", + "title": "String" + }, + "extension": { + "type": "string", + "title": "String" + }, + "width": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "height": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "ProfileImageMetadata" + }, + "title": "ProfileImageMetadata" + }, + "ODataQueryOptions[Employee]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "EmployeeDetailsModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": { + "type": "string", + "title": "String" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "preferredName": { + "type": "string", + "title": "String" + }, + "middleName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "gender": { + "type": "string", + "title": "String" + }, + "dateOfBirth": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "anniversaryDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "residentialStreetAddress": { + "type": "string", + "title": "String" + }, + "residentialAddressLine2": { + "type": "string", + "title": "String" + }, + "residentialSuburb": { + "type": "string", + "title": "String" + }, + "residentialState": { + "type": "string", + "title": "String" + }, + "residentialPostCode": { + "type": "string", + "title": "String" + }, + "postalStreetAddress": { + "type": "string", + "title": "String" + }, + "postalAddressLine2": { + "type": "string", + "title": "String" + }, + "postalSuburb": { + "type": "string", + "title": "String" + }, + "postalState": { + "type": "string", + "title": "String" + }, + "postalPostCode": { + "type": "string", + "title": "String" + }, + "emailAddress": { + "type": "string", + "title": "String" + }, + "homePhone": { + "type": "string", + "title": "String" + }, + "workPhone": { + "type": "string", + "title": "String" + }, + "mobilePhone": { + "type": "string", + "title": "String" + }, + "startDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "endDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "residentialCity": { + "type": "string", + "title": "String" + }, + "residentialCounty": { + "type": "string", + "title": "String" + }, + "postalCity": { + "type": "string", + "title": "String" + }, + "postalCounty": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EmployeeDetailsModel" + }, + "title": "EmployeeDetailsModel" + }, + "EmployeesFilter": { + "type": "object", + "properties": { + "payScheduleId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "EmployeesFilter" + }, + "title": "EmployeesFilter" + }, + "ODataQueryOptions[UnstructuredEmployeeModel]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "UnstructuredEmployeeModel": { + "type": "object", + "properties": { + "status": { + "enum": [ + "Active", + "Terminated", + "Incomplete" + ], + "type": "string", + "title": "EmployeeStatusEnum" + }, + "dateCreated": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "residentialCity": { + "type": "string", + "title": "String" + }, + "residentialCounty": { + "type": "string", + "title": "String" + }, + "postalCity": { + "type": "string", + "title": "String" + }, + "postalCounty": { + "type": "string", + "title": "String" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "taxFileNumber": { + "type": "string", + "title": "String" + }, + "title": { + "type": "string", + "title": "String" + }, + "preferredName": { + "type": "string", + "title": "String" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "middleName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "dateOfBirth": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "gender": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "residentialStreetAddress": { + "type": "string", + "title": "String" + }, + "residentialAddressLine2": { + "type": "string", + "title": "String" + }, + "residentialSuburb": { + "type": "string", + "title": "String" + }, + "residentialState": { + "type": "string", + "title": "String" + }, + "residentialPostCode": { + "type": "string", + "title": "String" + }, + "postalStreetAddress": { + "type": "string", + "title": "String" + }, + "postalAddressLine2": { + "type": "string", + "title": "String" + }, + "postalSuburb": { + "type": "string", + "title": "String" + }, + "postalState": { + "type": "string", + "title": "String" + }, + "postalPostCode": { + "type": "string", + "title": "String" + }, + "emailAddress": { + "type": "string", + "title": "String" + }, + "homePhone": { + "type": "string", + "title": "String" + }, + "workPhone": { + "type": "string", + "title": "String" + }, + "mobilePhone": { + "type": "string", + "title": "String" + }, + "startDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "endDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "anniversaryDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "tags": { + "type": "string", + "title": "String" + }, + "employingEntityABN": { + "type": "string", + "title": "String" + }, + "employmentType": { + "type": "string", + "title": "String" + }, + "previousSurname": { + "type": "string", + "title": "String" + }, + "australianResident": { + "type": "string", + "title": "String" + }, + "claimTaxFreeThreshold": { + "type": "string", + "title": "String" + }, + "seniorsTaxOffset": { + "type": "string", + "title": "String" + }, + "otherTaxOffset": { + "type": "string", + "title": "String" + }, + "helpDebt": { + "type": "string", + "title": "String" + }, + "afsDebt": { + "type": "string", + "title": "String" + }, + "isExemptFromFloodLevy": { + "type": "string", + "title": "String" + }, + "hasApprovedWorkingHolidayVisa": { + "type": "string", + "title": "String" + }, + "hasWithholdingVariation": { + "type": "string", + "title": "String" + }, + "taxVariation": { + "type": "string", + "title": "String" + }, + "dateTaxFileDeclarationSigned": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "dateTaxFileDeclarationReported": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "jobTitle": { + "type": "string", + "title": "String" + }, + "paySchedule": { + "type": "string", + "title": "String" + }, + "primaryPayCategory": { + "type": "string", + "title": "String" + }, + "primaryLocation": { + "type": "string", + "title": "String" + }, + "paySlipNotificationType": { + "type": "string", + "title": "String" + }, + "rate": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "overrideTemplateRate": { + "type": "string", + "title": "String" + }, + "rateUnit": { + "type": "string", + "title": "String" + }, + "hoursPerWeek": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "automaticallyPayEmployee": { + "type": "string", + "title": "String" + }, + "leaveTemplate": { + "type": "string", + "title": "String" + }, + "payRateTemplate": { + "type": "string", + "title": "String" + }, + "payConditionRuleSet": { + "type": "string", + "title": "String" + }, + "employmentAgreement": { + "type": "string", + "title": "String" + }, + "isEnabledForTimesheets": { + "type": "string", + "title": "String" + }, + "isExemptFromPayrollTax": { + "type": "string", + "title": "String" + }, + "locations": { + "type": "string", + "title": "String" + }, + "workTypes": { + "type": "string", + "title": "String" + }, + "emergencyContact1_Name": { + "type": "string", + "title": "String" + }, + "emergencyContact1_Relationship": { + "type": "string", + "title": "String" + }, + "emergencyContact1_Address": { + "type": "string", + "title": "String" + }, + "emergencyContact1_ContactNumber": { + "type": "string", + "title": "String" + }, + "emergencyContact1_AlternateContactNumber": { + "type": "string", + "title": "String" + }, + "emergencyContact2_Name": { + "type": "string", + "title": "String" + }, + "emergencyContact2_Relationship": { + "type": "string", + "title": "String" + }, + "emergencyContact2_Address": { + "type": "string", + "title": "String" + }, + "emergencyContact2_ContactNumber": { + "type": "string", + "title": "String" + }, + "emergencyContact2_AlternateContactNumber": { + "type": "string", + "title": "String" + }, + "bankAccount1_BSB": { + "type": "string", + "title": "String" + }, + "bankAccount1_AccountNumber": { + "type": "string", + "title": "String" + }, + "bankAccount1_AccountName": { + "type": "string", + "title": "String" + }, + "bankAccount1_AllocatedPercentage": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "bankAccount1_FixedAmount": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "bankAccount2_BSB": { + "type": "string", + "title": "String" + }, + "bankAccount2_AccountNumber": { + "type": "string", + "title": "String" + }, + "bankAccount2_AccountName": { + "type": "string", + "title": "String" + }, + "bankAccount2_AllocatedPercentage": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "bankAccount2_FixedAmount": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "bankAccount3_BSB": { + "type": "string", + "title": "String" + }, + "bankAccount3_AccountNumber": { + "type": "string", + "title": "String" + }, + "bankAccount3_AccountName": { + "type": "string", + "title": "String" + }, + "bankAccount3_AllocatedPercentage": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "bankAccount3_FixedAmount": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "superFund1_ProductCode": { + "type": "string", + "title": "String" + }, + "superFund1_FundName": { + "type": "string", + "title": "String" + }, + "superFund1_MemberNumber": { + "type": "string", + "title": "String" + }, + "superFund1_AllocatedPercentage": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "superFund1_FixedAmount": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "superFund2_ProductCode": { + "type": "string", + "title": "String" + }, + "superFund2_FundName": { + "type": "string", + "title": "String" + }, + "superFund2_MemberNumber": { + "type": "string", + "title": "String" + }, + "superFund2_AllocatedPercentage": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "superFund2_FixedAmount": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "superFund3_ProductCode": { + "type": "string", + "title": "String" + }, + "superFund3_FundName": { + "type": "string", + "title": "String" + }, + "superFund3_MemberNumber": { + "type": "string", + "title": "String" + }, + "superFund3_AllocatedPercentage": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "superFund3_FixedAmount": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "superThresholdAmount": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "maximumQuarterlySuperContributionsBase": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "rosteringNotificationChoices": { + "type": "string", + "title": "String" + }, + "medicareLevyExemption": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "UnstructuredEmployeeModel" + }, + "title": "UnstructuredEmployeeModel" + }, + "LeaveBalanceModel": { + "type": "object", + "properties": { + "leaveCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "leaveCategoryName": { + "type": "string", + "title": "String" + }, + "accruedAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "LeaveBalanceModel" + }, + "title": "LeaveBalanceModel" + }, + "EmployeeNoteModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "user": { + "type": "string", + "title": "String" + }, + "dateTime": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "note": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EmployeeNoteModel" + }, + "title": "EmployeeNoteModel" + }, + "CreateEmployeeNoteModel": { + "type": "object", + "properties": { + "note": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "CreateEmployeeNoteModel" + }, + "title": "CreateEmployeeNoteModel" + }, + "EmployeePayRateModel": { + "type": "object", + "properties": { + "payCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "payCategoryName": { + "type": "string", + "title": "String" + }, + "isPrimaryPayCategory": { + "type": "boolean", + "title": "Boolean" + }, + "accruesLeave": { + "type": "boolean", + "title": "Boolean" + }, + "rateUnit": { + "type": "string", + "title": "String" + }, + "rate": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "calculatedRate": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "hasSuperRateOverride": { + "type": "boolean", + "title": "Boolean" + }, + "superRate": { + "format": "double", + "type": "number", + "title": "Nullable" + } + }, + "xml": { + "name": "EmployeePayRateModel" + }, + "title": "EmployeePayRateModel" + }, + "OpeningBalancesEditModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "totalHours": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "grossEarnings": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "paygWithholdingAmount": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "sfssAmount": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "helpAmount": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "superContribution": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "employerContribution": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "leaveBalances": { + "type": "array", + "items": { + "$ref": "#/definitions/InitialLeaveBalanceModel" + }, + "xml": { + "name": "InitialLeaveBalanceModel", + "wrapped": true + }, + "title": "IList" + }, + "earningsLines": { + "type": "array", + "items": { + "$ref": "#/definitions/InitialEarningsModel" + }, + "xml": { + "name": "InitialEarningsModel", + "wrapped": true + }, + "title": "IList" + }, + "deductions": { + "type": "array", + "items": { + "$ref": "#/definitions/InitialDeductionModel" + }, + "xml": { + "name": "InitialDeductionModel", + "wrapped": true + }, + "title": "List" + }, + "employerLiabilities": { + "type": "array", + "items": { + "$ref": "#/definitions/InitialEmployerLiabilityModel" + }, + "xml": { + "name": "InitialEmployerLiabilityModel", + "wrapped": true + }, + "title": "List" + }, + "etpTypeR": { + "$ref": "#/definitions/OpeningBalancesEtpModel" + }, + "etpTypeO": { + "$ref": "#/definitions/OpeningBalancesEtpModel" + }, + "financialYearStartingYear": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "locationName": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "OpeningBalancesEditModel" + }, + "title": "OpeningBalancesEditModel" + }, + "InitialLeaveBalanceModel": { + "type": "object", + "properties": { + "leaveCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "InitialLeaveBalanceModel" + }, + "title": "InitialLeaveBalanceModel" + }, + "InitialEarningsModel": { + "type": "object", + "properties": { + "payCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "isStandardPayCategory": { + "type": "boolean", + "title": "Boolean" + }, + "payCategoryType": { + "enum": [ + "Standard", + "LeaveLoading", + "GenuineRedundancyLeavePayment", + "OpeningBalanceAllowances", + "EtpTypeRTaxable", + "EtpTypeRTaxFree", + "EtpTypeOTaxable", + "EtpTypeOTaxFree", + "EtpLumpSumD" + ], + "type": "string", + "title": "PayCategoryType" + }, + "name": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "InitialEarningsModel" + }, + "title": "InitialEarningsModel" + }, + "InitialDeductionModel": { + "type": "object", + "properties": { + "deductionCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "isRESC": { + "type": "boolean", + "title": "Boolean" + }, + "taxExempt": { + "type": "boolean", + "title": "Boolean" + }, + "isMemberVoluntary": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "InitialDeductionModel" + }, + "title": "InitialDeductionModel" + }, + "InitialEmployerLiabilityModel": { + "type": "object", + "properties": { + "employerLiabilityCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "InitialEmployerLiabilityModel" + }, + "title": "InitialEmployerLiabilityModel" + }, + "OpeningBalancesEtpModel": { + "type": "object", + "properties": { + "taxFreeComponent": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "taxableComponent": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "taxWithheld": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "lumpSumD": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "isAmended": { + "type": "boolean", + "title": "Boolean" + }, + "paymentDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "generatePaymentSummary": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "OpeningBalancesEtpModel" + }, + "title": "OpeningBalancesEtpModel" + }, + "EmployeeAccessModel": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "String" + }, + "email": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EmployeeAccessModel" + }, + "title": "EmployeeAccessModel" + }, + "CreateEmployeeAccessModel": { + "type": "object", + "properties": { + "suppressNotificationEmails": { + "type": "boolean", + "title": "Boolean" + }, + "name": { + "type": "string", + "title": "String" + }, + "email": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "CreateEmployeeAccessModel" + }, + "title": "CreateEmployeeAccessModel" + }, + "BankAccountModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "bsb": { + "type": "string", + "title": "String" + }, + "accountName": { + "type": "string", + "title": "String" + }, + "accountNumber": { + "type": "string", + "title": "String" + }, + "allocatedPercentage": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "fixedAmount": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "allocateBalance": { + "type": "boolean", + "title": "Boolean" + }, + "isEmployeeEditable": { + "type": "boolean", + "title": "Boolean" + }, + "canBeDeleted": { + "type": "boolean", + "title": "Boolean" + }, + "accountType": { + "enum": [ + "Electronic", + "ManualDeposit", + "CashOrCheque", + "Bpay" + ], + "type": "string", + "title": "BankAccountTypeEnum" + }, + "externalReferenceId": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "BankAccountModel" + }, + "title": "BankAccountModel" + }, + "SaveBankAccountResponseModel": { + "type": "object", + "properties": { + "validationWarning": { + "type": "string", + "title": "String" + }, + "result": { + "$ref": "#/definitions/BankAccountModel" + } + }, + "xml": { + "name": "SaveBankAccountResponseModel" + }, + "title": "SaveBankAccountResponseModel" + }, + "EmployeeDocumentModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "friendlyName": { + "type": "string", + "title": "String" + }, + "dateCreated": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "visible": { + "type": "boolean", + "title": "Boolean" + }, + "leaveRequestId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "timesheetLineId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "EmployeeDocumentModel" + }, + "title": "EmployeeDocumentModel" + }, + "UpdateEmployeeDocumentPermissionsModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "visible": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "UpdateEmployeeDocumentPermissionsModel" + }, + "title": "UpdateEmployeeDocumentPermissionsModel" + }, + "ODataQueryOptions[EmployeeExpenseCategory]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "EmployeeExpenseCategoryModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "generalLedgerMappingCode": { + "type": "string", + "title": "String" + }, + "description": { + "type": "string", + "title": "String" + }, + "externalReferenceId": { + "type": "string", + "title": "String" + }, + "externalTaxCodeId": { + "type": "string", + "title": "String" + }, + "taxCode": { + "type": "string", + "title": "String" + }, + "taxRate": { + "format": "double", + "type": "number", + "title": "Nullable" + } + }, + "xml": { + "name": "EmployeeExpenseCategoryModel" + }, + "title": "EmployeeExpenseCategoryModel" + }, + "JournalServiceTaxCode": { + "type": "object", + "properties": { + "id": { + "type": "string", + "title": "String" + }, + "name": { + "type": "string", + "title": "String" + }, + "taxRate": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "JournalServiceTaxCode" + }, + "title": "JournalServiceTaxCode" + }, + "ODataQueryOptions[EmployeeExpenseRequest]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "ExpenseRequestResponseModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeName": { + "type": "string", + "title": "String" + }, + "status": { + "type": "string", + "title": "String" + }, + "description": { + "type": "string", + "title": "String" + }, + "lineItems": { + "type": "array", + "items": { + "$ref": "#/definitions/ExpenseRequestLineItemModel" + }, + "xml": { + "name": "ExpenseRequestLineItemModel", + "wrapped": true + }, + "title": "List" + }, + "attachments": { + "type": "array", + "items": { + "$ref": "#/definitions/AttachmentModel" + }, + "xml": { + "name": "AttachmentModel", + "wrapped": true + }, + "title": "List" + }, + "statusUpdatedByUser": { + "type": "string", + "title": "String" + }, + "statusUpdateNotes": { + "type": "string", + "title": "String" + }, + "dateStatusUpdated": { + "format": "date-time", + "type": "string", + "title": "DateTime" + } + }, + "xml": { + "name": "ExpenseRequestResponseModel" + }, + "title": "ExpenseRequestResponseModel" + }, + "ExpenseRequestLineItemModel": { + "type": "object", + "properties": { + "expenseCategoryName": { + "type": "string", + "title": "String" + }, + "locationName": { + "type": "string", + "title": "String" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "expenseCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "notes": { + "type": "string", + "title": "String" + }, + "taxCode": { + "type": "string", + "title": "String" + }, + "taxCodeDisplayName": { + "type": "string", + "title": "String" + }, + "taxRate": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "dateIncurred": { + "format": "date-time", + "type": "string", + "title": "DateTime" + } + }, + "xml": { + "name": "ExpenseRequestLineItemModel" + }, + "title": "ExpenseRequestLineItemModel" + }, + "AttachmentModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "friendlyName": { + "type": "string", + "title": "String" + }, + "dateCreated": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "url": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "AttachmentModel" + }, + "title": "AttachmentModel" + }, + "ExpenseRequestEditModel": { + "required": [ + "employeeId" + ], + "type": "object", + "properties": { + "attachments": { + "type": "array", + "items": { + "$ref": "#/definitions/AttachmentModel" + }, + "xml": { + "name": "AttachmentModel", + "wrapped": true + }, + "title": "List" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "description": { + "maxLength": 255, + "type": "string", + "title": "String" + }, + "lineItems": { + "type": "array", + "items": { + "$ref": "#/definitions/ExpenseRequestEditLineItemModel" + }, + "xml": { + "name": "ExpenseRequestEditLineItemModel", + "wrapped": true + }, + "title": "List" + } + }, + "xml": { + "name": "ExpenseRequestEditModel" + }, + "title": "ExpenseRequestEditModel" + }, + "ExpenseRequestEditLineItemModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "expenseCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "notes": { + "type": "string", + "title": "String" + }, + "taxCode": { + "type": "string", + "title": "String" + }, + "taxCodeDisplayName": { + "type": "string", + "title": "String" + }, + "taxRate": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "dateIncurred": { + "format": "date-time", + "type": "string", + "title": "DateTime" + } + }, + "xml": { + "name": "ExpenseRequestEditLineItemModel" + }, + "title": "ExpenseRequestEditLineItemModel" + }, + "EmployeeGroupModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "filterCombinationStrategy": { + "enum": [ + "Or", + "And" + ], + "type": "string", + "title": "FilterCombinationStrategyEnum" + }, + "filters": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeFilterModel" + }, + "xml": { + "name": "EmployeeFilterModel", + "wrapped": true + }, + "title": "IList" + } + }, + "xml": { + "name": "EmployeeGroupModel" + }, + "title": "EmployeeGroupModel" + }, + "EmployeeFilterModel": { + "type": "object", + "properties": { + "filterType": { + "enum": [ + "Location", + "LocationOrParents", + "Employee", + "PaySchedule", + "EmploymentType", + "EmployingEntity", + "Tag" + ], + "type": "string", + "title": "FilterTypeEnum" + }, + "operator": { + "enum": [ + "In", + "NotIn" + ], + "type": "string", + "title": "FilterOperatorEnum" + }, + "value": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EmployeeFilterModel" + }, + "title": "EmployeeFilterModel" + }, + "DetailedEmployeeGroupModel": { + "type": "object", + "properties": { + "matchingEmployees": { + "type": "array", + "items": { + "$ref": "#/definitions/MatchingEmployeeModel" + }, + "xml": { + "name": "MatchingEmployeeModel", + "wrapped": true + }, + "title": "IList" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "filterCombinationStrategy": { + "enum": [ + "Or", + "And" + ], + "type": "string", + "title": "FilterCombinationStrategyEnum" + }, + "filters": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeFilterModel" + }, + "xml": { + "name": "EmployeeFilterModel", + "wrapped": true + }, + "title": "IList" + } + }, + "xml": { + "name": "DetailedEmployeeGroupModel" + }, + "title": "DetailedEmployeeGroupModel" + }, + "MatchingEmployeeModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "name": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "MatchingEmployeeModel" + }, + "title": "MatchingEmployeeModel" + }, + "EmployeeQualificationDocumentModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "dateCreated": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "visible": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "EmployeeQualificationDocumentModel" + }, + "title": "EmployeeQualificationDocumentModel" + }, + "EmployeeQualificationModel": { + "type": "object", + "properties": { + "qualificationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "expiryDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "documents": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeQualificationDocumentModel" + }, + "xml": { + "name": "EmployeeQualificationDocumentModel", + "wrapped": true + }, + "title": "IList" + }, + "referenceNumber": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EmployeeQualificationModel" + }, + "title": "EmployeeQualificationModel" + }, + "EmployeeRecurringTaxAdjustmentModel": { + "type": "object", + "properties": { + "adjustmentType": { + "enum": [ + "Fixed", + "PercentageGross", + "PercentageTaxableEarnings" + ], + "type": "string", + "title": "TaxAdjustmentTypeEnum" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "expiryDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "maximumAmountPaid": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "totalAmountPaid": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "isActive": { + "type": "boolean", + "title": "Boolean" + }, + "notes": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EmployeeRecurringTaxAdjustmentModel" + }, + "title": "EmployeeRecurringTaxAdjustmentModel" + }, + "EmployeeRecurringSuperAdjustmentModel": { + "type": "object", + "properties": { + "contributionType": { + "enum": [ + "SuperGuarantee", + "SalarySacrifice", + "MemberVoluntary", + "EmployerContribution" + ], + "type": "string", + "title": "SuperContributionType" + }, + "adjustmentType": { + "enum": [ + "Fixed", + "PercentageGross", + "PercentageOTE", + "PercentageTaxableEarnings" + ], + "type": "string", + "title": "SuperAdjustmentTypeEnum" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "expiryDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "maximumAmountPaid": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "totalAmountPaid": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "isActive": { + "type": "boolean", + "title": "Boolean" + }, + "notes": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EmployeeRecurringSuperAdjustmentModel" + }, + "title": "EmployeeRecurringSuperAdjustmentModel" + }, + "EmployerRecurringLiabilityModel": { + "type": "object", + "properties": { + "employerLiabilityCategoryName": { + "type": "string", + "title": "String" + }, + "employerLiabilityCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "liabilityType": { + "enum": [ + "Fixed", + "PercentageGross", + "PercentageOTE" + ], + "type": "string", + "title": "EmployerRecurringLiabilityTypeEnum" + }, + "externalReferenceId": { + "type": "string", + "title": "String" + }, + "source": { + "enum": [ + "None", + "Saasu", + "Xero", + "MYOB", + "Deputy", + "EmployeeTimePunch", + "ClickSuper", + "IntegratedTimesheets", + "FileImport", + "FileExport", + "QuickBooks", + "Harmony", + "AwardStore", + "Attache", + "IntegratedRostering", + "ReckonAccounts", + "API", + "MicroPower", + "RosterLive", + "NetSuite", + "Kounta", + "TimeAndAttendanceKiosk", + "DetailedFileExport", + "JonasPremier", + "WageEasy", + "Maestrano", + "WorkZone", + "EmployeePortal", + "RosterTemplate", + "Onboarding", + "Admin", + "WorkZoneClockOnOff" + ], + "type": "string", + "title": "ExternalService" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "expiryDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "maximumAmountPaid": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "totalAmountPaid": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "isActive": { + "type": "boolean", + "title": "Boolean" + }, + "notes": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EmployerRecurringLiabilityModel" + }, + "title": "EmployerRecurringLiabilityModel" + }, + "EmployeeRecurringDeductionModel": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "String" + }, + "deductionCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "paidTo": { + "enum": [ + "Manual", + "BankAccount", + "SuperFund", + "Bpay" + ], + "type": "string", + "title": "EmployeeRecurringDeductionPaidToEnum" + }, + "paidToAccountId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "externalReferenceId": { + "type": "string", + "title": "String" + }, + "preservedEarningsAmountNotReachedAction": { + "enum": [ + "DoNotPay", + "PayToLimit" + ], + "type": "string", + "title": "DeductionAmountNotReachedEnum" + }, + "carryForwardUnpaidDeductions": { + "type": "boolean", + "title": "Boolean" + }, + "carryForwardAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "paymentReference": { + "type": "string", + "title": "String" + }, + "deductionType": { + "enum": [ + "NotSet", + "Fixed", + "PercentageGross", + "PercentageOTE" + ], + "type": "string", + "title": "DeductionTypeEnum" + }, + "preservedEarnings": { + "type": "boolean", + "title": "Boolean" + }, + "preservedEarningsAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "expiryDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "maximumAmountPaid": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "totalAmountPaid": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "isActive": { + "type": "boolean", + "title": "Boolean" + }, + "notes": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EmployeeRecurringDeductionModel" + }, + "title": "EmployeeRecurringDeductionModel" + }, + "EmployeeRecurringExpenseModel": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "String" + }, + "expenseCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "taxCode": { + "type": "string", + "title": "String" + }, + "taxCodeDisplayName": { + "type": "string", + "title": "String" + }, + "taxRate": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "expiryDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "maximumAmountPaid": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "totalAmountPaid": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "isActive": { + "type": "boolean", + "title": "Boolean" + }, + "notes": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EmployeeRecurringExpenseModel" + }, + "title": "EmployeeRecurringExpenseModel" + }, + "SuperFundModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "memberNumber": { + "type": "string", + "title": "String" + }, + "allocatedPercentage": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "fixedAmount": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "superProduct": { + "$ref": "#/definitions/SuperProductModel" + }, + "allocateBalance": { + "type": "boolean", + "title": "Boolean" + }, + "canBeDeleted": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "SuperFundModel" + }, + "title": "SuperFundModel" + }, + "SuperProductModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "abn": { + "type": "string", + "title": "String" + }, + "productCode": { + "type": "string", + "title": "String" + }, + "productType": { + "type": "string", + "title": "String" + }, + "businessName": { + "type": "string", + "title": "String" + }, + "displayName": { + "type": "string", + "title": "String" + }, + "productName": { + "type": "string", + "title": "String" + }, + "accountNumber": { + "type": "string", + "title": "String" + }, + "bsb": { + "type": "string", + "title": "String" + }, + "accountName": { + "type": "string", + "title": "String" + }, + "source": { + "enum": [ + "None", + "Saasu", + "Xero", + "MYOB", + "Deputy", + "EmployeeTimePunch", + "ClickSuper", + "IntegratedTimesheets", + "FileImport", + "FileExport", + "QuickBooks", + "Harmony", + "AwardStore", + "Attache", + "IntegratedRostering", + "ReckonAccounts", + "API", + "MicroPower", + "RosterLive", + "NetSuite", + "Kounta", + "TimeAndAttendanceKiosk", + "DetailedFileExport", + "JonasPremier", + "WageEasy", + "Maestrano", + "WorkZone", + "EmployeePortal", + "RosterTemplate", + "Onboarding", + "Admin", + "WorkZoneClockOnOff" + ], + "type": "string", + "title": "ExternalService" + }, + "electronicServiceAddress": { + "type": "string", + "title": "String" + }, + "email": { + "type": "string", + "title": "String" + }, + "externalReferenceId": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "SuperProductModel" + }, + "title": "SuperProductModel" + }, + "SaveSuperFundModel": { + "type": "object", + "properties": { + "memberNumber": { + "type": "string", + "title": "String" + }, + "allocatedPercentage": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "fixedAmount": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "productCode": { + "type": "string", + "title": "String" + }, + "fundName": { + "type": "string", + "title": "String" + }, + "allocateBalance": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "SaveSuperFundModel" + }, + "title": "SaveSuperFundModel" + }, + "SaveSuperFundResponseModel": { + "type": "object", + "properties": { + "validationWarning": { + "type": "string", + "title": "String" + }, + "result": { + "$ref": "#/definitions/SuperFundModel" + } + }, + "xml": { + "name": "SaveSuperFundResponseModel" + }, + "title": "SaveSuperFundResponseModel" + }, + "ODataQueryOptions[EmployerLiabilityCategory]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "EmployerLiabilityCategoryModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "externalReferenceId": { + "type": "string", + "title": "String" + }, + "canBeDeleted": { + "type": "boolean", + "title": "Boolean" + }, + "hideFromPaySlips": { + "type": "boolean", + "title": "Boolean" + }, + "showTotalPayments": { + "type": "boolean", + "title": "Boolean" + }, + "includeInShiftCosts": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "EmployerLiabilityCategoryModel" + }, + "title": "EmployerLiabilityCategoryModel" + }, + "ODataQueryOptions[EmployingEntity]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "EmployingEntityModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "abn": { + "type": "string", + "title": "String" + }, + "contactName": { + "type": "string", + "title": "String" + }, + "signatoryName": { + "type": "string", + "title": "String" + }, + "contactEmailAddress": { + "type": "string", + "title": "String" + }, + "contactPhoneNumber": { + "type": "string", + "title": "String" + }, + "contactFaxNumber": { + "type": "string", + "title": "String" + }, + "addressLine1": { + "type": "string", + "title": "String" + }, + "addressLine2": { + "type": "string", + "title": "String" + }, + "suburb": { + "type": "string", + "title": "String" + }, + "state": { + "type": "string", + "title": "String" + }, + "postcode": { + "type": "string", + "title": "String" + }, + "externalReferenceId": { + "type": "string", + "title": "String" + }, + "isExemptFromFringeBenefitsTax": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "EmployingEntityModel" + }, + "title": "EmployingEntityModel" + }, + "ODataQueryOptions[EmploymentAgreement]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "BasicEmploymentAgreementModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "classification": { + "type": "string", + "title": "String" + }, + "employmentType": { + "enum": [ + "Unknown", + "FullTime", + "PartTime", + "LabourHire", + "SuperannuationIncomeStream", + "Casual" + ], + "type": "string", + "title": "EmploymentTypeEnum" + }, + "name": { + "type": "string", + "title": "String" + }, + "awardName": { + "type": "string", + "title": "String" + }, + "rank": { + "format": "int32", + "type": "integer", + "title": "Int32" + } + }, + "xml": { + "name": "BasicEmploymentAgreementModel" + }, + "title": "BasicEmploymentAgreementModel" + }, + "EmploymentAgreementModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "classification": { + "type": "string", + "title": "String" + }, + "employmentType": { + "enum": [ + "Unknown", + "FullTime", + "PartTime", + "LabourHire", + "SuperannuationIncomeStream", + "Casual" + ], + "type": "string", + "title": "EmploymentTypeEnum" + }, + "payRateTemplateType": { + "enum": [ + "DateOfBirth", + "Anniversary", + "AnniversaryInMonths", + "DateOfBirthAndAnniversaryInMonths" + ], + "type": "string", + "title": "PayRateTemplateTypeEnum" + }, + "payConditionRuleSetId": { + "format": "int32", + "description": "in older serialised versions, the whole ruleset was included. in newer versions, only the ID is included", + "type": "integer", + "title": "Nullable" + }, + "payConditionRuleSet": { + "$ref": "#/definitions/PayConditionRuleSetModel" + }, + "leaveAllowanceTemplates": { + "type": "array", + "items": { + "$ref": "#/definitions/LeaveAllowanceTemplateModel" + }, + "xml": { + "name": "LeaveAllowanceTemplateModel", + "wrapped": true + }, + "title": "IList" + }, + "leaveAllowanceTemplateIds": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "IList" + }, + "agePayRateTemplates": { + "type": "array", + "items": { + "$ref": "#/definitions/EmploymentAgreementPayRateTemplateModel" + }, + "xml": { + "name": "EmploymentAgreementPayRateTemplateModel", + "wrapped": true + }, + "title": "IList" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "source": { + "enum": [ + "None", + "Saasu", + "Xero", + "MYOB", + "Deputy", + "EmployeeTimePunch", + "ClickSuper", + "IntegratedTimesheets", + "FileImport", + "FileExport", + "QuickBooks", + "Harmony", + "AwardStore", + "Attache", + "IntegratedRostering", + "ReckonAccounts", + "API", + "MicroPower", + "RosterLive", + "NetSuite", + "Kounta", + "TimeAndAttendanceKiosk", + "DetailedFileExport", + "JonasPremier", + "WageEasy", + "Maestrano", + "WorkZone", + "EmployeePortal", + "RosterTemplate", + "Onboarding", + "Admin", + "WorkZoneClockOnOff" + ], + "type": "string", + "title": "ExternalService" + }, + "rank": { + "format": "int32", + "type": "integer", + "title": "Int32" + } + }, + "xml": { + "name": "EmploymentAgreementModel" + }, + "title": "EmploymentAgreementModel" + }, + "PayConditionRuleSetModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "description": { + "type": "string", + "title": "String" + }, + "periodType": { + "enum": [ + "Weekly", + "Fortnightly", + "Monthly", + "CalendarMonth", + "FourWeekly", + "SixWeekly", + "ThreeWeekly" + ], + "type": "string", + "title": "RuleSetPeriodType" + }, + "dayOfWeekEnding": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "dayOfMonthEnding": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "periodEnding": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "shiftConsolidationOption": { + "enum": [ + "None", + "Duration", + "SameDay" + ], + "type": "string", + "title": "Nullable" + }, + "shiftConsolidationThreshold": { + "type": "string", + "title": "Nullable" + }, + "rulesJson": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "PayConditionRuleSetModel" + }, + "title": "PayConditionRuleSetModel" + }, + "LeaveAllowanceTemplateModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "leaveCategories": { + "type": "array", + "items": { + "$ref": "#/definitions/LeaveAllowanceTemplateLeaveCategoryModel" + }, + "xml": { + "name": "LeaveAllowanceTemplateLeaveCategoryModel", + "wrapped": true + }, + "title": "IList" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "source": { + "enum": [ + "None", + "Saasu", + "Xero", + "MYOB", + "Deputy", + "EmployeeTimePunch", + "ClickSuper", + "IntegratedTimesheets", + "FileImport", + "FileExport", + "QuickBooks", + "Harmony", + "AwardStore", + "Attache", + "IntegratedRostering", + "ReckonAccounts", + "API", + "MicroPower", + "RosterLive", + "NetSuite", + "Kounta", + "TimeAndAttendanceKiosk", + "DetailedFileExport", + "JonasPremier", + "WageEasy", + "Maestrano", + "WorkZone", + "EmployeePortal", + "RosterTemplate", + "Onboarding", + "Admin", + "WorkZoneClockOnOff" + ], + "type": "string", + "title": "ExternalService" + } + }, + "xml": { + "name": "LeaveAllowanceTemplateModel" + }, + "title": "LeaveAllowanceTemplateModel" + }, + "EmploymentAgreementPayRateTemplateModel": { + "type": "object", + "properties": { + "payRateTemplateId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "payRateTemplate": { + "$ref": "#/definitions/PayRateTemplateModel" + }, + "minAge": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "maxAge": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "minAnniversaryMonths": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "maxAnniversaryMonths": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "EmploymentAgreementPayRateTemplateModel" + }, + "title": "EmploymentAgreementPayRateTemplateModel" + }, + "LeaveAllowanceTemplateLeaveCategoryModel": { + "type": "object", + "properties": { + "leaveCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "units": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "unitType": { + "enum": [ + "Days", + "Weeks", + "HoursPerHourWorked", + "HoursPerPayRun" + ], + "type": "string", + "title": "Nullable" + }, + "leaveLoading": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "canApplyForLeave": { + "type": "boolean", + "title": "Boolean" + }, + "contingentPeriod": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "entitlementPeriod": { + "format": "double", + "type": "number", + "title": "Nullable" + } + }, + "xml": { + "name": "LeaveAllowanceTemplateLeaveCategoryModel" + }, + "title": "LeaveAllowanceTemplateLeaveCategoryModel" + }, + "PayRateTemplateModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "primaryPayCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "superThresholdAmount": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "payCategories": { + "type": "array", + "items": { + "$ref": "#/definitions/PayRateTemplatePayCategoryModel" + }, + "xml": { + "name": "PayRateTemplatePayCategoryModel", + "wrapped": true + }, + "title": "List" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "source": { + "type": "string", + "title": "String" + }, + "maximumQuarterlySuperContributionsBase": { + "format": "double", + "type": "number", + "title": "Nullable" + } + }, + "xml": { + "name": "PayRateTemplateModel" + }, + "title": "PayRateTemplateModel" + }, + "PayRateTemplatePayCategoryModel": { + "description": "TODO: Can we get away with not having UserSuppliedRate and CalculatedRate? can we just have 'Rate' and work \r\n(which is interpreted as UserSuppliedRate) and determine calculated rate from there?", + "type": "object", + "properties": { + "payCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "userSuppliedRate": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "calculatedRate": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "standardWeeklyHours": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "superRate": { + "format": "double", + "type": "number", + "title": "Nullable" + } + }, + "xml": { + "name": "PayRateTemplatePayCategoryModel" + }, + "title": "PayRateTemplatePayCategoryModel" + }, + "GetShiftPeriodsModel": { + "type": "object", + "properties": { + "firstShiftStartTime": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "lastShiftStartTime": { + "format": "date-time", + "type": "string", + "title": "Nullable" + } + }, + "xml": { + "name": "GetShiftPeriodsModel" + }, + "title": "GetShiftPeriodsModel" + }, + "ShiftPeriodModel": { + "type": "object", + "properties": { + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + } + }, + "xml": { + "name": "ShiftPeriodModel" + }, + "title": "ShiftPeriodModel" + }, + "ShiftCostingsRequestModel": { + "type": "object", + "properties": { + "transactionExternalId": { + "type": "string", + "title": "String" + }, + "locationIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "workTypeIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "includeEvaluationResults": { + "type": "boolean", + "title": "Boolean" + }, + "employee": { + "$ref": "#/definitions/ShiftCostingsEmployeeModel" + }, + "shifts": { + "type": "array", + "items": { + "$ref": "#/definitions/ShiftCostingsRequestShiftModel" + }, + "xml": { + "name": "ShiftCostingsRequestShiftModel", + "wrapped": true + }, + "title": "IList" + } + }, + "xml": { + "name": "ShiftCostingsRequestModel" + }, + "title": "ShiftCostingsRequestModel" + }, + "ShiftCostingsEmployeeModel": { + "type": "object", + "properties": { + "dateOfBirth": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "anniversaryDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "standardHoursPerWeek": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "title": "IList" + } + }, + "xml": { + "name": "ShiftCostingsEmployeeModel" + }, + "title": "ShiftCostingsEmployeeModel" + }, + "ShiftCostingsRequestShiftModel": { + "type": "object", + "properties": { + "state": { + "type": "string", + "title": "String" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "startTime": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "endTime": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "units": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "workTypeId": { + "type": "string", + "title": "String" + }, + "locationId": { + "type": "string", + "title": "String" + }, + "comments": { + "type": "string", + "title": "String" + }, + "breaks": { + "type": "array", + "items": { + "$ref": "#/definitions/TimesheetBreakModel" + }, + "xml": { + "name": "TimesheetBreakModel", + "wrapped": true + }, + "title": "IList" + }, + "status": { + "type": "string", + "title": "String" + }, + "rate": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "leaveCategoryId": { + "type": "string", + "title": "String" + }, + "payCategoryId": { + "type": "string", + "title": "String" + }, + "classificationId": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "source": { + "enum": [ + "None", + "Saasu", + "Xero", + "MYOB", + "Deputy", + "EmployeeTimePunch", + "ClickSuper", + "IntegratedTimesheets", + "FileImport", + "FileExport", + "QuickBooks", + "Harmony", + "AwardStore", + "Attache", + "IntegratedRostering", + "ReckonAccounts", + "API", + "MicroPower", + "RosterLive", + "NetSuite", + "Kounta", + "TimeAndAttendanceKiosk", + "DetailedFileExport", + "JonasPremier", + "WageEasy", + "Maestrano", + "WorkZone", + "EmployeePortal", + "RosterTemplate", + "Onboarding", + "Admin", + "WorkZoneClockOnOff" + ], + "type": "string", + "title": "ExternalService" + }, + "attachmentId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "shiftConditionIds": { + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "title": "IList" + } + }, + "xml": { + "name": "ShiftCostingsRequestShiftModel" + }, + "title": "ShiftCostingsRequestShiftModel" + }, + "TimesheetBreakModel": { + "type": "object", + "properties": { + "startTime": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "endTime": { + "format": "date-time", + "type": "string", + "title": "Nullable" + } + }, + "xml": { + "name": "TimesheetBreakModel" + }, + "title": "TimesheetBreakModel" + }, + "ShiftCostingsResponseModel": { + "type": "object", + "properties": { + "transactionId": { + "format": "uuid", + "type": "string", + "example": "00000000-0000-0000-0000-000000000000", + "title": "Guid" + }, + "transactionExternalId": { + "type": "string", + "title": "String" + }, + "employmentAgreementId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employmentAgreementName": { + "type": "string", + "title": "String" + }, + "payConditionRuleSetId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "payConditionRuleSetName": { + "type": "string", + "title": "String" + }, + "shifts": { + "type": "array", + "items": { + "$ref": "#/definitions/ShiftCostingsResponseShiftModel" + }, + "xml": { + "name": "ShiftCostingsResponseShiftModel", + "wrapped": true + }, + "title": "List" + } + }, + "xml": { + "name": "ShiftCostingsResponseModel" + }, + "title": "ShiftCostingsResponseModel" + }, + "ShiftCostingsResponseShiftModel": { + "type": "object", + "properties": { + "externalId": { + "type": "string", + "title": "String" + }, + "startTime": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "endTime": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "cost": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Decimal" + }, + "evaluationResults": { + "type": "array", + "items": { + "$ref": "#/definitions/RuleEvaluationResult" + }, + "xml": { + "name": "RuleEvaluationResult", + "wrapped": true + }, + "title": "IList" + }, + "consolidatedShifts": { + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "title": "List" + }, + "costBreakdown": { + "type": "array", + "items": { + "$ref": "#/definitions/ShiftCostingBreakdownModel" + }, + "xml": { + "name": "ShiftCostingBreakdownModel", + "wrapped": true + }, + "title": "List" + } + }, + "xml": { + "name": "ShiftCostingsResponseShiftModel" + }, + "title": "ShiftCostingsResponseShiftModel" + }, + "RuleEvaluationResult": { + "type": "object", + "properties": { + "ruleName": { + "type": "string", + "title": "String" + }, + "matchResult": { + "enum": [ + "NoMatch", + "Match", + "DisabledForRuleSet", + "DisabledForEmployee" + ], + "type": "string", + "title": "RuleMatchResult" + } + }, + "xml": { + "name": "RuleEvaluationResult" + }, + "title": "RuleEvaluationResult" + }, + "ShiftCostingBreakdownModel": { + "type": "object", + "properties": { + "startTime": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "endTime": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "payCategoryId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "payCategoryName": { + "type": "string", + "title": "String" + }, + "units": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "rate": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "cost": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "type": { + "type": "string", + "title": "String" + }, + "liabilityCategoryId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "liabilityCategoryName": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "ShiftCostingBreakdownModel" + }, + "title": "ShiftCostingBreakdownModel" + }, + "EmployeeLeaveRequestFilter": { + "type": "object", + "properties": { + "showOtherEmployees": { + "type": "boolean", + "title": "Boolean" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + } + }, + "xml": { + "name": "EmployeeLeaveRequestFilter" + }, + "title": "EmployeeLeaveRequestFilter" + }, + "EssLeaveRequestModel": { + "type": "object", + "properties": { + "leaveCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "isApproved": { + "type": "boolean", + "title": "Boolean" + }, + "isDeclined": { + "type": "boolean", + "title": "Boolean" + }, + "isCancelled": { + "type": "boolean", + "title": "Boolean" + }, + "isPending": { + "type": "boolean", + "title": "Boolean" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "requestedDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "leaveCategoryName": { + "type": "string", + "title": "String" + }, + "hoursPerDay": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "totalHours": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "notes": { + "type": "string", + "title": "String" + }, + "totalDays": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Decimal" + }, + "amount": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "status": { + "type": "string", + "title": "String" + }, + "statusUpdateNotes": { + "type": "string", + "title": "String" + }, + "canCancel": { + "type": "boolean", + "title": "Boolean" + }, + "canModify": { + "type": "boolean", + "title": "Boolean" + }, + "requireNotesForLeaveRequests": { + "type": "boolean", + "title": "Boolean" + }, + "attachment": { + "$ref": "#/definitions/AttachmentModel" + } + }, + "xml": { + "name": "EssLeaveRequestModel" + }, + "title": "EssLeaveRequestModel" + }, + "EssLeaveApplicationModel": { + "required": [ + "fromDate", + "toDate", + "hours", + "leaveCategoryId" + ], + "type": "object", + "properties": { + "attachment": { + "format": "byte", + "type": "string", + "title": "Byte[]" + }, + "attachmentId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "hours": { + "format": "double", + "maximum": 2000, + "type": "number", + "title": "Decimal" + }, + "leaveCategoryId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "notes": { + "maxLength": 255, + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EssLeaveApplicationModel" + }, + "title": "EssLeaveApplicationModel" + }, + "EssLeaveCategoryModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EssLeaveCategoryModel" + }, + "title": "EssLeaveCategoryModel" + }, + "LeaveHoursEstimateFilter": { + "required": [ + "fromDate", + "toDate" + ], + "type": "object", + "properties": { + "leaveCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + } + }, + "xml": { + "name": "LeaveHoursEstimateFilter" + }, + "title": "LeaveHoursEstimateFilter" + }, + "EssLeaveEstimate": { + "type": "object", + "properties": { + "leaveBalance": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "approvedLeave": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "availableBalance": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "leaveRequired": { + "$ref": "#/definitions/LeaveEstimate" + } + }, + "xml": { + "name": "EssLeaveEstimate" + }, + "title": "EssLeaveEstimate" + }, + "LeaveEstimate": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "hours": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "details": { + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "title": "IList" + } + }, + "xml": { + "name": "LeaveEstimate" + }, + "title": "LeaveEstimate" + }, + "EssEmployeeDetailsModel": { + "description": "this exists to give it a separate name from the API EmployeeeDetailsModel. As an aside, we should have had an api specific model for this", + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "titleId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "otherName": { + "type": "string", + "title": "String" + }, + "middleName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "gender": { + "type": "string", + "title": "String" + }, + "dateOfBirth": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "anniversaryDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "residentialStreetAddress": { + "type": "string", + "title": "String" + }, + "residentialAddressLine2": { + "type": "string", + "title": "String" + }, + "residentialSuburbId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "residentialSuburb": { + "type": "string", + "title": "String" + }, + "residentialState": { + "type": "string", + "title": "String" + }, + "residentialPostcode": { + "type": "string", + "title": "String" + }, + "residentialCountry": { + "type": "string", + "title": "String" + }, + "postalStreetAddress": { + "type": "string", + "title": "String" + }, + "postalAddressLine2": { + "type": "string", + "title": "String" + }, + "postalSuburbId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "postalSuburb": { + "type": "string", + "title": "String" + }, + "postalState": { + "type": "string", + "title": "String" + }, + "postalPostcode": { + "type": "string", + "title": "String" + }, + "postalCountry": { + "type": "string", + "title": "String" + }, + "email": { + "type": "string", + "title": "String" + }, + "homePhone": { + "type": "string", + "title": "String" + }, + "workPhone": { + "type": "string", + "title": "String" + }, + "mobilePhone": { + "type": "string", + "title": "String" + }, + "startDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "endDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "isTerminated": { + "type": "boolean", + "title": "Boolean" + }, + "externalReferenceId": { + "type": "string", + "title": "String" + }, + "source": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "isPostalAddressSameAsResidential": { + "type": "boolean", + "title": "Boolean" + }, + "titles": { + "type": "array", + "items": { + "$ref": "#/definitions/TitleViewModel" + }, + "xml": { + "name": "TitleViewModel", + "wrapped": true + }, + "title": "IList" + }, + "editMode": { + "enum": [ + "EmployeePortal", + "EmployeePortalReadOnly", + "BusinessPortal" + ], + "type": "string", + "title": "EmployeeDetailsEditMode" + }, + "canEdit": { + "type": "boolean", + "readOnly": true, + "title": "Boolean" + }, + "tagsString": { + "type": "string", + "title": "String" + }, + "allTags": { + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "title": "IList" + }, + "timesheetSetting": { + "enum": [ + "Disabled", + "Enabled", + "EnabledForExceptions" + ], + "type": "string", + "title": "EmployeeTimesheetSetting" + }, + "canDelete": { + "type": "boolean", + "title": "Boolean" + }, + "hasProfileImage": { + "type": "boolean", + "title": "Boolean" + }, + "canEditProfileImage": { + "type": "boolean", + "title": "Boolean" + }, + "bouncedEmail": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "EssEmployeeDetailsModel" + }, + "title": "EssEmployeeDetailsModel" + }, + "TitleViewModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "description": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "TitleViewModel" + }, + "title": "TitleViewModel" + }, + "EmployeePartialEditModel": { + "required": [ + "firstName", + "surname", + "startDate" + ], + "type": "object", + "properties": { + "titleId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "firstName": { + "maxLength": 50, + "minLength": 0, + "type": "string", + "title": "String" + }, + "otherName": { + "maxLength": 50, + "minLength": 0, + "type": "string", + "title": "String" + }, + "middleName": { + "maxLength": 50, + "minLength": 0, + "type": "string", + "title": "String" + }, + "surname": { + "maxLength": 50, + "minLength": 0, + "type": "string", + "title": "String" + }, + "dateOfBirth": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "anniversaryDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "gender": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "residentialStreetAddress": { + "maxLength": 100, + "minLength": 0, + "type": "string", + "title": "String" + }, + "residentialAddressLine2": { + "type": "string", + "title": "String" + }, + "residentialSuburbId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "residentialSuburb": { + "type": "string", + "title": "String" + }, + "residentialState": { + "type": "string", + "title": "String" + }, + "residentialPostcode": { + "type": "string", + "title": "String" + }, + "residentialCountry": { + "type": "string", + "title": "String" + }, + "postalStreetAddress": { + "maxLength": 100, + "minLength": 0, + "type": "string", + "title": "String" + }, + "postalAddressLine2": { + "type": "string", + "title": "String" + }, + "postalSuburb": { + "type": "string", + "title": "String" + }, + "postalState": { + "type": "string", + "title": "String" + }, + "postalPostcode": { + "type": "string", + "title": "String" + }, + "postalCountry": { + "type": "string", + "title": "String" + }, + "postalSuburbId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "email": { + "maxLength": 100, + "minLength": 0, + "type": "string", + "title": "String" + }, + "homePhone": { + "maxLength": 50, + "minLength": 0, + "type": "string", + "title": "String" + }, + "workPhone": { + "maxLength": 50, + "minLength": 0, + "type": "string", + "title": "String" + }, + "mobilePhone": { + "maxLength": 50, + "minLength": 0, + "type": "string", + "title": "String" + }, + "startDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "endDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "businessId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "taxFileNumber": { + "type": "string", + "title": "String" + }, + "taxFileNumberMasked": { + "type": "string", + "title": "String" + }, + "isPostalAddressSameAsResidential": { + "type": "boolean", + "title": "Boolean" + }, + "bankAccounts": { + "type": "array", + "items": { + "$ref": "#/definitions/BankAccountEditModel" + }, + "xml": { + "name": "BankAccountEditModel", + "wrapped": true + }, + "title": "IList" + }, + "externalReferenceId": { + "type": "string", + "title": "String" + }, + "source": { + "enum": [ + "None", + "Saasu", + "Xero", + "MYOB", + "Deputy", + "EmployeeTimePunch", + "ClickSuper", + "IntegratedTimesheets", + "FileImport", + "FileExport", + "QuickBooks", + "Harmony", + "AwardStore", + "Attache", + "IntegratedRostering", + "ReckonAccounts", + "API", + "MicroPower", + "RosterLive", + "NetSuite", + "Kounta", + "TimeAndAttendanceKiosk", + "DetailedFileExport", + "JonasPremier", + "WageEasy", + "Maestrano", + "WorkZone", + "EmployeePortal", + "RosterTemplate", + "Onboarding", + "Admin", + "WorkZoneClockOnOff" + ], + "type": "string", + "title": "ExternalService" + }, + "tagsString": { + "type": "string", + "title": "String" + }, + "timesheetSetting": { + "enum": [ + "Disabled", + "Enabled", + "EnabledForExceptions" + ], + "type": "string", + "title": "EmployeeTimesheetSetting" + } + }, + "xml": { + "name": "EmployeePartialEditModel" + }, + "title": "EmployeePartialEditModel" + }, + "BankAccountEditModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "bsb": { + "type": "string", + "title": "String" + }, + "accountName": { + "type": "string", + "title": "String" + }, + "accountNumber": { + "type": "string", + "title": "String" + }, + "allocatedPercentage": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "fixedAmount": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "externalReferenceId": { + "type": "string", + "title": "String" + }, + "source": { + "enum": [ + "None", + "Saasu", + "Xero", + "MYOB", + "Deputy", + "EmployeeTimePunch", + "ClickSuper", + "IntegratedTimesheets", + "FileImport", + "FileExport", + "QuickBooks", + "Harmony", + "AwardStore", + "Attache", + "IntegratedRostering", + "ReckonAccounts", + "API", + "MicroPower", + "RosterLive", + "NetSuite", + "Kounta", + "TimeAndAttendanceKiosk", + "DetailedFileExport", + "JonasPremier", + "WageEasy", + "Maestrano", + "WorkZone", + "EmployeePortal", + "RosterTemplate", + "Onboarding", + "Admin", + "WorkZoneClockOnOff" + ], + "type": "string", + "title": "ExternalService" + }, + "allocateBalance": { + "type": "boolean", + "title": "Boolean" + }, + "isEmployeeEditable": { + "type": "boolean", + "title": "Boolean" + }, + "canBeDeleted": { + "type": "boolean", + "title": "Boolean" + }, + "accountType": { + "enum": [ + "Electronic", + "ManualDeposit", + "CashOrCheque", + "Bpay" + ], + "type": "string", + "title": "BankAccountTypeEnum" + } + }, + "xml": { + "name": "BankAccountEditModel" + }, + "title": "BankAccountEditModel" + }, + "EmployeeEmergencyContactsEditModel": { + "type": "object", + "properties": { + "primaryEmergencyContact": { + "$ref": "#/definitions/EmergencyContactEditModel" + }, + "secondaryEmergencyContact": { + "$ref": "#/definitions/EmergencyContactEditModel" + }, + "canEdit": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "EmployeeEmergencyContactsEditModel" + }, + "title": "EmployeeEmergencyContactsEditModel" + }, + "EmergencyContactEditModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "relationship": { + "type": "string", + "title": "String" + }, + "address": { + "type": "string", + "title": "String" + }, + "contactNumber": { + "type": "string", + "title": "String" + }, + "alternateContactNumber": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EmergencyContactEditModel" + }, + "title": "EmergencyContactEditModel" + }, + "FeaturesModel": { + "type": "object", + "properties": { + "allowEmployeeLeaveSelfService": { + "type": "boolean", + "title": "Boolean" + }, + "allowEmployeeSelfEditing": { + "type": "boolean", + "title": "Boolean" + }, + "allowEmployeeTimesheetsSelfService": { + "type": "boolean", + "title": "Boolean" + }, + "allowEmployeeToSetUnavailability": { + "type": "boolean", + "title": "Boolean" + }, + "allowEmployeeToDeclineShifts": { + "type": "boolean", + "title": "Boolean" + }, + "allowEmployeeSuperFundSelfService": { + "type": "boolean", + "title": "Boolean" + }, + "allowEmployeeBankAccountSelfService": { + "type": "boolean", + "title": "Boolean" + }, + "allowEmployeeSatisfactionSurvey": { + "type": "boolean", + "title": "Boolean" + }, + "allowEmployeesToViewAllApprovedLeave": { + "type": "boolean", + "title": "Boolean" + }, + "unavailabilityCutOff": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "allowEmployeesToUploadProfilePicture": { + "type": "boolean", + "title": "Boolean" + }, + "allowEmployeeRosteringSelfService": { + "type": "boolean", + "title": "Boolean" + }, + "allowEmployeeExpensesSelfService": { + "type": "boolean", + "title": "Boolean" + }, + "allowEmployeeOverrideTaxCodes": { + "type": "boolean", + "title": "Boolean" + }, + "allowEmployeesToEditKioskTimesheets": { + "type": "boolean", + "title": "Boolean" + }, + "essTimesheetSetting": { + "enum": [ + "Disabled", + "ReadOnly", + "ReadWrite", + "EditKiosk", + "EditWorkZoneClockOnOff" + ], + "type": "string", + "title": "ESSTimesheetSetting" + }, + "employeeMustAcceptShifts": { + "type": "boolean", + "title": "Boolean" + }, + "allowEmployeeTimesheetsWithoutStartStopTimes": { + "type": "boolean", + "title": "Boolean" + }, + "allowEmployeeToSwapShifts": { + "type": "boolean", + "title": "Boolean" + }, + "clockOnCanSpecifyHigherClassification": { + "type": "boolean", + "title": "Boolean" + }, + "clockOnRequirePhoto": { + "type": "boolean", + "title": "Boolean" + }, + "clockOnAllowEmployeeShiftSelection": { + "type": "boolean", + "title": "Boolean" + }, + "clockOnWindowMinutes": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "clockOffWindowMinutes": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "timesheetsRequireLocation": { + "type": "boolean", + "title": "Boolean" + }, + "timesheetsRequireWorkType": { + "type": "boolean", + "title": "Boolean" + }, + "enableWorkZoneClockOn": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "FeaturesModel" + }, + "title": "FeaturesModel" + }, + "DashboardModel": { + "type": "object", + "properties": { + "latestPayslip": { + "$ref": "#/definitions/EssPayslipModel" + }, + "nextShift": { + "$ref": "#/definitions/EssRosterShiftModel" + }, + "leaveBalances": { + "type": "array", + "items": { + "$ref": "#/definitions/LeaveBalanceModel" + }, + "xml": { + "name": "LeaveBalanceModel", + "wrapped": true + }, + "title": "IList" + }, + "features": { + "$ref": "#/definitions/FeaturesModel" + }, + "titles": { + "type": "array", + "items": { + "$ref": "#/definitions/TitleViewModel" + }, + "xml": { + "name": "TitleViewModel", + "wrapped": true + }, + "title": "List" + }, + "workTypes": { + "type": "array", + "items": { + "$ref": "#/definitions/EssWorkTypeModel" + }, + "xml": { + "name": "EssWorkTypeModel", + "wrapped": true + }, + "title": "List" + }, + "shiftConditions": { + "type": "array", + "items": { + "$ref": "#/definitions/EssWorkTypeModel" + }, + "xml": { + "name": "EssWorkTypeModel", + "wrapped": true + }, + "title": "List" + }, + "locations": { + "type": "array", + "items": { + "$ref": "#/definitions/LocationModel" + }, + "xml": { + "name": "LocationModel", + "wrapped": true + }, + "title": "List" + }, + "classifications": { + "type": "array", + "items": { + "$ref": "#/definitions/ClassificationSelectModel" + }, + "readOnly": true, + "xml": { + "name": "ClassificationSelectModel", + "wrapped": true + }, + "title": "IList" + }, + "leaveCategories": { + "type": "array", + "items": { + "$ref": "#/definitions/EssLeaveCategoryModel" + }, + "xml": { + "name": "EssLeaveCategoryModel", + "wrapped": true + }, + "title": "IList" + }, + "currentWeekSatisfactionSurvey": { + "$ref": "#/definitions/EssSatisfactionSurvey" + }, + "timesheets": { + "$ref": "#/definitions/EssCurrentTimesheetsModel" + }, + "timesheetEntryPeriodEnd": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "expenseCategories": { + "type": "array", + "items": { + "$ref": "#/definitions/ExpenseCategoryResponseModel" + }, + "xml": { + "name": "ExpenseCategoryResponseModel", + "wrapped": true + }, + "title": "IList" + }, + "taxCodes": { + "type": "array", + "items": { + "$ref": "#/definitions/JournalServiceTaxCode" + }, + "xml": { + "name": "JournalServiceTaxCode", + "wrapped": true + }, + "title": "IList" + }, + "expenses": { + "$ref": "#/definitions/EssCurrentExpensesModel" + }, + "pendingShiftCount": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "proposedSwapCount": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "currentShift": { + "$ref": "#/definitions/EssCurrentShiftModel" + } + }, + "xml": { + "name": "DashboardModel" + }, + "title": "DashboardModel" + }, + "EssPayslipModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "paySchedule": { + "type": "string", + "title": "String" + }, + "datePaid": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "payPeriodStart": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "payPeriodEnd": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "netPay": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "payerName": { + "type": "string", + "title": "String" + }, + "payerAbn": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EssPayslipModel" + }, + "title": "EssPayslipModel" + }, + "EssRosterShiftModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "token": { + "type": "string", + "title": "String" + }, + "qualifications": { + "type": "array", + "items": { + "$ref": "#/definitions/EssQualificationModel" + }, + "xml": { + "name": "EssQualificationModel", + "wrapped": true + }, + "title": "IList" + }, + "breaks": { + "type": "array", + "items": { + "$ref": "#/definitions/EssRosterShiftBreakModel" + }, + "xml": { + "name": "EssRosterShiftBreakModel", + "wrapped": true + }, + "title": "IList" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "employeeName": { + "type": "string", + "title": "String" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "locationName": { + "type": "string", + "title": "String" + }, + "classificationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "classificationName": { + "type": "string", + "title": "String" + }, + "workTypeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "workTypeName": { + "type": "string", + "title": "String" + }, + "startTime": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "endTime": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "notes": { + "type": "string", + "title": "String" + }, + "published": { + "type": "boolean", + "title": "Boolean" + }, + "accepted": { + "type": "boolean", + "title": "Boolean" + }, + "pendingSwap": { + "$ref": "#/definitions/EssRosterShiftSwapModel" + }, + "datePublished": { + "format": "date-time", + "type": "string", + "title": "Nullable" + } + }, + "xml": { + "name": "EssRosterShiftModel" + }, + "title": "EssRosterShiftModel" + }, + "EssWorkTypeModel": { + "type": "object", + "properties": { + "isUnitBasedWorkType": { + "type": "boolean", + "title": "Boolean" + }, + "unitType": { + "type": "string", + "title": "String" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "payCategoryId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "leaveCategoryId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "source": { + "type": "string", + "title": "String" + }, + "accruesLeave": { + "type": "boolean", + "title": "Boolean" + }, + "employmentTypes": { + "type": "array", + "items": { + "enum": [ + "Unknown", + "FullTime", + "PartTime", + "LabourHire", + "SuperannuationIncomeStream", + "Casual" + ], + "type": "string", + "title": "EmploymentTypeEnum" + }, + "xml": { + "name": "EmploymentTypeEnum", + "wrapped": true + }, + "title": "IList" + }, + "mappingType": { + "enum": [ + "PayCategory", + "LeaveCategory", + "PrimaryPayCategory", + "ShiftCondition" + ], + "type": "string", + "title": "Nullable" + }, + "shortCode": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EssWorkTypeModel" + }, + "title": "EssWorkTypeModel" + }, + "LocationModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "parentId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "name": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "source": { + "type": "string", + "title": "String" + }, + "fullyQualifiedName": { + "type": "string", + "title": "String" + }, + "state": { + "type": "string", + "title": "String" + }, + "isGlobal": { + "type": "boolean", + "title": "Boolean" + }, + "isRollupReportingLocation": { + "type": "boolean", + "title": "Boolean" + }, + "generalLedgerMappingCode": { + "type": "string", + "title": "String" + }, + "defaultShiftConditionIds": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "IList" + } + }, + "xml": { + "name": "LocationModel" + }, + "title": "LocationModel" + }, + "ClassificationSelectModel": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "String" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + } + }, + "xml": { + "name": "ClassificationSelectModel" + }, + "title": "ClassificationSelectModel" + }, + "EssSatisfactionSurvey": { + "type": "object", + "properties": { + "value": { + "enum": [ + "NotSet", + "Happy", + "Neutral", + "Sad" + ], + "type": "string", + "title": "EmployeeSatisfactionValue" + }, + "weekStartDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + } + }, + "xml": { + "name": "EssSatisfactionSurvey" + }, + "title": "EssSatisfactionSurvey" + }, + "EssCurrentTimesheetsModel": { + "type": "object", + "properties": { + "periodStarting": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "periodEnding": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "submittedCount": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "approvedCount": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "rejectedCount": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "processedCount": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "durationInMinutes": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "EssCurrentTimesheetsModel" + }, + "title": "EssCurrentTimesheetsModel" + }, + "ExpenseCategoryResponseModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "externalTaxCodeId": { + "type": "string", + "title": "String" + }, + "taxCode": { + "type": "string", + "title": "String" + }, + "taxRate": { + "format": "double", + "type": "number", + "title": "Nullable" + } + }, + "xml": { + "name": "ExpenseCategoryResponseModel" + }, + "title": "ExpenseCategoryResponseModel" + }, + "EssCurrentExpensesModel": { + "type": "object", + "properties": { + "periodStarting": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "periodEnding": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "submittedCount": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "approvedCount": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "rejectedCount": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "processedCount": { + "format": "int32", + "type": "integer", + "title": "Int32" + } + }, + "xml": { + "name": "EssCurrentExpensesModel" + }, + "title": "EssCurrentExpensesModel" + }, + "EssCurrentShiftModel": { + "type": "object", + "properties": { + "shiftId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "clockOnTimeUtc": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "breakStartTimeUtc": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "status": { + "enum": [ + "NotClockedOn", + "ClockedOn", + "OnBreak", + "ClockedOff" + ], + "type": "string", + "title": "TimeAttendanceStatus" + }, + "longShift": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "EssCurrentShiftModel" + }, + "title": "EssCurrentShiftModel" + }, + "EssQualificationModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EssQualificationModel" + }, + "title": "EssQualificationModel" + }, + "EssRosterShiftBreakModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "startTime": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "endTime": { + "format": "date-time", + "type": "string", + "title": "DateTime" + } + }, + "xml": { + "name": "EssRosterShiftBreakModel" + }, + "title": "EssRosterShiftBreakModel" + }, + "EssRosterShiftSwapModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "fromEmployee": { + "type": "string", + "title": "String" + }, + "toEmployee": { + "type": "string", + "title": "String" + }, + "fromEmployeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "toEmployeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "dateCreated": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "note": { + "type": "string", + "title": "String" + }, + "rejectedReason": { + "type": "string", + "title": "String" + }, + "status": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "statusDescription": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EssRosterShiftSwapModel" + }, + "title": "EssRosterShiftSwapModel" + }, + "EmployeeTimesheetFilter": { + "required": [ + "fromDate", + "toDate" + ], + "type": "object", + "properties": { + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + } + }, + "xml": { + "name": "EmployeeTimesheetFilter" + }, + "title": "EmployeeTimesheetFilter" + }, + "EssTimesheetModel": { + "type": "object", + "properties": { + "canDelete": { + "type": "boolean", + "readOnly": true, + "title": "Boolean" + }, + "canEdit": { + "type": "boolean", + "readOnly": true, + "title": "Boolean" + }, + "statusId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeName": { + "type": "string", + "title": "String" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "workTypeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "classificationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "classificationName": { + "type": "string", + "title": "String" + }, + "workTypeName": { + "type": "string", + "title": "String" + }, + "locationName": { + "type": "string", + "title": "String" + }, + "unitType": { + "type": "string", + "title": "String" + }, + "isUnitBasedWorkType": { + "type": "boolean", + "title": "Boolean" + }, + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "start": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "end": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "submittedStart": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "submittedEnd": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "units": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "status": { + "enum": [ + "Missing", + "Submitted", + "Approved", + "Rejected", + "Processed" + ], + "type": "string", + "title": "TimesheetLineStatusType" + }, + "paySlipUrl": { + "type": "string", + "title": "String" + }, + "breaks": { + "type": "array", + "items": { + "$ref": "#/definitions/TimesheetBreakViewModel" + }, + "xml": { + "name": "TimesheetBreakViewModel", + "wrapped": true + }, + "title": "IList" + }, + "comments": { + "type": "string", + "title": "String" + }, + "rate": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "externalReferenceId": { + "type": "string", + "title": "String" + }, + "source": { + "enum": [ + "None", + "Saasu", + "Xero", + "MYOB", + "Deputy", + "EmployeeTimePunch", + "ClickSuper", + "IntegratedTimesheets", + "FileImport", + "FileExport", + "QuickBooks", + "Harmony", + "AwardStore", + "Attache", + "IntegratedRostering", + "ReckonAccounts", + "API", + "MicroPower", + "RosterLive", + "NetSuite", + "Kounta", + "TimeAndAttendanceKiosk", + "DetailedFileExport", + "JonasPremier", + "WageEasy", + "Maestrano", + "WorkZone", + "EmployeePortal", + "RosterTemplate", + "Onboarding", + "Admin", + "WorkZoneClockOnOff" + ], + "type": "string", + "title": "ExternalService" + }, + "payCategoryId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "leaveCategoryId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "leaveRequestId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "isLocked": { + "type": "boolean", + "title": "Boolean" + }, + "cost": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "costingData": { + "$ref": "#/definitions/ShiftCostingData" + }, + "discard": { + "type": "boolean", + "title": "Boolean" + }, + "attachment": { + "$ref": "#/definitions/AttachmentModel" + }, + "shiftConditionIds": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "IList" + }, + "isOverlapping": { + "type": "boolean", + "title": "Boolean" + }, + "overdrawsLeave": { + "type": "boolean", + "title": "Boolean" + }, + "reviewedBy": { + "type": "string", + "title": "String" + }, + "durationOverride": { + "type": "string", + "title": "Nullable" + }, + "workDurationInMinutes": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Double" + }, + "breaksDurationInMinutes": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Double" + }, + "totalDurationInMinutes": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Double" + } + }, + "xml": { + "name": "EssTimesheetModel" + }, + "title": "EssTimesheetModel" + }, + "TimesheetBreakViewModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "start": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "end": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "submittedStart": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "submittedEnd": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "formattedStart": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "formattedEnd": { + "type": "string", + "readOnly": true, + "title": "String" + } + }, + "xml": { + "name": "TimesheetBreakViewModel" + }, + "title": "TimesheetBreakViewModel" + }, + "ShiftCostingData": { + "type": "object", + "properties": { + "shiftParts": { + "type": "array", + "items": { + "$ref": "#/definitions/ShiftPartModel" + }, + "xml": { + "name": "ShiftPartModel", + "wrapped": true + }, + "title": "IList" + }, + "allowances": { + "type": "array", + "items": { + "$ref": "#/definitions/ShiftAllowanceModel" + }, + "xml": { + "name": "ShiftAllowanceModel", + "wrapped": true + }, + "title": "IList" + }, + "liabilities": { + "type": "array", + "items": { + "$ref": "#/definitions/ShiftLiabilityModel" + }, + "xml": { + "name": "ShiftLiabilityModel", + "wrapped": true + }, + "title": "IList" + }, + "isConsolidated": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "ShiftCostingData" + }, + "title": "ShiftCostingData" + }, + "ShiftPartModel": { + "type": "object", + "properties": { + "isBreak": { + "type": "boolean", + "title": "Boolean" + }, + "startTime": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "endTime": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "effectiveDuration": { + "type": "string", + "title": "TimeSpan" + }, + "actualDuration": { + "type": "string", + "title": "TimeSpan" + }, + "payCategory": { + "type": "string", + "title": "String" + }, + "payCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "cost": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "rateMultiplier": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "baseRate": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "calculatedRate": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "displayDuration": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "workType": { + "$ref": "#/definitions/NominalWorkType" + }, + "classification": { + "$ref": "#/definitions/NominalClassification" + }, + "leaveCategory": { + "$ref": "#/definitions/NominalLeaveCategory" + } + }, + "xml": { + "name": "ShiftPartModel" + }, + "title": "ShiftPartModel" + }, + "ShiftAllowanceModel": { + "type": "object", + "properties": { + "payCategory": { + "type": "string", + "title": "String" + }, + "payCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "units": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "cost": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "rateMultiplier": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "option": { + "enum": [ + "Fixed", + "PerHourWorked", + "PercentageOfShiftCost", + "PerShiftUnit" + ], + "type": "string", + "title": "ShiftAllowanceOption" + }, + "type": { + "enum": [ + "Standard", + "AllPurpose" + ], + "type": "string", + "title": "ShiftAllowanceType" + } + }, + "xml": { + "name": "ShiftAllowanceModel" + }, + "title": "ShiftAllowanceModel" + }, + "ShiftLiabilityModel": { + "type": "object", + "properties": { + "liabilityCategoryName": { + "type": "string", + "title": "String" + }, + "liabilityCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "includeInShiftCost": { + "type": "boolean", + "title": "Boolean" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "option": { + "enum": [ + "Fixed", + "PerHourWorked", + "PercentageOfShiftCost", + "PerShiftUnit" + ], + "type": "string", + "title": "ShiftAllowanceOption" + }, + "cost": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "ShiftLiabilityModel" + }, + "title": "ShiftLiabilityModel" + }, + "NominalWorkType": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "linkType": { + "enum": [ + "PayCategory", + "LeaveCategory", + "ShiftCondition" + ], + "type": "string", + "title": "WorkTypeLinkTypeRestriction" + } + }, + "xml": { + "name": "NominalWorkType" + }, + "title": "NominalWorkType" + }, + "NominalClassification": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "rank": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "NominalClassification" + }, + "title": "NominalClassification" + }, + "NominalLeaveCategory": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "NominalLeaveCategory" + }, + "title": "NominalLeaveCategory" + }, + "TimesheetLineViewModel": { + "type": "object", + "properties": { + "employeeName": { + "type": "string", + "title": "String" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "workTypeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "classificationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "classificationName": { + "type": "string", + "title": "String" + }, + "workTypeName": { + "type": "string", + "title": "String" + }, + "locationName": { + "type": "string", + "title": "String" + }, + "unitType": { + "type": "string", + "title": "String" + }, + "isUnitBasedWorkType": { + "type": "boolean", + "title": "Boolean" + }, + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "start": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "end": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "submittedStart": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "submittedEnd": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "units": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "status": { + "enum": [ + "Missing", + "Submitted", + "Approved", + "Rejected", + "Processed" + ], + "type": "string", + "title": "TimesheetLineStatusType" + }, + "paySlipUrl": { + "type": "string", + "title": "String" + }, + "breaks": { + "type": "array", + "items": { + "$ref": "#/definitions/TimesheetBreakViewModel" + }, + "xml": { + "name": "TimesheetBreakViewModel", + "wrapped": true + }, + "title": "IList" + }, + "comments": { + "type": "string", + "title": "String" + }, + "rate": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "externalReferenceId": { + "type": "string", + "title": "String" + }, + "source": { + "enum": [ + "None", + "Saasu", + "Xero", + "MYOB", + "Deputy", + "EmployeeTimePunch", + "ClickSuper", + "IntegratedTimesheets", + "FileImport", + "FileExport", + "QuickBooks", + "Harmony", + "AwardStore", + "Attache", + "IntegratedRostering", + "ReckonAccounts", + "API", + "MicroPower", + "RosterLive", + "NetSuite", + "Kounta", + "TimeAndAttendanceKiosk", + "DetailedFileExport", + "JonasPremier", + "WageEasy", + "Maestrano", + "WorkZone", + "EmployeePortal", + "RosterTemplate", + "Onboarding", + "Admin", + "WorkZoneClockOnOff" + ], + "type": "string", + "title": "ExternalService" + }, + "payCategoryId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "leaveCategoryId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "leaveRequestId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "isLocked": { + "type": "boolean", + "title": "Boolean" + }, + "cost": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "costingData": { + "$ref": "#/definitions/ShiftCostingData" + }, + "discard": { + "type": "boolean", + "title": "Boolean" + }, + "attachment": { + "$ref": "#/definitions/AttachmentModel" + }, + "shiftConditionIds": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "IList" + }, + "isOverlapping": { + "type": "boolean", + "title": "Boolean" + }, + "overdrawsLeave": { + "type": "boolean", + "title": "Boolean" + }, + "reviewedBy": { + "type": "string", + "title": "String" + }, + "durationOverride": { + "type": "string", + "title": "Nullable" + }, + "workDurationInMinutes": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Double" + }, + "breaksDurationInMinutes": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Double" + }, + "totalDurationInMinutes": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Double" + } + }, + "xml": { + "name": "TimesheetLineViewModel" + }, + "title": "TimesheetLineViewModel" + }, + "DeviceTokenModel": { + "type": "object", + "properties": { + "token": { + "type": "string", + "title": "String" + }, + "platform": { + "enum": [ + "iOS", + "Android" + ], + "type": "string", + "title": "MobilePlatform" + } + }, + "xml": { + "name": "DeviceTokenModel" + }, + "title": "DeviceTokenModel" + }, + "TimeAndAttendanceLookupDataModel": { + "type": "object", + "properties": { + "locations": { + "type": "array", + "items": { + "$ref": "#/definitions/LocationSelectModel" + }, + "xml": { + "name": "LocationSelectModel", + "wrapped": true + }, + "title": "IList" + }, + "workTypes": { + "type": "array", + "items": { + "$ref": "#/definitions/WorkTypeSelectModel" + }, + "xml": { + "name": "WorkTypeSelectModel", + "wrapped": true + }, + "title": "IList" + }, + "classifications": { + "type": "array", + "items": { + "$ref": "#/definitions/ClassificationLookupModel" + }, + "xml": { + "name": "ClassificationLookupModel", + "wrapped": true + }, + "title": "IList" + }, + "defaultLocation": { + "$ref": "#/definitions/LocationSelectModel" + }, + "shiftConditions": { + "type": "array", + "items": { + "$ref": "#/definitions/ShiftConditionSelectModel" + }, + "xml": { + "name": "ShiftConditionSelectModel", + "wrapped": true + }, + "title": "IList" + }, + "locationShiftConditions": { + "type": "array", + "items": { + "$ref": "#/definitions/LocationShiftConditionsModel" + }, + "xml": { + "name": "LocationShiftConditionsModel", + "wrapped": true + }, + "title": "IList" + } + }, + "xml": { + "name": "TimeAndAttendanceLookupDataModel" + }, + "title": "TimeAndAttendanceLookupDataModel" + }, + "LocationSelectModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "description": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "LocationSelectModel" + }, + "title": "LocationSelectModel" + }, + "WorkTypeSelectModel": { + "type": "object", + "properties": { + "isUnitBased": { + "type": "boolean", + "title": "Boolean" + }, + "isLeaveType": { + "type": "boolean", + "title": "Boolean" + }, + "unitType": { + "type": "string", + "title": "String" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "description": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "WorkTypeSelectModel" + }, + "title": "WorkTypeSelectModel" + }, + "ClassificationLookupModel": { + "description": "temporary class until ClassificationSelectModel uses the same base class as the other two", + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "description": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "ClassificationLookupModel" + }, + "title": "ClassificationLookupModel" + }, + "ShiftConditionSelectModel": { + "type": "object", + "properties": { + "shortCode": { + "type": "string", + "title": "String" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "description": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "ShiftConditionSelectModel" + }, + "title": "ShiftConditionSelectModel" + }, + "LocationShiftConditionsModel": { + "type": "object", + "properties": { + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "shiftConditionIds": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "IList" + } + }, + "xml": { + "name": "LocationShiftConditionsModel" + }, + "title": "LocationShiftConditionsModel" + }, + "ClockOnModel": { + "type": "object", + "properties": { + "locationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "classificationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "workTypeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "shiftConditionIds": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "IList" + }, + "note": { + "type": "string", + "title": "String" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "latitude": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "longitude": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "kioskId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "ipAddress": { + "type": "string", + "title": "String" + }, + "image": { + "format": "byte", + "type": "string", + "title": "Byte[]" + }, + "isAdminInitiated": { + "type": "boolean", + "title": "Boolean" + }, + "recordedTimeUtc": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "utcOffset": { + "type": "string", + "title": "Nullable" + }, + "noteVisibility": { + "enum": [ + "Hidden", + "Visible" + ], + "type": "string", + "title": "Nullable" + } + }, + "xml": { + "name": "ClockOnModel" + }, + "title": "ClockOnModel" + }, + "ClockOffModel": { + "type": "object", + "properties": { + "note": { + "type": "string", + "title": "String" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "latitude": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "longitude": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "kioskId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "ipAddress": { + "type": "string", + "title": "String" + }, + "image": { + "format": "byte", + "type": "string", + "title": "Byte[]" + }, + "isAdminInitiated": { + "type": "boolean", + "title": "Boolean" + }, + "recordedTimeUtc": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "utcOffset": { + "type": "string", + "title": "Nullable" + }, + "noteVisibility": { + "enum": [ + "Hidden", + "Visible" + ], + "type": "string", + "title": "Nullable" + } + }, + "xml": { + "name": "ClockOffModel" + }, + "title": "ClockOffModel" + }, + "StartBreakModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "latitude": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "longitude": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "kioskId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "ipAddress": { + "type": "string", + "title": "String" + }, + "image": { + "format": "byte", + "type": "string", + "title": "Byte[]" + }, + "isAdminInitiated": { + "type": "boolean", + "title": "Boolean" + }, + "recordedTimeUtc": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "utcOffset": { + "type": "string", + "title": "Nullable" + }, + "noteVisibility": { + "enum": [ + "Hidden", + "Visible" + ], + "type": "string", + "title": "Nullable" + } + }, + "xml": { + "name": "StartBreakModel" + }, + "title": "StartBreakModel" + }, + "EndBreakModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "latitude": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "longitude": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "kioskId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "ipAddress": { + "type": "string", + "title": "String" + }, + "image": { + "format": "byte", + "type": "string", + "title": "Byte[]" + }, + "isAdminInitiated": { + "type": "boolean", + "title": "Boolean" + }, + "recordedTimeUtc": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "utcOffset": { + "type": "string", + "title": "Nullable" + }, + "noteVisibility": { + "enum": [ + "Hidden", + "Visible" + ], + "type": "string", + "title": "Nullable" + } + }, + "xml": { + "name": "EndBreakModel" + }, + "title": "EndBreakModel" + }, + "GetShiftsModel": { + "type": "object", + "properties": { + "kioskId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "fromDateUtc": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "toDateUtc": { + "format": "date-time", + "type": "string", + "title": "Nullable" + } + }, + "xml": { + "name": "GetShiftsModel" + }, + "title": "GetShiftsModel" + }, + "TimeAndAttendanceShiftModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "startTimeLocal": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "startTimeUtc": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "endTimeUtc": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "endTimeLocal": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "classificationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "classificationName": { + "type": "string", + "title": "String" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "locationFullyQualifiedName": { + "type": "string", + "title": "String" + }, + "workTypeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "workTypeName": { + "type": "string", + "title": "String" + }, + "kioskId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "kioskName": { + "type": "string", + "title": "String" + }, + "timesheetLineId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "employee": { + "$ref": "#/definitions/BasicKioskEmployeeModel" + }, + "breaks": { + "type": "array", + "items": { + "$ref": "#/definitions/TimeAndAttendanceBreakModel" + }, + "xml": { + "name": "TimeAndAttendanceBreakModel", + "wrapped": true + }, + "title": "IList" + }, + "shiftConditions": { + "type": "array", + "items": { + "$ref": "#/definitions/ShiftConditionModel" + }, + "xml": { + "name": "ShiftConditionModel", + "wrapped": true + }, + "title": "IList" + } + }, + "xml": { + "name": "TimeAndAttendanceShiftModel" + }, + "title": "TimeAndAttendanceShiftModel" + }, + "BasicKioskEmployeeModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "name": { + "type": "string", + "title": "String" + }, + "hasEmail": { + "type": "boolean", + "title": "Boolean" + }, + "profileImageUrl": { + "type": "string", + "title": "String" + }, + "hasProfileImage": { + "type": "boolean", + "title": "Boolean" + }, + "mobileNumber": { + "type": "string", + "title": "String" + }, + "status": { + "enum": [ + "NotClockedOn", + "ClockedOn", + "OnBreak", + "ClockedOff" + ], + "type": "string", + "title": "TimeAttendanceStatus" + }, + "longShift": { + "type": "boolean", + "title": "Boolean" + }, + "clockOnTimeUtc": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "breakStartTimeUtc": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "recordedTimeUtc": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "currentShiftId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "BasicKioskEmployeeModel" + }, + "title": "BasicKioskEmployeeModel" + }, + "TimeAndAttendanceBreakModel": { + "type": "object", + "properties": { + "startTimeUtc": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "startTimeLocal": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "endTimeUtc": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "endTimeLocal": { + "format": "date-time", + "type": "string", + "title": "Nullable" + } + }, + "xml": { + "name": "TimeAndAttendanceBreakModel" + }, + "title": "TimeAndAttendanceBreakModel" + }, + "ShiftConditionModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "ShiftConditionModel" + }, + "title": "ShiftConditionModel" + }, + "AddNoteModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "type": { + "enum": [ + "Shift", + "ClockOn", + "ClockOff" + ], + "type": "string", + "title": "TimeAttendanceShiftNoteType" + }, + "visibility": { + "enum": [ + "Hidden", + "Visible" + ], + "type": "string", + "title": "TimeAttendanceShiftNoteVisibility" + }, + "note": { + "type": "string", + "title": "String" + }, + "isAdminInitiated": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "AddNoteModel" + }, + "title": "AddNoteModel" + }, + "GetShiftNotesModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "isAdminInitiated": { + "type": "boolean", + "title": "Boolean" + }, + "type": { + "enum": [ + "Shift", + "ClockOn", + "ClockOff" + ], + "type": "string", + "title": "Nullable" + }, + "visibility": { + "enum": [ + "Hidden", + "Visible" + ], + "type": "string", + "title": "Nullable" + } + }, + "xml": { + "name": "GetShiftNotesModel" + }, + "title": "GetShiftNotesModel" + }, + "MarkNotesReadViewModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "noteIds": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "Int32[]" + }, + "read": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "MarkNotesReadViewModel" + }, + "title": "MarkNotesReadViewModel" + }, + "EssPaymentSummaryModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "period": { + "type": "string", + "title": "String" + }, + "isEtp": { + "type": "boolean", + "title": "Boolean" + }, + "etpCode": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EssPaymentSummaryModel" + }, + "title": "EssPaymentSummaryModel" + }, + "EssDocumentModel": { + "type": "object", + "properties": { + "id": { + "type": "string", + "title": "String" + }, + "friendlyName": { + "type": "string", + "title": "String" + }, + "dateCreated": { + "format": "date-time", + "type": "string", + "title": "DateTime" + } + }, + "xml": { + "name": "EssDocumentModel" + }, + "title": "EssDocumentModel" + }, + "EmployeeUnavailabilityFilter": { + "type": "object", + "properties": { + "fromDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + } + }, + "xml": { + "name": "EmployeeUnavailabilityFilter" + }, + "title": "EmployeeUnavailabilityFilter" + }, + "EssUnavailabilityModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "endDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "reason": { + "type": "string", + "title": "String" + }, + "recurring": { + "type": "boolean", + "title": "Boolean" + }, + "recurringDay": { + "enum": [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday" + ], + "type": "string", + "title": "Nullable" + }, + "isAllDay": { + "type": "boolean", + "readOnly": true, + "title": "Boolean" + }, + "viewOnly": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "EssUnavailabilityModel" + }, + "title": "EssUnavailabilityModel" + }, + "UnavailabilityEditModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "endDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "reason": { + "type": "string", + "title": "String" + }, + "recurring": { + "type": "boolean", + "title": "Boolean" + }, + "recurringDay": { + "enum": [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday" + ], + "type": "string", + "title": "Nullable" + }, + "isAllDay": { + "type": "boolean", + "readOnly": true, + "title": "Boolean" + }, + "viewOnly": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "UnavailabilityEditModel" + }, + "title": "UnavailabilityEditModel" + }, + "AvailableEmployeeModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "businessId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "businessName": { + "type": "string", + "title": "String" + }, + "jobTitle": { + "type": "string", + "title": "String" + }, + "hasProfileImage": { + "type": "boolean", + "title": "Boolean" + }, + "branding": { + "$ref": "#/definitions/WhiteLabelBrandingModel" + }, + "defaultLocationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "profileImageUrl": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "AvailableEmployeeModel" + }, + "title": "AvailableEmployeeModel" + }, + "WhiteLabelBrandingModel": { + "type": "object", + "properties": { + "logoUrl": { + "type": "string", + "title": "String" + }, + "backgroundImageUrl": { + "type": "string", + "title": "String" + }, + "backgroundColour": { + "type": "string", + "title": "String" + }, + "textColour": { + "type": "string", + "title": "String" + }, + "textHoverColour": { + "type": "string", + "title": "String" + }, + "textSecondaryColour": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "WhiteLabelBrandingModel" + }, + "title": "WhiteLabelBrandingModel" + }, + "RecoverPasswordModel": { + "required": [ + "username" + ], + "type": "object", + "properties": { + "username": { + "type": "string", + "title": "String" + }, + "messageType": { + "enum": [ + "NewPaySlipAvailable", + "NewUser", + "RecoverPassword", + "EmployeeAccess", + "BusinessAccess", + "CancelAccount", + "Invoice", + "InvoicePaymentSuccessNotification", + "AutomatedPassword", + "LeaveRequestNotification", + "RestrictedAccess", + "ResendPayslip", + "PaymentSummaryAvailable", + "SuperPaymentsUpdateResults", + "InvoicePaymentFailedNotification", + "NewShiftsPublished", + "ShiftsUnpublished", + "ShiftDeclined", + "KioskAccessGranted", + "DailyNotifications", + "BsbDataImported", + "InvoiceeCardDetailsRemoved", + "WhiteLabelManagerAccess", + "ResellerAccess", + "DirectDepositReminder", + "DataIntegrityCheckFailed", + "ExpenseRequestNotification", + "UnavailabilityNotification", + "ReportPackGenerated", + "ReportPackError", + "SystemPublicHolidayImport", + "TimesheetRejected", + "ShiftRepublished", + "PendingShiftsReminder", + "EmployeeShiftActionTimeout", + "InitiateEmployeeOnboarding", + "FollowUpEmployeeOnboarding", + "CompleteEmployeeOnboarding", + "NewShiftsPreAccepted", + "PayRunTaskNotification", + "ShiftSwapCancelled", + "BulkShiftSwapsCancelled", + "ShiftSwapAwaitingApproval", + "ShiftSwapProposed", + "ShiftSwapAccepted", + "ShiftSwapDeclined", + "ShiftSwapRejected", + "ShiftSwapApproved" + ], + "type": "string", + "title": "MessageTypeEnum" + } + }, + "xml": { + "name": "RecoverPasswordModel" + }, + "title": "RecoverPasswordModel" + }, + "EmployeeExpensePaymentSummaryModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "expenseCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "expenseCategoryName": { + "type": "string", + "title": "String" + }, + "ytdAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "totalAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "EmployeeExpensePaymentSummaryModel" + }, + "title": "EmployeeExpensePaymentSummaryModel" + }, + "EssExpenseRequestResponseModel": { + "type": "object", + "properties": { + "canCancel": { + "type": "boolean", + "readOnly": true, + "title": "Boolean" + }, + "canModify": { + "type": "boolean", + "readOnly": true, + "title": "Boolean" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeName": { + "type": "string", + "title": "String" + }, + "status": { + "type": "string", + "title": "String" + }, + "description": { + "type": "string", + "title": "String" + }, + "lineItems": { + "type": "array", + "items": { + "$ref": "#/definitions/ExpenseRequestLineItemModel" + }, + "xml": { + "name": "ExpenseRequestLineItemModel", + "wrapped": true + }, + "title": "List" + }, + "attachments": { + "type": "array", + "items": { + "$ref": "#/definitions/AttachmentModel" + }, + "xml": { + "name": "AttachmentModel", + "wrapped": true + }, + "title": "List" + }, + "statusUpdatedByUser": { + "type": "string", + "title": "String" + }, + "statusUpdateNotes": { + "type": "string", + "title": "String" + }, + "dateStatusUpdated": { + "format": "date-time", + "type": "string", + "title": "DateTime" + } + }, + "xml": { + "name": "EssExpenseRequestResponseModel" + }, + "title": "EssExpenseRequestResponseModel" + }, + "LeaveAllowanceModel": { + "type": "object", + "properties": { + "leaveCategoryId": { + "type": "string", + "title": "String" + }, + "leaveCategoryName": { + "type": "string", + "title": "String" + }, + "units": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "unitType": { + "type": "string", + "title": "String" + }, + "hoursPerYear": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "automaticallyAccrues": { + "type": "boolean", + "title": "Boolean" + }, + "leaveLoading": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "LeaveAllowanceModel" + }, + "title": "LeaveAllowanceModel" + }, + "SubmitEmployeeLeaveAllowancesRequest": { + "type": "object", + "properties": { + "employeeIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "leaveCategoryIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "leaveAllowances": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/LeaveAllowanceModel" + }, + "xml": { + "name": "LeaveAllowanceModel", + "wrapped": true + }, + "title": "List" + }, + "title": "Dictionary" + } + }, + "xml": { + "name": "SubmitEmployeeLeaveAllowancesRequest" + }, + "title": "SubmitEmployeeLeaveAllowancesRequest" + }, + "ODataQueryOptions[LeaveAllowanceTemplate]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "ODataQueryOptions[LeaveCategory]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "LeaveCategoryModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "unitType": { + "enum": [ + "Days", + "Weeks", + "HoursPerHourWorked", + "HoursPerPayRun" + ], + "type": "string", + "title": "LeaveAllowanceUnitEnum" + }, + "units": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "automaticallyAccrues": { + "type": "boolean", + "title": "Boolean" + }, + "isPrivate": { + "type": "boolean", + "title": "Boolean" + }, + "excludeFromTerminationPayout": { + "type": "boolean", + "title": "Boolean" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "source": { + "type": "string", + "title": "String" + }, + "leaveLoading": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "contingentPeriod": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "entitlementPeriod": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "isBalanceUntracked": { + "type": "boolean", + "title": "Boolean" + }, + "leaveCategoryType": { + "enum": [ + "Standard", + "LongServiceLeave" + ], + "type": "string", + "title": "LeaveCategoryTypeEnum" + }, + "deductFromPrimaryPayCategory": { + "type": "boolean", + "title": "Boolean" + }, + "deductFromPayCategoryId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "transferToPayCategoryId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "hideAccrualsOnPayslip": { + "type": "boolean", + "title": "Boolean" + }, + "useDeductFromPayCategoryRate": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "LeaveCategoryModel" + }, + "title": "LeaveCategoryModel" + }, + "LeaveRequestFilterModel": { + "type": "object", + "properties": { + "status": { + "enum": [ + "Pending", + "Approved", + "Cancelled", + "Rejected" + ], + "type": "string", + "title": "Nullable" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "leaveCategoryId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "groupBy": { + "enum": [ + "Employee", + "LeaveType" + ], + "type": "string", + "title": "LeaveRequestGroupBy" + }, + "restrictOverlappingLeave": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "LeaveRequestFilterModel" + }, + "title": "LeaveRequestFilterModel" + }, + "LeaveRequestResponseModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "leaveCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employee": { + "type": "string", + "title": "String" + }, + "leaveCategory": { + "type": "string", + "title": "String" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "totalHours": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "hoursApplied": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "notes": { + "type": "string", + "title": "String" + }, + "status": { + "type": "string", + "title": "String" + }, + "attachmentId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "LeaveRequestResponseModel" + }, + "title": "LeaveRequestResponseModel" + }, + "ODataQueryOptions[LeaveRequest]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "ApiLeaveApplicationModel": { + "required": [ + "fromDate", + "toDate", + "hours", + "leaveCategoryId" + ], + "type": "object", + "properties": { + "automaticallyApprove": { + "type": "boolean", + "title": "Boolean" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "requireNotesForLeaveRequests": { + "type": "boolean", + "title": "Boolean" + }, + "attachment": { + "$ref": "#/definitions/AttachmentModel" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "hours": { + "format": "double", + "maximum": 2000, + "type": "number", + "title": "Decimal" + }, + "leaveCategoryId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "notes": { + "maxLength": 255, + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "ApiLeaveApplicationModel" + }, + "title": "ApiLeaveApplicationModel" + }, + "DeclineLeaveRequest": { + "type": "object", + "properties": { + "reason": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "DeclineLeaveRequest" + }, + "title": "DeclineLeaveRequest" + }, + "ODataQueryOptions[Location]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "NameIdPair": { + "type": "object", + "properties": { + "id": { + "type": "string", + "title": "String" + }, + "name": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "NameIdPair" + }, + "title": "NameIdPair" + }, + "EssDeclineRosterShiftModel": { + "required": [ + "reason" + ], + "type": "object", + "properties": { + "reason": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EssDeclineRosterShiftModel" + }, + "title": "EssDeclineRosterShiftModel" + }, + "EssBulkAcceptRosterShiftsModel": { + "type": "object", + "properties": { + "shifts": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "IList" + } + }, + "xml": { + "name": "EssBulkAcceptRosterShiftsModel" + }, + "title": "EssBulkAcceptRosterShiftsModel" + }, + "EssBulkDeclineRosterShiftsModel": { + "required": [ + "reason" + ], + "type": "object", + "properties": { + "reason": { + "type": "string", + "title": "String" + }, + "shifts": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "IList" + } + }, + "xml": { + "name": "EssBulkDeclineRosterShiftsModel" + }, + "title": "EssBulkDeclineRosterShiftsModel" + }, + "RosterShiftMatchingResultModel": { + "type": "object", + "properties": { + "shift": { + "$ref": "#/definitions/EssRosterShiftModel" + } + }, + "xml": { + "name": "RosterShiftMatchingResultModel" + }, + "title": "RosterShiftMatchingResultModel" + }, + "SwapShiftModel": { + "type": "object", + "properties": { + "rosterShiftId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "fromEmployeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "toEmployeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "note": { + "type": "string", + "title": "String" + }, + "dateCreated": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "createdByUserId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "token": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "SwapShiftModel" + }, + "title": "SwapShiftModel" + }, + "EssBulkRosterShiftSwapModel": { + "type": "object", + "properties": { + "shifts": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "IList" + } + }, + "xml": { + "name": "EssBulkRosterShiftSwapModel" + }, + "title": "EssBulkRosterShiftSwapModel" + }, + "TasksReportRequestModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "payScheduleId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "status": { + "enum": [ + "All", + "Completed", + "NotCompleted" + ], + "type": "string", + "title": "TasksReportStatusEnum" + } + }, + "xml": { + "name": "TasksReportRequestModel" + }, + "title": "TasksReportRequestModel" + }, + "TasksReportExportModel": { + "type": "object", + "properties": { + "payRunTaskId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeName": { + "type": "string", + "title": "String" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "taskDescription": { + "type": "string", + "title": "String" + }, + "createdBy": { + "type": "string", + "title": "String" + }, + "createdDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "dueDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "completed": { + "type": "boolean", + "title": "Boolean" + }, + "notes": { + "type": "array", + "items": { + "$ref": "#/definitions/TasksReportNoteModel" + }, + "xml": { + "name": "TasksReportNoteModel", + "wrapped": true + }, + "title": "List" + }, + "completedBy": { + "type": "string", + "title": "String" + }, + "completedDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + } + }, + "xml": { + "name": "TasksReportExportModel" + }, + "title": "TasksReportExportModel" + }, + "TasksReportNoteModel": { + "type": "object", + "properties": { + "username": { + "type": "string", + "title": "String" + }, + "dateCreated": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "note": { + "type": "string", + "title": "String" + }, + "isVisibleToManager": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "TasksReportNoteModel" + }, + "title": "TasksReportNoteModel" + }, + "ShiftSwappingReportRequestModel": { + "type": "object", + "properties": { + "fromEmployeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "toEmployeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "includeCosts": { + "type": "boolean", + "title": "Boolean" + }, + "statuses": { + "type": "array", + "items": { + "enum": [ + "Created", + "Cancelled", + "Accepted", + "Declined", + "AwaitingManagerApproval", + "ApprovedByManager", + "RejectedByManager" + ], + "type": "string", + "title": "RosterShiftSwapStatusEnum" + }, + "xml": { + "name": "RosterShiftSwapStatusEnum", + "wrapped": true + }, + "title": "IList" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employingEntityId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "ShiftSwappingReportRequestModel" + }, + "title": "ShiftSwappingReportRequestModel" + }, + "ShiftSwappingReportExportModel": { + "type": "object", + "properties": { + "fromEmployeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "fromEmployeeName": { + "type": "string", + "title": "String" + }, + "toEmployeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "toEmployeeName": { + "type": "string", + "title": "String" + }, + "start": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "startTime": { + "type": "string", + "title": "TimeSpan" + }, + "end": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "endTime": { + "type": "string", + "title": "TimeSpan" + }, + "locationId": { + "type": "string", + "title": "String" + }, + "location": { + "type": "string", + "title": "String" + }, + "workTypeId": { + "type": "string", + "title": "String" + }, + "workType": { + "type": "string", + "title": "String" + }, + "status": { + "type": "string", + "title": "String" + }, + "oldCost": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "newCost": { + "format": "double", + "type": "number", + "title": "Nullable" + } + }, + "xml": { + "name": "ShiftSwappingReportExportModel" + }, + "title": "ShiftSwappingReportExportModel" + }, + "ODataQueryOptions[PayCategory]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "PayCategoryModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "parentId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "name": { + "type": "string", + "title": "String" + }, + "rateUnit": { + "enum": [ + "Hourly", + "Annually", + "Fixed", + "Daily" + ], + "type": "string", + "title": "RateUnitEnum" + }, + "accruesLeave": { + "type": "boolean", + "title": "Boolean" + }, + "defaultSuperRate": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "rateLoadingPercent": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "penaltyLoadingPercent": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "isTaxExempt": { + "type": "boolean", + "title": "Boolean" + }, + "isPayrollTaxExempt": { + "type": "boolean", + "title": "Boolean" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "source": { + "type": "string", + "title": "String" + }, + "generalLedgerMappingCode": { + "type": "string", + "title": "String" + }, + "superExpenseMappingCode": { + "type": "string", + "title": "String" + }, + "superLiabilityMappingCode": { + "type": "string", + "title": "String" + }, + "isSystemPayCategory": { + "type": "boolean", + "title": "Boolean" + }, + "numberOfDecimalPlaces": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "paymentSummaryClassification": { + "enum": [ + "Default", + "Allowance", + "LumpSumATypeR", + "LumpSumATypeT", + "LumpSumB", + "LumpSumD", + "LumpSumE", + "Exclude", + "Cdep", + "ExemptForeignEmploymentIncome" + ], + "type": "string", + "title": "Nullable" + } + }, + "xml": { + "name": "PayCategoryModel" + }, + "title": "PayCategoryModel" + }, + "ODataQueryOptions[PaygPaymentSummarySnapshot]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "PaygPaymentSummaryModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employingEntityId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "dateGenerated": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "paymentSummaryType": { + "enum": [ + "BusinessAndPersonalServicesIncome", + "EmployeeTerminationPayment", + "ForeignEmployment", + "IndividualNonBusiness", + "SuperannuationIncomeStream", + "SuperannuationLumpSum" + ], + "type": "string", + "title": "PaygPaymentSummaryTypeEnum" + }, + "status": { + "enum": [ + "Generated", + "Published", + "Unpublished" + ], + "type": "string", + "title": "PaygPaymentSummaryStatus" + }, + "etpCode": { + "type": "string", + "title": "String" + }, + "isAmended": { + "type": "boolean", + "title": "Boolean" + }, + "payeeName": { + "type": "string", + "title": "String" + }, + "payeeAddress": { + "type": "string", + "title": "String" + }, + "payeeAddressLine2": { + "type": "string", + "title": "String" + }, + "payeeSuburb": { + "type": "string", + "title": "String" + }, + "payeePostCode": { + "type": "string", + "title": "String" + }, + "payeeState": { + "type": "string", + "title": "String" + }, + "paymentPeriodStart": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "paymentPeriodEnd": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "financialYearStart": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "financialYearEnd": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "payeeTaxFileNumber": { + "type": "string", + "title": "String" + }, + "totalTaxWithheld": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "grossPayments": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "cdepPayments": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "fringeBenefits": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "isExemptFromFringeBenefitsTax": { + "type": "boolean", + "title": "Nullable" + }, + "employerSuperContributions": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "totalAllowances": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "lumpSumA": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "lumpSumB": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "lumpSumD": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "lumpSumE": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "lumpSumAType": { + "type": "string", + "title": "String" + }, + "notReportedAmount": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "allowances": { + "type": "object", + "additionalProperties": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "Dictionary" + }, + "unionFeeDeductions": { + "type": "object", + "additionalProperties": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "Dictionary" + }, + "workplaceGiving": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "exemptForeignEmploymentIncome": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "deductibleAmountOfUndeductedAnnuityPrice": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "otherAmounts": { + "type": "array", + "items": { + "$ref": "#/definitions/OtherAmounts" + }, + "xml": { + "name": "OtherAmounts", + "wrapped": true + }, + "title": "IList" + }, + "payerABN": { + "type": "string", + "title": "String" + }, + "payerName": { + "type": "string", + "title": "String" + }, + "payerBranch": { + "type": "string", + "title": "String" + }, + "payerSignatory": { + "type": "string", + "title": "String" + }, + "paymentDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "isTransitionalTerminationPayment": { + "type": "boolean", + "title": "Boolean" + }, + "isPartOfEarlierPayment": { + "type": "boolean", + "title": "Boolean" + }, + "taxableComponent": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "taxFreeComponent": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "payeeABN": { + "type": "string", + "title": "String" + }, + "paymentType": { + "type": "string", + "title": "String" + }, + "grossPaymentType": { + "type": "string", + "title": "String" + }, + "foreignTaxPaid": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "taxableComponentTaxedElement": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "taxableComponentUntaxedElement": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "taxableComponentTaxFreeComponent": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "taxableComponentTaxOffsetAmount": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "lumpSumInArrearsTaxedElement": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "lumpSumInArrearsUntaxedElement": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "lumpSumInArrearsTaxFreeComponent": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "isDeathBenefit": { + "type": "boolean", + "title": "Boolean" + }, + "deathBenefitType": { + "type": "string", + "title": "String" + }, + "inputGrossEarnings": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "inputPreTaxDeductionAmount": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "totalDeductions": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Decimal" + } + }, + "xml": { + "name": "PaygPaymentSummaryModel" + }, + "title": "PaygPaymentSummaryModel" + }, + "OtherAmounts": { + "type": "object", + "properties": { + "workPlaceGiving": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "exemptForeignExemptIncome": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "deductibleAmountOfUndeductedAnnuityPrice": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "OtherAmounts" + }, + "title": "OtherAmounts" + }, + "ODataQueryOptions[PayRateTemplate]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "PayRunEmployeeExpenseResponse": { + "type": "object", + "properties": { + "employeeExpenses": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeExpenseModel" + }, + "xml": { + "name": "EmployeeExpenseModel", + "wrapped": true + }, + "title": "List" + }, + "readOnly": true, + "title": "Dictionary" + }, + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Int32" + } + }, + "xml": { + "name": "PayRunEmployeeExpenseResponse" + }, + "example": { + "employeeExpenses": { + "12345": [ + { + "employeeExpenseCategoryId": "98", + "employeeExpenseCategoryName": "My expense category", + "notes": "Some notes", + "amount": 12.34, + "taxCode": "42rty", + "taxRate": 0.5, + "taxCodeDisplayName": "Tax Code Display", + "id": 0, + "externalId": null, + "locationId": "39", + "locationName": "My Location", + "employeeId": "12345", + "employeeName": "Bob Bobberson", + "employeeExternalId": "EMP01" + } + ] + }, + "payRunId": 999 + }, + "title": "PayRunEmployeeExpenseResponse" + }, + "EmployeeExpenseModel": { + "type": "object", + "properties": { + "employeeExpenseCategoryId": { + "type": "string", + "title": "String" + }, + "employeeExpenseCategoryName": { + "type": "string", + "title": "String" + }, + "notes": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "taxCode": { + "type": "string", + "title": "String" + }, + "taxRate": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "taxCodeDisplayName": { + "type": "string", + "title": "String" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "locationId": { + "type": "string", + "title": "String" + }, + "locationName": { + "type": "string", + "title": "String" + }, + "employeeId": { + "type": "string", + "title": "String" + }, + "employeeName": { + "type": "string", + "title": "String" + }, + "employeeExternalId": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EmployeeExpenseModel" + }, + "title": "EmployeeExpenseModel" + }, + "SubmitPayRunEmployeeExpenseRequest": { + "type": "object", + "properties": { + "locationIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "employeeExpenseCategoryIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "expenses": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployeeExpenseModel" + }, + "xml": { + "name": "EmployeeExpenseModel", + "wrapped": true + }, + "title": "List" + }, + "title": "Dictionary" + }, + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "replaceExisting": { + "type": "boolean", + "title": "Boolean" + }, + "suppressCalculations": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "SubmitPayRunEmployeeExpenseRequest" + }, + "title": "SubmitPayRunEmployeeExpenseRequest" + }, + "PayRunDetailsModel": { + "type": "object", + "properties": { + "payRun": { + "$ref": "#/definitions/PayRunModel" + }, + "payRunTotals": { + "type": "array", + "items": { + "$ref": "#/definitions/PayRunTotalGridModel" + }, + "xml": { + "name": "PayRunTotalGridModel", + "wrapped": true + }, + "title": "IList" + }, + "grandTotal": { + "$ref": "#/definitions/PayRunGrandTotalModel" + } + }, + "xml": { + "name": "PayRunDetailsModel" + }, + "title": "PayRunDetailsModel" + }, + "PayRunModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "dateFinalised": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "payScheduleId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "payPeriodStarting": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "payPeriodEnding": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "datePaid": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "isFinalised": { + "type": "boolean", + "title": "Boolean" + }, + "paySlipsPublished": { + "type": "boolean", + "title": "Boolean" + }, + "notation": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "PayRunModel" + }, + "title": "PayRunModel" + }, + "PayRunTotalGridModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeName": { + "type": "string", + "title": "String" + }, + "totalHours": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "grossEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "netEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "paygWithholdingAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "paygWithholdingPercent": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Decimal" + }, + "sfssAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "helpAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "superContribution": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "employerContribution": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "superContributionMinusSuperAdjustments": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Decimal" + }, + "allSuperContributionsTotal": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Decimal" + }, + "taxableEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "postTaxDeductionAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "preTaxDeductionAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "grossPlusSuper": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Decimal" + }, + "payConditionRuleSetName": { + "type": "string", + "title": "String" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "isTermination": { + "type": "boolean", + "title": "Boolean" + }, + "notation": { + "type": "string", + "title": "String" + }, + "employeeStartDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "employeeExternalReferenceId": { + "type": "string", + "title": "String" + }, + "isExcluded": { + "type": "boolean", + "title": "Boolean" + }, + "employeeExternalId": { + "type": "string", + "title": "String" + }, + "superAdjustmentsAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "salarySacrificeSuperAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "memberVoluntarySuperAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "nonSuperDeductionTotal": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "superPaymentsTotal": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "bankPaymentsTotal": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "terminationDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "earliestTerminationDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "previousTerminationDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "employeeExpensesTotal": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "employerLiabilitiesTotal": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "isEmployeeUnder18": { + "type": "boolean", + "title": "Boolean" + }, + "employerContributionAdjustmentsAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "paygAdjustmentsAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "superContributionsCapApplied": { + "type": "boolean", + "title": "Boolean" + }, + "isComplete": { + "type": "boolean", + "title": "Boolean" + }, + "paygPaymentTotal": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "PayRunTotalGridModel" + }, + "title": "PayRunTotalGridModel" + }, + "PayRunGrandTotalModel": { + "type": "object", + "properties": { + "numberOfEmployees": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "totalHours": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "taxableEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "grossEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "netEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "paygWithholdingAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "sfssAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "helpAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "superContribution": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "preTaxDeductionAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "postTaxDeductionAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "employerContribution": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "employeeExpensesTotal": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "employerLiabilitiesTotal": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "PayRunGrandTotalModel" + }, + "title": "PayRunGrandTotalModel" + }, + "TerminateEmployeeRequest": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + } + }, + "xml": { + "name": "TerminateEmployeeRequest" + }, + "title": "TerminateEmployeeRequest" + }, + "ApiPaySlipModel": { + "type": "object", + "properties": { + "totalAccruedLeave": { + "type": "array", + "items": { + "$ref": "#/definitions/ApiPaySlipLeaveModel" + }, + "xml": { + "name": "ApiPaySlipLeaveModel", + "wrapped": true + }, + "title": "IList" + }, + "accruedLeave": { + "type": "array", + "items": { + "$ref": "#/definitions/ApiPaySlipLeaveModel" + }, + "xml": { + "name": "ApiPaySlipLeaveModel", + "wrapped": true + }, + "title": "IList" + }, + "leaveTaken": { + "type": "array", + "items": { + "$ref": "#/definitions/ApiPaySlipLeaveModel" + }, + "xml": { + "name": "ApiPaySlipLeaveModel", + "wrapped": true + }, + "title": "IList" + }, + "paygAdjustments": { + "type": "array", + "items": { + "$ref": "#/definitions/ApiPaySlipPaygAdjustmentModel" + }, + "xml": { + "name": "ApiPaySlipPaygAdjustmentModel", + "wrapped": true + }, + "title": "IList" + }, + "superAdjustments": { + "type": "array", + "items": { + "$ref": "#/definitions/ApiPaySlipSuperAdjustmentModel" + }, + "xml": { + "name": "ApiPaySlipSuperAdjustmentModel", + "wrapped": true + }, + "title": "IList" + }, + "earningsLines": { + "type": "array", + "items": { + "$ref": "#/definitions/ApiPaySlipEarningsLineModel" + }, + "xml": { + "name": "ApiPaySlipEarningsLineModel", + "wrapped": true + }, + "title": "IList" + }, + "deductions": { + "type": "array", + "items": { + "$ref": "#/definitions/ApiPaySlipDeductionModel" + }, + "xml": { + "name": "ApiPaySlipDeductionModel", + "wrapped": true + }, + "title": "IList" + }, + "superPayments": { + "type": "array", + "items": { + "$ref": "#/definitions/ApiPaySlipSuperPaymentModel" + }, + "xml": { + "name": "ApiPaySlipSuperPaymentModel", + "wrapped": true + }, + "title": "IList" + }, + "bankPayments": { + "type": "array", + "items": { + "$ref": "#/definitions/ApiPaySlipBankPaymentModel" + }, + "xml": { + "name": "ApiPaySlipBankPaymentModel", + "wrapped": true + }, + "title": "IList" + }, + "grossYTDDetails": { + "type": "array", + "items": { + "$ref": "#/definitions/ApiYearToDateEarningsBreakdownModel" + }, + "xml": { + "name": "ApiYearToDateEarningsBreakdownModel", + "wrapped": true + }, + "title": "IList" + }, + "employeeExpenses": { + "type": "array", + "items": { + "$ref": "#/definitions/ApiEmployeeExpenseGridModel" + }, + "xml": { + "name": "ApiEmployeeExpenseGridModel", + "wrapped": true + }, + "title": "IList" + }, + "totalHours": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "grossEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "netEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "paygWithholdingAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "sfssAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "helpAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "superContribution": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "taxableEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "postTaxDeductionAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "preTaxDeductionAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "businessName": { + "type": "string", + "title": "String" + }, + "businessAddress": { + "type": "string", + "title": "String" + }, + "abn": { + "type": "string", + "title": "String" + }, + "contactName": { + "type": "string", + "title": "String" + }, + "payPeriodStarting": { + "type": "string", + "title": "String" + }, + "payPeriodEnding": { + "type": "string", + "title": "String" + }, + "message": { + "type": "string", + "title": "String" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeExternalId": { + "type": "string", + "title": "String" + }, + "employeeName": { + "type": "string", + "title": "String" + }, + "employeeFirstName": { + "type": "string", + "title": "String" + }, + "employeeSurname": { + "type": "string", + "title": "String" + }, + "employeePostalStreetAddress": { + "type": "string", + "title": "String" + }, + "employeePostalAddressLine2": { + "type": "string", + "title": "String" + }, + "employeePostalSuburbName": { + "type": "string", + "title": "String" + }, + "employeePostalSuburbPostcode": { + "type": "string", + "title": "String" + }, + "employeePostalSuburbState": { + "type": "string", + "title": "String" + }, + "notation": { + "type": "string", + "title": "String" + }, + "isPublished": { + "type": "boolean", + "title": "Boolean" + }, + "grossYTD": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "netYTD": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "paygYTD": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "superYTD": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "taxableEarningsYTD": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "basePayRate": { + "type": "string", + "title": "String" + }, + "baseRate": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "hourlyRate": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "preTaxDeductionsYTD": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "postTaxDeductionsYTD": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "sfssYTD": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "helpYTD": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "employeeBaseRate": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "employeeBaseRateUnit": { + "enum": [ + "Hourly", + "Annually", + "Fixed", + "Daily" + ], + "type": "string", + "title": "RateUnitEnum" + } + }, + "xml": { + "name": "ApiPaySlipModel" + }, + "title": "ApiPaySlipModel" + }, + "ApiPaySlipLeaveModel": { + "type": "object", + "properties": { + "leaveCategory": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "notes": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "ApiPaySlipLeaveModel" + }, + "title": "ApiPaySlipLeaveModel" + }, + "ApiPaySlipPaygAdjustmentModel": { + "type": "object", + "properties": { + "notes": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "ApiPaySlipPaygAdjustmentModel" + }, + "title": "ApiPaySlipPaygAdjustmentModel" + }, + "ApiPaySlipSuperAdjustmentModel": { + "type": "object", + "properties": { + "notes": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "ApiPaySlipSuperAdjustmentModel" + }, + "title": "ApiPaySlipSuperAdjustmentModel" + }, + "ApiPaySlipEarningsLineModel": { + "type": "object", + "properties": { + "payCategoryName": { + "type": "string", + "title": "String" + }, + "units": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "isFixed": { + "type": "boolean", + "title": "Boolean" + }, + "isTaxExempt": { + "type": "boolean", + "title": "Boolean" + }, + "rate": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "superContribution": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "notes": { + "type": "string", + "title": "String" + }, + "grossEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "taxableEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "locationName": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "ApiPaySlipEarningsLineModel" + }, + "title": "ApiPaySlipEarningsLineModel" + }, + "ApiPaySlipDeductionModel": { + "type": "object", + "properties": { + "notes": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "taxStatus": { + "type": "string", + "title": "String" + }, + "name": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "ApiPaySlipDeductionModel" + }, + "title": "ApiPaySlipDeductionModel" + }, + "ApiPaySlipSuperPaymentModel": { + "type": "object", + "properties": { + "fundName": { + "type": "string", + "title": "String" + }, + "memberNumber": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "ApiPaySlipSuperPaymentModel" + }, + "title": "ApiPaySlipSuperPaymentModel" + }, + "ApiPaySlipBankPaymentModel": { + "type": "object", + "properties": { + "accountName": { + "type": "string", + "title": "String" + }, + "accountNumber": { + "type": "string", + "title": "String" + }, + "lodgementReference": { + "type": "string", + "title": "String" + }, + "bsb": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "ApiPaySlipBankPaymentModel" + }, + "title": "ApiPaySlipBankPaymentModel" + }, + "ApiYearToDateEarningsBreakdownModel": { + "type": "object", + "properties": { + "payCategoryName": { + "type": "string", + "title": "String" + }, + "grossEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "ApiYearToDateEarningsBreakdownModel" + }, + "title": "ApiYearToDateEarningsBreakdownModel" + }, + "ApiEmployeeExpenseGridModel": { + "type": "object", + "properties": { + "notes": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "locationName": { + "type": "string", + "title": "String" + }, + "employeeExpenseCategoryName": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "ApiEmployeeExpenseGridModel" + }, + "title": "ApiEmployeeExpenseGridModel" + }, + "PayRunEarningsLineResponse": { + "type": "object", + "properties": { + "earningsLines": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/EarningsLineModel" + }, + "xml": { + "name": "EarningsLineModel", + "wrapped": true + }, + "title": "List" + }, + "readOnly": true, + "title": "Dictionary" + }, + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Int32" + } + }, + "xml": { + "name": "PayRunEarningsLineResponse" + }, + "example": { + "earningsLines": { + "12345": [ + { + "payCategoryId": "1", + "payCategoryName": "Full Time - Standard", + "units": 40.0, + "notes": "Some notes", + "rate": 31.25, + "earnings": 1250.0, + "super": 0.0, + "sfss": 0.0, + "help": 65.12, + "payg": 263.0, + "lumpSumNumberOfPayPeriods": 0.0, + "timesheetLineId": null, + "id": 0, + "externalId": null, + "locationId": "39", + "locationName": "My Location", + "employeeId": "12345", + "employeeName": "Bob Bobberson", + "employeeExternalId": "EMP01" + }, + { + "payCategoryId": "3", + "payCategoryName": "Bonus", + "units": 1.0, + "notes": "Some notes", + "rate": 1000.0, + "earnings": 1000.0, + "super": 106.38, + "sfss": 0.0, + "help": 0.0, + "payg": 229.0, + "lumpSumNumberOfPayPeriods": 1.0, + "timesheetLineId": null, + "id": 0, + "externalId": null, + "locationId": "39", + "locationName": "My Location", + "employeeId": "12345", + "employeeName": "Bob Bobberson", + "employeeExternalId": "EMP01" + } + ] + }, + "payRunId": 999 + }, + "title": "PayRunEarningsLineResponse" + }, + "EarningsLineModel": { + "type": "object", + "properties": { + "payCategoryId": { + "type": "string", + "title": "String" + }, + "payCategoryName": { + "type": "string", + "title": "String" + }, + "units": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "notes": { + "type": "string", + "title": "String" + }, + "rate": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "earnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "super": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "sfss": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "help": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "payg": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "lumpSumNumberOfPayPeriods": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "timesheetLineId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "locationId": { + "type": "string", + "title": "String" + }, + "locationName": { + "type": "string", + "title": "String" + }, + "employeeId": { + "type": "string", + "title": "String" + }, + "employeeName": { + "type": "string", + "title": "String" + }, + "employeeExternalId": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EarningsLineModel" + }, + "title": "EarningsLineModel" + }, + "SubmitPayRunEarningsLineRequest": { + "type": "object", + "properties": { + "locationIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "payCategoryIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "earningsLines": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/EarningsLineModel" + }, + "xml": { + "name": "EarningsLineModel", + "wrapped": true + }, + "title": "List" + }, + "title": "Dictionary" + }, + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "replaceExisting": { + "type": "boolean", + "title": "Boolean" + }, + "suppressCalculations": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "SubmitPayRunEarningsLineRequest" + }, + "title": "SubmitPayRunEarningsLineRequest" + }, + "PayRunTotalModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "totalHours": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "grossEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "preTaxDeductions": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "taxableEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "postTaxDeductions": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "paygWithheld": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "sfssWithheld": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "helpWithheld": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "superContribution": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "employerContribution": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "netEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "totalEmployeeExpenses": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "totalEmployerLiabilities": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "isPublished": { + "type": "boolean", + "title": "Boolean" + }, + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "notes": { + "type": "string", + "title": "String" + }, + "notation": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "PayRunTotalModel" + }, + "title": "PayRunTotalModel" + }, + "LeaveAccrualResponse": { + "type": "object", + "properties": { + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "leave": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/LeaveAccrualModel" + }, + "xml": { + "name": "LeaveAccrualModel", + "wrapped": true + }, + "title": "List" + }, + "title": "Dictionary" + } + }, + "xml": { + "name": "LeaveAccrualResponse" + }, + "example": { + "payRunId": 999, + "leave": { + "12345": [ + { + "id": 1234, + "leaveCategoryName": "Annual Leave", + "leaveCategoryId": "123", + "amount": 3.07654, + "notes": null, + "accrualType": "AutomaticallyAccrued" + }, + { + "id": 1235, + "leaveCategoryName": "Sick Leave", + "leaveCategoryId": "124", + "amount": 1.0345, + "notes": "Some notes", + "accrualType": "AutomaticallyAccrued" + } + ] + } + }, + "title": "LeaveAccrualResponse" + }, + "LeaveAccrualModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "leaveCategoryName": { + "type": "string", + "title": "String" + }, + "leaveCategoryId": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "notes": { + "type": "string", + "title": "String" + }, + "accrualType": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "LeaveAccrualModel" + }, + "title": "LeaveAccrualModel" + }, + "SubmitLeaveAccrualsModel": { + "type": "object", + "properties": { + "replaceExisting": { + "type": "boolean", + "title": "Boolean" + }, + "employeeIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "suppressCalculations": { + "type": "boolean", + "title": "Boolean" + }, + "leave": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/SaveLeaveAccrualModel" + }, + "xml": { + "name": "SaveLeaveAccrualModel", + "wrapped": true + }, + "title": "List" + }, + "title": "Dictionary" + } + }, + "xml": { + "name": "SubmitLeaveAccrualsModel" + }, + "title": "SubmitLeaveAccrualsModel" + }, + "SaveLeaveAccrualModel": { + "type": "object", + "properties": { + "accrualType": { + "enum": [ + "LeaveAccrued", + "LeaveTaken", + "LeaveAdjustment" + ], + "type": "string", + "title": "SaveLeaveAccrualTypeEnum" + }, + "notes": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "leaveCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "applyLeaveLoading": { + "type": "boolean", + "title": "Boolean" + }, + "adjustEarnings": { + "type": "boolean", + "title": "Boolean" + }, + "externalReferenceId": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "SaveLeaveAccrualModel" + }, + "title": "SaveLeaveAccrualModel" + }, + "PayRunPaygAdjustmentResponse": { + "type": "object", + "properties": { + "paygAdjustments": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/PaygAdjustmentModel" + }, + "xml": { + "name": "PaygAdjustmentModel", + "wrapped": true + }, + "title": "List" + }, + "readOnly": true, + "title": "Dictionary" + }, + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Int32" + } + }, + "xml": { + "name": "PayRunPaygAdjustmentResponse" + }, + "example": { + "paygAdjustments": { + "12345": [ + { + "notes": "Some notes", + "amount": 12.34, + "id": 0, + "externalId": "Axb34", + "locationId": "34456", + "locationName": "My Location", + "employeeId": "12345", + "employeeName": "Bob Bobberson", + "employeeExternalId": "EMP01" + } + ] + }, + "payRunId": 999 + }, + "title": "PayRunPaygAdjustmentResponse" + }, + "PaygAdjustmentModel": { + "type": "object", + "properties": { + "notes": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "locationId": { + "type": "string", + "title": "String" + }, + "locationName": { + "type": "string", + "title": "String" + }, + "employeeId": { + "type": "string", + "title": "String" + }, + "employeeName": { + "type": "string", + "title": "String" + }, + "employeeExternalId": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "PaygAdjustmentModel" + }, + "title": "PaygAdjustmentModel" + }, + "SubmitPayRunPaygAdjustmentRequest": { + "type": "object", + "properties": { + "paygAdjustments": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/PaygAdjustmentModel" + }, + "xml": { + "name": "PaygAdjustmentModel", + "wrapped": true + }, + "title": "List" + }, + "title": "Dictionary" + }, + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "replaceExisting": { + "type": "boolean", + "title": "Boolean" + }, + "suppressCalculations": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "SubmitPayRunPaygAdjustmentRequest" + }, + "title": "SubmitPayRunPaygAdjustmentRequest" + }, + "PayRunSuperAdjustmentResponse": { + "type": "object", + "properties": { + "superAdjustments": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/SuperAdjustmentModel" + }, + "xml": { + "name": "SuperAdjustmentModel", + "wrapped": true + }, + "title": "List" + }, + "readOnly": true, + "title": "Dictionary" + }, + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Int32" + } + }, + "xml": { + "name": "PayRunSuperAdjustmentResponse" + }, + "example": { + "superAdjustments": { + "12345": [ + { + "notes": "Some notes", + "amount": 12.34, + "contributionType": "Employer Contribution", + "id": 0, + "externalId": "Axb34", + "locationId": "34456", + "locationName": "My Location", + "employeeId": "12345", + "employeeName": "Bob Bobberson", + "employeeExternalId": "EMP01" + } + ] + }, + "payRunId": 999 + }, + "title": "PayRunSuperAdjustmentResponse" + }, + "SuperAdjustmentModel": { + "type": "object", + "properties": { + "notes": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "contributionType": { + "type": "string", + "title": "String" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "locationId": { + "type": "string", + "title": "String" + }, + "locationName": { + "type": "string", + "title": "String" + }, + "employeeId": { + "type": "string", + "title": "String" + }, + "employeeName": { + "type": "string", + "title": "String" + }, + "employeeExternalId": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "SuperAdjustmentModel" + }, + "title": "SuperAdjustmentModel" + }, + "SubmitPayRunSuperAdjustmentRequest": { + "type": "object", + "properties": { + "superAdjustments": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/SuperAdjustmentModel" + }, + "xml": { + "name": "SuperAdjustmentModel", + "wrapped": true + }, + "title": "List" + }, + "title": "Dictionary" + }, + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "replaceExisting": { + "type": "boolean", + "title": "Boolean" + }, + "suppressCalculations": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "SubmitPayRunSuperAdjustmentRequest" + }, + "title": "SubmitPayRunSuperAdjustmentRequest" + }, + "PayRunUnlockRequest": { + "type": "object", + "properties": { + "comments": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "PayRunUnlockRequest" + }, + "title": "PayRunUnlockRequest" + }, + "ODataQueryOptions[PayRun]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "PayRunCreateRequest": { + "type": "object", + "properties": { + "payScheduleId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "payPeriodEnding": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "datePaid": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "timesheetImportOption": { + "enum": [ + "None", + "ThisPayPeriod", + "AllOutstanding" + ], + "type": "string", + "title": "Nullable" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "callbackUrl": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "PayRunCreateRequest" + }, + "title": "PayRunCreateRequest" + }, + "PayRunNotationModel": { + "type": "object", + "properties": { + "notation": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "PayRunNotationModel" + }, + "title": "PayRunNotationModel" + }, + "PayRunEmployerLiabilityResponse": { + "type": "object", + "properties": { + "employerLiabilities": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployerLiabilityModel" + }, + "xml": { + "name": "EmployerLiabilityModel", + "wrapped": true + }, + "title": "List" + }, + "readOnly": true, + "title": "Dictionary" + }, + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Int32" + } + }, + "xml": { + "name": "PayRunEmployerLiabilityResponse" + }, + "example": { + "employerLiabilities": { + "12345": [ + { + "employerLiabilityCategoryId": "98", + "employerLiabilityCategoryName": "My employer liability category", + "notes": "Some notes", + "amount": 12.34, + "id": 0, + "externalId": "Axb34", + "locationId": "34456", + "locationName": "My Location", + "employeeId": "12345", + "employeeName": "Bob Bobberson", + "employeeExternalId": "EMP01" + } + ] + }, + "payRunId": 999 + }, + "title": "PayRunEmployerLiabilityResponse" + }, + "EmployerLiabilityModel": { + "type": "object", + "properties": { + "employerLiabilityCategoryId": { + "type": "string", + "title": "String" + }, + "employerLiabilityCategoryName": { + "type": "string", + "title": "String" + }, + "notes": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "locationId": { + "type": "string", + "title": "String" + }, + "locationName": { + "type": "string", + "title": "String" + }, + "employeeId": { + "type": "string", + "title": "String" + }, + "employeeName": { + "type": "string", + "title": "String" + }, + "employeeExternalId": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EmployerLiabilityModel" + }, + "title": "EmployerLiabilityModel" + }, + "SubmitPayRunEmployerLiabilityRequest": { + "type": "object", + "properties": { + "employerLiabilityCategoryIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "employerLiabilities": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/EmployerLiabilityModel" + }, + "xml": { + "name": "EmployerLiabilityModel", + "wrapped": true + }, + "title": "List" + }, + "title": "Dictionary" + }, + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "replaceExisting": { + "type": "boolean", + "title": "Boolean" + }, + "suppressCalculations": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "SubmitPayRunEmployerLiabilityRequest" + }, + "title": "SubmitPayRunEmployerLiabilityRequest" + }, + "FinalisePayRunOptions": { + "type": "object", + "properties": { + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "datePaid": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "exportJournals": { + "type": "boolean", + "title": "Boolean" + }, + "publishPaySlips": { + "enum": [ + "Manual", + "Immediate", + "Scheduled" + ], + "type": "string", + "title": "PublishPaySlipsPreference" + }, + "publishPaySlipsDateTime": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "suppressNotifications": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "FinalisePayRunOptions" + }, + "title": "FinalisePayRunOptions" + }, + "PayRunFinaliseResult": { + "type": "object", + "properties": { + "journalExportResult": { + "$ref": "#/definitions/JournalExportResult" + }, + "journalExportFailedMessage": { + "type": "string", + "title": "String" + }, + "removedEmployees": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "IList" + }, + "notifications": { + "$ref": "#/definitions/PaySlipNotificationResponse" + }, + "paySlipsPublished": { + "type": "boolean", + "title": "Boolean" + }, + "publishPreference": { + "enum": [ + "Manual", + "Immediate", + "Scheduled" + ], + "type": "string", + "title": "PublishPaySlipsPreference" + }, + "datePaid": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "exportJournalsPreference": { + "type": "boolean", + "title": "Boolean" + }, + "publishPaySlipsScheduledDateTimeUtc": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "publishPreferenceTimeOfDay": { + "type": "string", + "title": "Nullable" + } + }, + "xml": { + "name": "PayRunFinaliseResult" + }, + "title": "PayRunFinaliseResult" + }, + "JournalExportResult": { + "type": "object", + "properties": { + "status": { + "enum": [ + "NotExported", + "Success", + "FailureUnknownError", + "FailureAccountsNotConfigured", + "FailureInvalidAccounts", + "FailureAccountPeriodClosed", + "FailureNotAuthenticated", + "FailureAlreadyExported", + "FailureFunctionDisabled", + "FailureCannotUseAccountsPayableAccount", + "FailureVendorMessage" + ], + "type": "string", + "title": "JournalExportStatus" + }, + "message": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "JournalExportResult" + }, + "title": "JournalExportResult" + }, + "PaySlipNotificationResponse": { + "type": "object", + "properties": { + "totalEmailNotificationsSent": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "totalSmsNotificationsSent": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "errors": { + "$ref": "#/definitions/PayRunWarningResult" + }, + "hasPartiallySentNotifications": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "PaySlipNotificationResponse" + }, + "title": "PaySlipNotificationResponse" + }, + "PayRunWarningResult": { + "type": "object", + "properties": { + "warningMessage": { + "type": "string", + "title": "String" + }, + "warnings": { + "type": "array", + "items": { + "$ref": "#/definitions/PayRunWarning" + }, + "xml": { + "name": "PayRunWarning", + "wrapped": true + }, + "title": "List" + }, + "templateName": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "PayRunWarningResult" + }, + "title": "PayRunWarningResult" + }, + "PayRunWarning": { + "type": "object", + "properties": { + "warningType": { + "enum": [ + "Aba", + "MoreLeaveThanAccrued", + "UnpaidEarnings", + "Birthday", + "Anniversary", + "NegativeEarnings", + "PreviouslyTerminated", + "TerminatedWithExpenseReimbursements", + "ExpiredQualification", + "DuplicateEarningsLines", + "TaxCodeMissing", + "Bpay" + ], + "type": "string", + "title": "PayRunWarningType" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "warning": { + "type": "string", + "title": "String" + }, + "employeeName": { + "type": "string", + "title": "String" + }, + "payRunTotalId": { + "format": "int32", + "type": "integer", + "title": "Int32" + } + }, + "xml": { + "name": "PayRunWarning" + }, + "title": "PayRunWarning" + }, + "JournalItemResponse": { + "type": "object", + "properties": { + "externalAccountReferenceId": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "amountUnrounded": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "reference": { + "type": "string", + "title": "String" + }, + "journalItemType": { + "enum": [ + "Asset", + "PaygExpense", + "PaygLiability", + "SuperExpense", + "SuperLiability", + "DefaultExpense", + "WagesExpense", + "DefaultSalarySacrificeExpense", + "DefaultSalarySacrificeLiability", + "DefaultDeductionExpense", + "DefaultDeductionLiability", + "DefaultEmployerLiabilityExpense", + "DefaultEmployerLiabilityLiability", + "DeductionExpense", + "DeductionLiability", + "DeductionAsset", + "DefaultEmployeeExpense", + "EmployeeExpense", + "PreTaxDeductionLiability", + "PostTaxDeductionLiability", + "EmployerLiabilityExpense", + "EmployerLiabilityLiability", + "W1ExemptWagesExpense", + "PreTaxDeductionAsset" + ], + "type": "string", + "title": "JournalItemType" + }, + "taxCode": { + "type": "string", + "title": "String" + }, + "accountCode": { + "type": "string", + "title": "String" + }, + "accountName": { + "type": "string", + "title": "String" + }, + "details": { + "type": "string", + "title": "String" + }, + "location": { + "type": "string", + "title": "String" + }, + "isCredit": { + "type": "boolean", + "title": "Boolean" + }, + "isDebit": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "JournalItemResponse" + }, + "title": "JournalItemResponse" + }, + "SetPayRunUIUnlockStateRequest": { + "type": "object", + "properties": { + "enableUIUnlock": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "SetPayRunUIUnlockStateRequest" + }, + "title": "SetPayRunUIUnlockStateRequest" + }, + "PayRunTotalResponse": { + "type": "object", + "properties": { + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "payRunTotals": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/PayRunTotalModel" + }, + "title": "Dictionary" + } + }, + "xml": { + "name": "PayRunTotalResponse" + }, + "title": "PayRunTotalResponse" + }, + "PayRunTotalNotationModel": { + "type": "object", + "properties": { + "notation": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "PayRunTotalNotationModel" + }, + "title": "PayRunTotalNotationModel" + }, + "PayRunDeductionResponse": { + "type": "object", + "properties": { + "deductions": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/DeductionModel" + }, + "xml": { + "name": "DeductionModel", + "wrapped": true + }, + "title": "List" + }, + "readOnly": true, + "title": "Dictionary" + }, + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Int32" + } + }, + "xml": { + "name": "PayRunDeductionResponse" + }, + "example": { + "deductions": { + "12345": [ + { + "deductionCategoryId": "98", + "deductionCategoryName": "My deduction category", + "amount": 12.34, + "notes": "Some notes", + "paymentReference": "Payment Reference", + "payToBankAccountBSB": null, + "payToBankAccountNumber": null, + "payToSuperFundName": "My Super Account", + "payToSuperFundMemberNumber": "100000", + "payTo": "SuperFund", + "id": 0, + "externalId": null, + "locationId": "39", + "locationName": "My Location", + "employeeId": "12345", + "employeeName": "Bob Bobberson", + "employeeExternalId": "EMP01" + }, + { + "deductionCategoryId": "98", + "deductionCategoryName": "My deduction category", + "amount": 16.12, + "notes": "Some notes", + "paymentReference": "Payment Reference", + "payToBankAccountBSB": "100000", + "payToBankAccountNumber": "987654321", + "payToSuperFundName": null, + "payToSuperFundMemberNumber": null, + "payTo": "BankAccount", + "id": 0, + "externalId": null, + "locationId": "39", + "locationName": "My Location", + "employeeId": "12345", + "employeeName": "Bob Bobberson", + "employeeExternalId": "EMP01" + } + ] + }, + "payRunId": 999 + }, + "title": "PayRunDeductionResponse" + }, + "DeductionModel": { + "type": "object", + "properties": { + "deductionCategoryId": { + "type": "string", + "title": "String" + }, + "deductionCategoryName": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "notes": { + "type": "string", + "title": "String" + }, + "paymentReference": { + "type": "string", + "title": "String" + }, + "note": { + "type": "string", + "title": "String" + }, + "payToBankAccountBSB": { + "type": "string", + "title": "String" + }, + "payToBankAccountNumber": { + "type": "string", + "title": "String" + }, + "payToSuperFundName": { + "type": "string", + "title": "String" + }, + "payToSuperFundMemberNumber": { + "type": "string", + "title": "String" + }, + "payTo": { + "type": "string", + "title": "String" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "locationId": { + "type": "string", + "title": "String" + }, + "locationName": { + "type": "string", + "title": "String" + }, + "employeeId": { + "type": "string", + "title": "String" + }, + "employeeName": { + "type": "string", + "title": "String" + }, + "employeeExternalId": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "DeductionModel" + }, + "title": "DeductionModel" + }, + "SubmitPayRunDeductionRequest": { + "type": "object", + "properties": { + "deductionCategoryIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "deductions": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/DeductionModel" + }, + "xml": { + "name": "DeductionModel", + "wrapped": true + }, + "title": "List" + }, + "title": "Dictionary" + }, + "payRunId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "replaceExisting": { + "type": "boolean", + "title": "Boolean" + }, + "suppressCalculations": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "SubmitPayRunDeductionRequest" + }, + "title": "SubmitPayRunDeductionRequest" + }, + "ODataQueryOptions[PayCycle]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "PayScheduleModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + }, + "frequency": { + "enum": [ + "Weekly", + "Fortnightly", + "Monthly", + "AdHoc", + "Initial" + ], + "type": "string", + "title": "PayCycleFrequencyEnum" + }, + "employeeSelectionStrategy": { + "enum": [ + "None", + "PayRunDefault", + "TimesheetLocations" + ], + "type": "string", + "title": "Nullable" + }, + "lastDatePaid": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "lastPayRun": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "source": { + "type": "string", + "title": "String" + }, + "abaDetailsId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "locations": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "List" + } + }, + "xml": { + "name": "PayScheduleModel" + }, + "title": "PayScheduleModel" + }, + "PublicHolidayModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "date": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "states": { + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "title": "IList" + }, + "locationIds": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "ICollection" + }, + "description": { + "type": "string", + "title": "String" + }, + "note": { + "type": "string", + "title": "String" + }, + "isSystem": { + "type": "boolean", + "title": "Boolean" + }, + "notAPublicHoliday": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "PublicHolidayModel" + }, + "title": "PublicHolidayModel" + }, + "ODataQueryOptions[Qualification]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "QualificationModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "QualificationModel" + }, + "title": "QualificationModel" + }, + "ReportRequestWithPayScheduleModel": { + "type": "object", + "properties": { + "payScheduleId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employingEntityId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "ReportRequestWithPayScheduleModel" + }, + "title": "ReportRequestWithPayScheduleModel" + }, + "SuperAccrualExportModel": { + "type": "object", + "properties": { + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "locationName": { + "type": "string", + "title": "String" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "accrualDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "accrualType": { + "type": "string", + "title": "String" + }, + "accrualAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "SuperAccrualExportModel" + }, + "title": "SuperAccrualExportModel" + }, + "SuperContributionsReportExportModel": { + "type": "object", + "properties": { + "locationName": { + "type": "string", + "title": "String" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "superFundName": { + "type": "string", + "title": "String" + }, + "superFundNumber": { + "type": "string", + "title": "String" + }, + "paymentType": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "SuperContributionsReportExportModel" + }, + "title": "SuperContributionsReportExportModel" + }, + "LeaveBalancesReportRequestModel": { + "type": "object", + "properties": { + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "leaveTypeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "groupBy": { + "enum": [ + "AccrualLocation", + "DefaultLocation" + ], + "type": "string", + "title": "LeaveReportDisplayEnum" + }, + "employingEntityId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "asAtDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + } + }, + "xml": { + "name": "LeaveBalancesReportRequestModel" + }, + "title": "LeaveBalancesReportRequestModel" + }, + "LeaveBalancesReportExportModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "location": { + "type": "string", + "title": "String" + }, + "leaveCategoryName": { + "type": "string", + "title": "String" + }, + "accruedAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "accruedAmountInDays": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "leaveValue": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "loadingValue": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "leavePlusLoading": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Decimal" + } + }, + "xml": { + "name": "LeaveBalancesReportExportModel" + }, + "title": "LeaveBalancesReportExportModel" + }, + "DeductionsReportRequestModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "deductionCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "disableRollupReporting": { + "type": "boolean", + "title": "Boolean" + }, + "payScheduleId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employingEntityId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "DeductionsReportRequestModel" + }, + "title": "DeductionsReportRequestModel" + }, + "DeductionsReportExportModel": { + "type": "object", + "properties": { + "payRun": { + "type": "string", + "title": "String" + }, + "datePaid": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "location": { + "type": "string", + "title": "String" + }, + "amounts": { + "type": "array", + "items": { + "$ref": "#/definitions/DeductionsReportDeductionAmountModel" + }, + "xml": { + "name": "DeductionsReportDeductionAmountModel", + "wrapped": true + }, + "title": "List" + } + }, + "xml": { + "name": "DeductionsReportExportModel" + }, + "title": "DeductionsReportExportModel" + }, + "DeductionsReportDeductionAmountModel": { + "type": "object", + "properties": { + "deductionCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "deductionCategoryName": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "DeductionsReportDeductionAmountModel" + }, + "title": "DeductionsReportDeductionAmountModel" + }, + "ActivityReportExportModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "location": { + "type": "string", + "title": "String" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "totalHours": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "grossEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "taxableEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "paygWithholding": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "superContributions": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "netEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "ActivityReportExportModel" + }, + "title": "ActivityReportExportModel" + }, + "LeaveHistoryApiReportModel": { + "type": "object", + "properties": { + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "payScheduleId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeId": { + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "title": "IList" + }, + "leaveCategoryId": { + "format": "int32", + "type": "integer", + "title": "Int32" + } + }, + "xml": { + "name": "LeaveHistoryApiReportModel" + }, + "title": "LeaveHistoryApiReportModel" + }, + "LeaveHistoryReportGroupModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeExternalId": { + "type": "string", + "title": "String" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "leaveCategoryType": { + "type": "string", + "title": "String" + }, + "openingBalance": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "closingBalance": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "leaveHistoryDetails": { + "type": "array", + "items": { + "$ref": "#/definitions/LeaveHistoryReportDetailModel" + }, + "xml": { + "name": "LeaveHistoryReportDetailModel", + "wrapped": true + }, + "title": "List" + } + }, + "xml": { + "name": "LeaveHistoryReportGroupModel" + }, + "title": "LeaveHistoryReportGroupModel" + }, + "LeaveHistoryReportDetailModel": { + "type": "object", + "properties": { + "payPeriod": { + "type": "string", + "title": "String" + }, + "notes": { + "type": "string", + "title": "String" + }, + "leaveAccrued": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "leaveTaken": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "LeaveHistoryReportDetailModel" + }, + "title": "LeaveHistoryReportDetailModel" + }, + "EmployeeDetailsReportField": { + "type": "object", + "properties": { + "value": { + "type": "string", + "title": "String" + }, + "displayText": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "EmployeeDetailsReportField" + }, + "title": "EmployeeDetailsReportField" + }, + "PayCategoriesReportRequestModel": { + "type": "object", + "properties": { + "payScheduleId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "groupByEarningsLocation": { + "type": "boolean", + "title": "Boolean" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employingEntityId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "PayCategoriesReportRequestModel" + }, + "title": "PayCategoriesReportRequestModel" + }, + "PayCategoriesReportExportModel": { + "type": "object", + "properties": { + "payCategory": { + "type": "string", + "title": "String" + }, + "payRun": { + "type": "string", + "title": "String" + }, + "datePaid": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "location": { + "type": "string", + "title": "String" + }, + "units": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "rate": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "superAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "PayCategoriesReportExportModel" + }, + "title": "PayCategoriesReportExportModel" + }, + "PaygReportRequestModel": { + "type": "object", + "properties": { + "state": { + "type": "string", + "title": "String" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employingEntityId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "PaygReportRequestModel" + }, + "title": "PaygReportRequestModel" + }, + "PaygReportExportModel": { + "type": "object", + "properties": { + "location": { + "type": "string", + "title": "String" + }, + "month": { + "type": "string", + "title": "String" + }, + "grossEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "preTaxDeductions": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "grossEarningsLessPreTaxDeductions": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "payg": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "PaygReportExportModel" + }, + "title": "PaygReportExportModel" + }, + "DetailedActivityReportExportModel": { + "type": "object", + "properties": { + "location": { + "type": "string", + "title": "String" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "hours": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "grossEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "preTaxDeductions": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "postTaxDedutions": { + "type": "object", + "title": "Object" + }, + "taxExemptEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "taxableEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "payg": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "sfss": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "help": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "super": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "netEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "employerLiabilities": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "grossPlusSuper": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "DetailedActivityReportExportModel" + }, + "title": "DetailedActivityReportExportModel" + }, + "PayrollTaxReportRequestModel": { + "type": "object", + "properties": { + "groupBy": { + "enum": [ + "EarningsLocation", + "DefaultLocation" + ], + "type": "string", + "title": "PayrollTaxGroupByEnum" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employingEntityId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "PayrollTaxReportRequestModel" + }, + "title": "PayrollTaxReportRequestModel" + }, + "PayrollTaxReportExportModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "location": { + "type": "string", + "title": "String" + }, + "type": { + "type": "string", + "title": "String" + }, + "state": { + "type": "string", + "title": "String" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "employeePayrollTaxExempt": { + "type": "boolean", + "title": "Boolean" + }, + "payCategoryPayrollTaxExempt": { + "type": "boolean", + "title": "Boolean" + }, + "terminationPayment": { + "type": "boolean", + "title": "Boolean" + }, + "allowance": { + "type": "boolean", + "title": "Boolean" + }, + "etp": { + "type": "boolean", + "title": "Boolean" + }, + "genuineRedundancy": { + "type": "boolean", + "title": "Boolean" + }, + "lumpSumD": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "PayrollTaxReportExportModel" + }, + "title": "PayrollTaxReportExportModel" + }, + "TimesheetReportRequestModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "includeCosts": { + "type": "boolean", + "title": "Boolean" + }, + "statuses": { + "type": "array", + "items": { + "enum": [ + "Missing", + "Submitted", + "Approved", + "Rejected", + "Processed" + ], + "type": "string", + "title": "TimesheetLineStatusType" + }, + "xml": { + "name": "TimesheetLineStatusType", + "wrapped": true + }, + "title": "IList" + }, + "workTypeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "payScheduleId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employingEntityId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "TimesheetReportRequestModel" + }, + "title": "TimesheetReportRequestModel" + }, + "TimesheetReportExportModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "employeeExternalId": { + "type": "string", + "title": "String" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "status": { + "type": "string", + "title": "String" + }, + "location": { + "type": "string", + "title": "String" + }, + "start": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "startTime": { + "type": "string", + "title": "TimeSpan" + }, + "end": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "endTime": { + "type": "string", + "title": "TimeSpan" + }, + "duration": { + "type": "string", + "readOnly": true, + "title": "TimeSpan" + }, + "units": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "unitType": { + "type": "string", + "title": "String" + }, + "workType": { + "type": "string", + "title": "String" + }, + "shiftConditions": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "classification": { + "type": "string", + "title": "String" + }, + "numberOfBreaks": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "breakDuration": { + "type": "string", + "title": "TimeSpan" + }, + "comments": { + "type": "string", + "title": "String" + }, + "consolidatedWithTimesheetLineId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "reviewedBy": { + "type": "string", + "title": "String" + }, + "gross": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "netEarnings": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "super": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "payg": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "employerLiabilities": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "totalCost": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "dateCreated": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "dateReviewed": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "shiftConditionShortCodes": { + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "title": "IList" + }, + "breaks": { + "type": "array", + "items": { + "$ref": "#/definitions/TimesheetBreakModel" + }, + "xml": { + "name": "TimesheetBreakModel", + "wrapped": true + }, + "title": "IList" + } + }, + "xml": { + "name": "TimesheetReportExportModel" + }, + "title": "TimesheetReportExportModel" + }, + "PaymentHistoryReportRequestModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employingEntityId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "PaymentHistoryReportRequestModel" + }, + "title": "PaymentHistoryReportRequestModel" + }, + "PaymentHistoryReportExportModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "datePaid": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "locationName": { + "type": "string", + "title": "String" + }, + "accountName": { + "type": "string", + "title": "String" + }, + "bsb": { + "type": "string", + "title": "String" + }, + "accountNumber": { + "type": "string", + "title": "String" + }, + "accountType": { + "type": "string", + "title": "String" + }, + "taxableEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "netEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "totalAllowances": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "totalDeductions": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "amount": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "PaymentHistoryReportExportModel" + }, + "title": "PaymentHistoryReportExportModel" + }, + "BirthdayReportExportModel": { + "type": "object", + "properties": { + "location": { + "type": "string", + "title": "String" + }, + "dateOfBirth": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "employmentStatus": { + "type": "string", + "title": "String" + }, + "age": { + "format": "int32", + "type": "integer", + "title": "Int32" + } + }, + "xml": { + "name": "BirthdayReportExportModel" + }, + "title": "BirthdayReportExportModel" + }, + "GrossToNetReportRequest": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "payCategoryIds": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "List" + }, + "payScheduleId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employingEntityId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "GrossToNetReportRequest" + }, + "title": "GrossToNetReportRequest" + }, + "GrossToNetReportLineItem": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "primaryLocationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "primaryLocation": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "totalHours": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "grossEarnings": { + "type": "object", + "additionalProperties": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "title": "Dictionary" + }, + "totalGrossEarnings": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Decimal" + }, + "totalTaxExemptEarnings": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "preTaxDeductions": { + "type": "object", + "additionalProperties": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "title": "Dictionary" + }, + "totalPreTaxDeductions": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Decimal" + }, + "taxableEarnings": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Decimal" + }, + "payg": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "sfss": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "help": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "postTaxDeductions": { + "type": "object", + "additionalProperties": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "title": "Dictionary" + }, + "totalPostTaxDeductions": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Decimal" + }, + "netEarnings": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Decimal" + }, + "expenses": { + "type": "object", + "additionalProperties": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "title": "Dictionary" + }, + "totalExpenses": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Decimal" + }, + "bankPayments": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Decimal" + }, + "sgc": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "employerContribution": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "totalGrossPlusSuper": { + "format": "double", + "type": "number", + "readOnly": true, + "title": "Decimal" + } + }, + "xml": { + "name": "GrossToNetReportLineItem" + }, + "title": "GrossToNetReportLineItem" + }, + "ReportLeaveLiabilityRequestModel": { + "type": "object", + "properties": { + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "leaveTypeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "includeApprovedLeave": { + "type": "boolean", + "title": "Boolean" + }, + "asAtDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "employingEntityId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "ReportLeaveLiabilityRequestModel" + }, + "title": "ReportLeaveLiabilityRequestModel" + }, + "LeaveLiabilityReportExportModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "firstName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "startDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "lastPaidDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "calculatedWeeks": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "location": { + "type": "string", + "title": "String" + }, + "leaveCategoryName": { + "type": "string", + "title": "String" + }, + "approvedLeaveAmount": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "accruedAmount": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "accruedAmountInDays": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "leaveValue": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "leaveLoadingDollarValue": { + "format": "double", + "type": "number", + "title": "Decimal" + } + }, + "xml": { + "name": "LeaveLiabilityReportExportModel" + }, + "title": "LeaveLiabilityReportExportModel" + }, + "RosterShiftFilterModel": { + "type": "object", + "properties": { + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "resourceView": { + "enum": [ + "Employee", + "Location" + ], + "type": "string", + "title": "ResourceViewEnum" + }, + "shiftStatus": { + "enum": [ + "All", + "Published", + "Unpublished", + "Accepted" + ], + "type": "string", + "title": "RosterShiftStatus" + }, + "shiftStatuses": { + "type": "array", + "items": { + "enum": [ + "All", + "Published", + "Unpublished", + "Accepted" + ], + "type": "string", + "title": "RosterShiftStatus" + }, + "xml": { + "name": "RosterShiftStatus", + "wrapped": true + }, + "title": "IList" + }, + "selectedLocations": { + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "title": "IList" + }, + "selectedEmployees": { + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "title": "IList" + }, + "selectedRoles": { + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "title": "IList" + }, + "includeSublocations": { + "type": "boolean", + "title": "Boolean" + }, + "currentView": { + "enum": [ + "resourceDay", + "resourceWeek", + "resourceNextWeeks" + ], + "type": "string", + "title": "RosterViewMode" + }, + "budgetWarningPercent": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "employeeGroupId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "unassignedShiftsOnly": { + "type": "boolean", + "title": "Boolean" + }, + "showCosts": { + "type": "boolean", + "title": "Boolean" + }, + "groupBy": { + "enum": [ + "Business", + "Location" + ], + "type": "string", + "title": "RosterGroupByEnum" + }, + "groupByThen": { + "enum": [ + "Employee", + "Role", + "StartingTime" + ], + "type": "string", + "title": "RosterGroupByThenEnum" + }, + "excludeUnassignedEmployees": { + "type": "boolean", + "title": "Boolean" + }, + "selectAllRoles": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "RosterShiftFilterModel" + }, + "title": "RosterShiftFilterModel" + }, + "RosterShiftGenerateTimesheetModel": { + "type": "object", + "properties": { + "description": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "isDifferent": { + "type": "boolean", + "title": "Boolean" + }, + "fullyQualifiedLocationName": { + "type": "string", + "title": "String" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "startTime": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "endTime": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "noteAuthor": { + "type": "string", + "title": "String" + }, + "notes": { + "type": "string", + "title": "String" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeName": { + "type": "string", + "title": "String" + }, + "initials": { + "type": "string", + "title": "String" + }, + "locationName": { + "type": "string", + "title": "String" + }, + "published": { + "type": "boolean", + "title": "Boolean" + }, + "isAccepted": { + "type": "boolean", + "title": "Boolean" + }, + "selectedQualifications": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "IList" + }, + "breaks": { + "type": "array", + "items": { + "$ref": "#/definitions/RosterShiftBreakModel" + }, + "xml": { + "name": "RosterShiftBreakModel", + "wrapped": true + }, + "title": "IList" + }, + "workTypeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "classificationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "classification": { + "type": "string", + "title": "String" + }, + "workType": { + "type": "string", + "title": "String" + }, + "shiftConditionIds": { + "type": "array", + "items": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "title": "IList" + }, + "roleId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "datePublished": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "resourceId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "RosterShiftGenerateTimesheetModel" + }, + "title": "RosterShiftGenerateTimesheetModel" + }, + "RosterShiftBreakModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "startTime": { + "format": "date-time", + "type": "string", + "readOnly": true, + "title": "DateTime" + }, + "endTime": { + "format": "date-time", + "type": "string", + "readOnly": true, + "title": "DateTime" + }, + "startDateTime": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "endDateTime": { + "format": "date-time", + "type": "string", + "title": "DateTime" + } + }, + "xml": { + "name": "RosterShiftBreakModel" + }, + "title": "RosterShiftBreakModel" + }, + "StubRosterShiftViewModel": { + "type": "object", + "properties": { + "note": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "StubRosterShiftViewModel" + }, + "title": "StubRosterShiftViewModel" + }, + "ODataQueryOptions[SuperFundProduct]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "SelfManagedSuperFundModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "abn": { + "type": "string", + "title": "String" + }, + "fundName": { + "type": "string", + "title": "String" + }, + "accountName": { + "type": "string", + "title": "String" + }, + "accountNumber": { + "type": "string", + "title": "String" + }, + "bsb": { + "type": "string", + "title": "String" + }, + "electronicServiceAddress": { + "type": "string", + "title": "String" + }, + "email": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "SelfManagedSuperFundModel" + }, + "title": "SelfManagedSuperFundModel" + }, + "SuperProductEditModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "abn": { + "type": "string", + "title": "String" + }, + "productCode": { + "type": "string", + "title": "String" + }, + "productType": { + "type": "string", + "title": "String" + }, + "businessName": { + "type": "string", + "title": "String" + }, + "displayName": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "productName": { + "type": "string", + "title": "String" + }, + "accountNumber": { + "type": "string", + "title": "String" + }, + "bsb": { + "type": "string", + "title": "String" + }, + "accountName": { + "type": "string", + "title": "String" + }, + "source": { + "enum": [ + "None", + "Saasu", + "Xero", + "MYOB", + "Deputy", + "EmployeeTimePunch", + "ClickSuper", + "IntegratedTimesheets", + "FileImport", + "FileExport", + "QuickBooks", + "Harmony", + "AwardStore", + "Attache", + "IntegratedRostering", + "ReckonAccounts", + "API", + "MicroPower", + "RosterLive", + "NetSuite", + "Kounta", + "TimeAndAttendanceKiosk", + "DetailedFileExport", + "JonasPremier", + "WageEasy", + "Maestrano", + "WorkZone", + "EmployeePortal", + "RosterTemplate", + "Onboarding", + "Admin", + "WorkZoneClockOnOff" + ], + "type": "string", + "title": "ExternalService" + }, + "electronicServiceAddress": { + "type": "string", + "title": "String" + }, + "email": { + "type": "string", + "title": "String" + }, + "externalReferenceId": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "SuperProductEditModel" + }, + "title": "SuperProductEditModel" + }, + "KioskCreateEmployeeModel": { + "type": "object", + "properties": { + "firstName": { + "type": "string", + "title": "String" + }, + "surname": { + "type": "string", + "title": "String" + }, + "email": { + "type": "string", + "title": "String" + }, + "mobileNumber": { + "type": "string", + "title": "String" + }, + "pin": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "KioskCreateEmployeeModel" + }, + "title": "KioskCreateEmployeeModel" + }, + "CheckKioskEmployeeIdModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "CheckKioskEmployeeIdModel" + }, + "title": "CheckKioskEmployeeIdModel" + }, + "CheckKioskPinModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "pin": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "CheckKioskPinModel" + }, + "title": "CheckKioskPinModel" + }, + "ChangeKioskPinModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "oldPin": { + "type": "string", + "title": "String" + }, + "newPin": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "ChangeKioskPinModel" + }, + "title": "ChangeKioskPinModel" + }, + "PinResetModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + } + }, + "xml": { + "name": "PinResetModel" + }, + "title": "PinResetModel" + }, + "TimeAndAttendanceKioskModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "locationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "name": { + "type": "string", + "title": "String" + }, + "timeZone": { + "type": "string", + "title": "String" + }, + "allowHigherClassificationSelection": { + "type": "boolean", + "title": "Boolean" + }, + "branding": { + "$ref": "#/definitions/WhiteLabelBrandingModel" + }, + "isLocationRequired": { + "type": "boolean", + "title": "Boolean" + }, + "isWorkTypeRequired": { + "type": "boolean", + "title": "Boolean" + }, + "restrictLocationsForEmployees": { + "type": "boolean", + "title": "Boolean" + }, + "allowEmployeeShiftSelection": { + "type": "boolean", + "title": "Nullable" + }, + "clockOnWindowMinutes": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "clockOffWindowMinutes": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "ianaTimeZone": { + "type": "string", + "readOnly": true, + "title": "String" + }, + "isPhotoRequired": { + "type": "boolean", + "title": "Nullable" + } + }, + "xml": { + "name": "TimeAndAttendanceKioskModel" + }, + "title": "TimeAndAttendanceKioskModel" + }, + "ODataQueryOptions[TimesheetLine]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + }, + "TimesheetLineModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "startTime": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "endTime": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "units": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "workTypeId": { + "type": "string", + "title": "String" + }, + "locationId": { + "type": "string", + "title": "String" + }, + "comments": { + "type": "string", + "title": "String" + }, + "breaks": { + "type": "array", + "items": { + "$ref": "#/definitions/TimesheetBreakModel" + }, + "xml": { + "name": "TimesheetBreakModel", + "wrapped": true + }, + "title": "IList" + }, + "status": { + "type": "string", + "title": "String" + }, + "rate": { + "format": "double", + "type": "number", + "title": "Nullable" + }, + "leaveCategoryId": { + "type": "string", + "title": "String" + }, + "payCategoryId": { + "type": "string", + "title": "String" + }, + "classificationId": { + "type": "string", + "title": "String" + }, + "externalId": { + "type": "string", + "title": "String" + }, + "source": { + "enum": [ + "None", + "Saasu", + "Xero", + "MYOB", + "Deputy", + "EmployeeTimePunch", + "ClickSuper", + "IntegratedTimesheets", + "FileImport", + "FileExport", + "QuickBooks", + "Harmony", + "AwardStore", + "Attache", + "IntegratedRostering", + "ReckonAccounts", + "API", + "MicroPower", + "RosterLive", + "NetSuite", + "Kounta", + "TimeAndAttendanceKiosk", + "DetailedFileExport", + "JonasPremier", + "WageEasy", + "Maestrano", + "WorkZone", + "EmployeePortal", + "RosterTemplate", + "Onboarding", + "Admin", + "WorkZoneClockOnOff" + ], + "type": "string", + "title": "ExternalService" + }, + "attachmentId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "shiftConditionIds": { + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "title": "IList" + } + }, + "xml": { + "name": "TimesheetLineModel" + }, + "title": "TimesheetLineModel" + }, + "SubmitTimesheetsRequest": { + "type": "object", + "properties": { + "fromDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "replaceExisting": { + "type": "boolean", + "title": "Boolean" + }, + "approved": { + "type": "boolean", + "title": "Boolean" + }, + "employeeIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "locationIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "workTypeIdType": { + "enum": [ + "Standard", + "External" + ], + "type": "string", + "title": "IdType" + }, + "timesheets": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/TimesheetLineModel" + }, + "xml": { + "name": "TimesheetLineModel", + "wrapped": true + }, + "title": "IList" + }, + "title": "IDictionary" + } + }, + "xml": { + "name": "SubmitTimesheetsRequest" + }, + "example": { + "fromDate": "2017-06-01T00:00:00", + "toDate": "2017-06-30T00:00:00", + "replaceExisting": false, + "approved": true, + "employeeIdType": "External", + "locationIdType": "Standard", + "workTypeIdType": "External", + "timesheets": { + "emP3316": [ + { + "id": 0, + "employeeId": 0, + "startTime": "2017-06-11T10:00:00", + "endTime": "2017-06-11T13:00:00", + "units": null, + "workTypeId": null, + "locationId": null, + "comments": null, + "breaks": [], + "status": null, + "rate": null, + "leaveCategoryId": null, + "payCategoryId": null, + "classificationId": null, + "externalId": null, + "source": "None", + "attachmentId": null, + "shiftConditionIds": null + } + ], + "emP3317": [ + { + "id": 0, + "employeeId": 0, + "startTime": "2017-06-13T09:00:00", + "endTime": "2017-06-13T17:00:00", + "units": 8.0, + "workTypeId": "WT1485", + "locationId": "123456", + "comments": "Some Comments", + "breaks": [ + { + "startTime": "2017-06-13T11:00:00", + "endTime": "2017-06-13T12:00:00" + } + ], + "status": null, + "rate": 20.0, + "leaveCategoryId": null, + "payCategoryId": null, + "classificationId": null, + "externalId": null, + "source": "None", + "attachmentId": null, + "shiftConditionIds": null + }, + { + "id": 0, + "employeeId": 0, + "startTime": "2017-06-15T09:00:00", + "endTime": "2017-06-15T17:00:00", + "units": 8.0, + "workTypeId": "WT1485", + "locationId": "123456", + "comments": "Some Comments", + "breaks": [ + { + "startTime": "2017-06-15T11:00:00", + "endTime": "2017-06-15T12:00:00" + } + ], + "status": null, + "rate": 20.0, + "leaveCategoryId": null, + "payCategoryId": null, + "classificationId": null, + "externalId": null, + "source": "None", + "attachmentId": null, + "shiftConditionIds": null + } + ] + } + }, + "title": "SubmitTimesheetsRequest" + }, + "UnavailabilityFilter": { + "type": "object", + "properties": { + "fromDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + }, + "defaultLocationId": { + "format": "int32", + "type": "integer", + "title": "Nullable" + } + }, + "xml": { + "name": "UnavailabilityFilter" + }, + "title": "UnavailabilityFilter" + }, + "UnavailabilityModel": { + "type": "object", + "properties": { + "employeeId": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "fromDate": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "toDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "endDate": { + "format": "date-time", + "type": "string", + "title": "Nullable" + }, + "reason": { + "type": "string", + "title": "String" + }, + "recurring": { + "type": "boolean", + "title": "Boolean" + }, + "recurringDay": { + "enum": [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday" + ], + "type": "string", + "title": "Nullable" + }, + "isAllDay": { + "type": "boolean", + "readOnly": true, + "title": "Boolean" + }, + "viewOnly": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "UnavailabilityModel" + }, + "title": "UnavailabilityModel" + }, + "UserModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "email": { + "type": "string", + "title": "String" + }, + "displayName": { + "type": "string", + "title": "String" + }, + "timeZone": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "UserModel" + }, + "title": "UserModel" + }, + "NewUserModel": { + "type": "object", + "properties": { + "username": { + "type": "string", + "title": "String" + }, + "displayName": { + "type": "string", + "title": "String" + }, + "timeZone": { + "type": "string", + "title": "String" + }, + "apiOnly": { + "type": "boolean", + "title": "Boolean" + } + }, + "xml": { + "name": "NewUserModel" + }, + "title": "NewUserModel" + }, + "WebHook": { + "required": [ + "webHookUri" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "title": "String" + }, + "webHookUri": { + "type": "string", + "title": "Uri" + }, + "secret": { + "type": "string", + "title": "String" + }, + "description": { + "type": "string", + "title": "String" + }, + "isPaused": { + "type": "boolean", + "title": "Boolean" + }, + "filters": { + "type": "array", + "items": { + "type": "string", + "title": "String" + }, + "readOnly": true, + "title": "ISet" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string", + "title": "String" + }, + "readOnly": true, + "title": "IDictionary" + }, + "properties": { + "type": "object", + "additionalProperties": { + "type": "object", + "title": "Object" + }, + "readOnly": true, + "title": "IDictionary" + } + }, + "xml": { + "name": "WebHook" + }, + "title": "WebHook" + }, + "WhiteLabelModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "name": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "WhiteLabelModel" + }, + "title": "WhiteLabelModel" + }, + "InvoiceModel": { + "type": "object", + "properties": { + "id": { + "format": "int32", + "type": "integer", + "title": "Int32" + }, + "invoiceNumber": { + "type": "string", + "title": "String" + }, + "date": { + "format": "date-time", + "type": "string", + "title": "DateTime" + }, + "totalExcludingGst": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "gst": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "totalIncludingGst": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "cultureName": { + "type": "string", + "title": "String" + }, + "currency": { + "type": "string", + "title": "String" + }, + "lineItems": { + "type": "array", + "items": { + "$ref": "#/definitions/InvoiceLineItemModel" + }, + "xml": { + "name": "InvoiceLineItemModel", + "wrapped": true + }, + "title": "List" + } + }, + "xml": { + "name": "InvoiceModel" + }, + "title": "InvoiceModel" + }, + "InvoiceLineItemModel": { + "type": "object", + "properties": { + "abn": { + "type": "string", + "title": "String" + }, + "description": { + "type": "string", + "title": "String" + }, + "unitPriceIncludingGst": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "quantity": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "totalIncludingGst": { + "format": "double", + "type": "number", + "title": "Decimal" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/InvoiceLineItemDetailModel" + }, + "xml": { + "name": "InvoiceLineItemDetailModel", + "wrapped": true + }, + "title": "List" + } + }, + "xml": { + "name": "InvoiceLineItemModel" + }, + "title": "InvoiceLineItemModel" + }, + "InvoiceLineItemDetailModel": { + "type": "object", + "properties": { + "description": { + "type": "string", + "title": "String" + } + }, + "xml": { + "name": "InvoiceLineItemDetailModel" + }, + "title": "InvoiceLineItemDetailModel" + }, + "ODataQueryOptions[WorkType]": { + "type": "object", + "properties": { + "ifMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "ifNoneMatch": { + "type": "object", + "readOnly": true, + "title": "ETag" + }, + "context": { + "$ref": "#/definitions/ODataQueryContext", + "readOnly": true + }, + "request": { + "type": "object", + "readOnly": true, + "title": "HttpRequestMessage" + }, + "rawValues": { + "$ref": "#/definitions/ODataRawQueryOptions", + "readOnly": true + }, + "selectExpand": { + "$ref": "#/definitions/SelectExpandQueryOption", + "readOnly": true + }, + "filter": { + "$ref": "#/definitions/FilterQueryOption", + "readOnly": true + }, + "orderBy": { + "$ref": "#/definitions/OrderByQueryOption", + "readOnly": true + }, + "skip": { + "$ref": "#/definitions/SkipQueryOption", + "readOnly": true + }, + "top": { + "$ref": "#/definitions/TopQueryOption", + "readOnly": true + }, + "inlineCount": { + "$ref": "#/definitions/InlineCountQueryOption", + "readOnly": true + }, + "validator": { + "$ref": "#/definitions/ODataQueryValidator" + } + }, + "xml": { + "name": "ODataQueryOptions`1" + }, + "title": "ODataQueryOptions" + } + }, + "securityDefinitions": { + "basic": { + "type": "basic", + "description": "Your API key should be the username and the password can be left blank" + }, + "apiKey": { + "type": "apiKey", + "description": "API Key Authentication", + "name": "apiKey", + "in": "header" + }, + "oauth2": { + "type": "oauth2", + "description": "OAuth2 Implicit Grant", + "flow": "implicit", + "authorizationUrl": "https://{yourwhitelabel}.yourpayroll.com.au/oauth/authorise", + "tokenUrl": "https://{yourwhitelabel}.yourpayroll.com.au/oauth/token", + "scopes": { + "read": "Read access to protected resources", + "write": "Write access to protected resources" + } + } + }, + "security": [ + { + "apiKey": [] + } + ], + "tags": [ + { + "name": "User", + "description": "User" + }, + { + "name": "Authentication", + "description": "Authentication" + }, + { + "name": "Business", + "description": "Business" + }, + { + "name": "PayRun", + "description": "Pay Run" + }, + { + "name": "PublicHoliday", + "description": "Public Holiday" + }, + { + "name": "TimeAndAttendance", + "description": "Time and Attendance" + }, + { + "name": "EmployeeQualifications", + "description": "Employee Qualifications" + }, + { + "name": "LeaveRequests", + "description": "Leave Requests" + }, + { + "name": "Timesheets", + "description": "Timesheets" + }, + { + "name": "Location", + "description": "Location" + }, + { + "name": "DeductionCategories", + "description": "Deduction Categories" + }, + { + "name": "EmployeeExpenseCategories", + "description": "Employee Expense Categories" + }, + { + "name": "EmployerLiabilityCategories", + "description": "Employer Liability Categories" + }, + { + "name": "LeaveAllowance", + "description": "Leave Allowances" + }, + { + "name": "Employee", + "description": "Employee" + }, + { + "name": "EmployeeDocument", + "description": "Employee Documents" + }, + { + "name": "EmployeeGroups", + "description": "Employee Groups" + }, + { + "name": "AbaSettings", + "description": "ABA Settings" + }, + { + "name": "EmployingEntities", + "description": "Employing Entities" + }, + { + "name": "EmploymentAgreement", + "description": "Employment Agreement" + }, + { + "name": "LeaveCategories", + "description": "Leave Categories" + }, + { + "name": "PayCategory", + "description": "Pay Category" + }, + { + "name": "PaymentSummary", + "description": "Payment Summaries" + }, + { + "name": "PayRateTemplate", + "description": "Pay Rate Templates" + }, + { + "name": "PaySchedule", + "description": "Pay Schedules" + }, + { + "name": "Qualifications", + "description": "Qualifications" + }, + { + "name": "RosterShift", + "description": "Roster Shifts" + }, + { + "name": "SuperFund", + "description": "Super Funds" + }, + { + "name": "WorkType", + "description": "Work Types" + }, + { + "name": "EmployeeAccess", + "description": "Employee Access" + }, + { + "name": "EmployeeExpenseRequest", + "description": "Employee Expense Requests" + }, + { + "name": "EmployeeBankAccount", + "description": "Employee Bank Accounts" + }, + { + "name": "EmployeeSuperFund", + "description": "Employee Super Funds" + }, + { + "name": "EmployeeRecurringTransactions", + "description": "Pay Run Inclusions" + }, + { + "name": "Unavailability", + "description": "Unavailability" + }, + { + "name": "Reporting", + "description": "Reporting" + }, + { + "name": "Ess", + "description": "Employee Self Service" + }, + { + "name": "LookupData", + "description": "Lookup Data" + }, + { + "name": "Webhook", + "description": "Webhook" + }, + { + "name": "WhiteLabel", + "description": "White Label Only" + } + ], + "x-navigateMethodsByName": true +} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/bugs/957/fixture-957.json b/vendor/github.com/go-openapi/spec/fixtures/bugs/957/fixture-957.json new file mode 100644 index 0000000000..2de6bb4301 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/bugs/957/fixture-957.json @@ -0,0 +1,3713 @@ +{ + "info": { + "title": "API title", + "version": "0.0.1" + }, + "swagger": "2.0", + "produces": [ + "application/json", + "text/plain" + ], + "securityDefinitions": { + "api_key": { + "type": "apiKey", + "name": "private_token", + "in": "query" + }, + "oauth2": { + "type": "oauth2", + "authorizationUrl": "https://local.tools.stack.local/torca/oauth/authorize", + "flow": "implicit" + } + }, + "host": "local.tools.stack.local", + "basePath": "/torca/nmdb/api", + "schemes": [ + "https" + ], + "tags": [ + { + "name": "devices", + "description": "Operations about devices" + }, + { + "name": "info", + "description": "Operations about infos" + } + ], + "paths": { + "/v2/devices": { + "get": { + "summary": "Query Nmdb::Device Object.", + "description": "Query Nmdb::Device Object.", + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "query", + "name": "page", + "description": "Page offset to fetch.", + "type": "integer", + "format": "int32", + "default": 1, + "required": false + }, + { + "in": "query", + "name": "per_page", + "description": "Number of results to return per page.", + "type": "integer", + "format": "int32", + "default": 20, + "required": false + }, + { + "in": "query", + "name": "offset", + "description": "Pad a number of results.", + "type": "integer", + "format": "int32", + "default": 0, + "required": false + }, + { + "in": "query", + "name": "fmt", + "type": "string", + "default": "full_root", + "enum": [ + "full", + "full_root", + "base" + ], + "required": false + }, + { + "in": "query", + "name": "rels", + "description": "Comma-separated list of relationships. Maximum 5 levels. \n e.g. interfaces,interfaces.ip_address", + "type": "string", + "required": false + }, + { + "in": "query", + "name": "filters", + "description": "Supports nesting up to 2 levels. \n e.g {\"host_name\":\"~hhcvi\",\"interfaces\":{\"ip_address\":{\"network_address\":\"~10.10.10\"},\"name\":\"eth0\"}}", + "type": "string", + "required": false + }, + { + "in": "query", + "name": "search", + "type": "string", + "required": false + } + ], + "responses": { + "200": { + "description": "Query Nmdb::Device Object.", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Device" + } + } + }, + "406": { + "description": "NmdbQueryError", + "schema": { + "$ref": "#/definitions/NmdbQueryError" + } + } + }, + "tags": [ + "devices" + ], + "operationId": "getV2Devices" + }, + "post": { + "summary": "Create Nmdb::Device Object.", + "description": "Create Nmdb::Device Object.", + "produces": [ + "application/json" + ], + "consumes": [ + "application/json" + ], + "parameters": [ + { + "name": "V2Devices", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/postV2Devices" + } + } + ], + "responses": { + "201": { + "description": "Create Nmdb::Device Object.", + "schema": { + "$ref": "#/definitions/Device" + } + } + }, + "tags": [ + "devices" + ], + "operationId": "postV2Devices" + } + }, + "/v2/devices/{id}": { + "get": { + "summary": "GET Nmdb::Device Object.", + "description": "GET Nmdb::Device Object.", + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "type": "integer", + "format": "int32", + "required": true + }, + { + "in": "query", + "name": "fmt", + "type": "string", + "default": "full_root", + "enum": [ + "full", + "full_root", + "base" + ], + "required": false + }, + { + "in": "query", + "name": "rels", + "description": "Comma-separated list of relationships. Maximum 5 levels. \n e.g. interfaces,interfaces.ip_address", + "type": "string", + "required": false + } + ], + "responses": { + "200": { + "description": "GET Nmdb::Device Object.", + "schema": { + "$ref": "#/definitions/Device" + } + }, + "406": { + "description": "NmdbQueryError", + "schema": { + "$ref": "#/definitions/NmdbQueryError" + } + } + }, + "tags": [ + "devices" + ], + "operationId": "getV2DevicesId" + }, + "put": { + "summary": "Update Nmdb::Device Object.", + "description": "Update Nmdb::Device Object.", + "produces": [ + "application/json" + ], + "consumes": [ + "application/json" + ], + "parameters": [ + { + "in": "path", + "name": "id", + "type": "integer", + "format": "int32", + "required": true + }, + { + "name": "V2Devices", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/putV2Devices" + } + } + ], + "responses": { + "200": { + "description": "Update Nmdb::Device Object.", + "schema": { + "$ref": "#/definitions/Device" + } + } + }, + "tags": [ + "devices" + ], + "operationId": "putV2DevicesId" + } + }, + "/v2/info/version": { + "get": { + "summary": "Get API Version", + "description": "Get API Version", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "Get API Version", + "schema": { + "$ref": "#/definitions/Version" + } + } + }, + "tags": [ + "info" + ], + "operationId": "getV2InfoVersion" + } + } + }, + "definitions": { + "Device": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "ciid": { + "type": "string" + }, + "host_name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "zone_id": { + "type": "integer", + "format": "int32" + }, + "project_id": { + "type": "integer", + "format": "int32" + }, + "device_model_id": { + "type": "integer", + "format": "int32" + }, + "rack_id": { + "type": "integer", + "format": "int32" + }, + "device_status_id": { + "type": "integer", + "format": "int32" + }, + "device_status_reason_id": { + "type": "integer", + "format": "int32" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "asset_tag": { + "type": "string" + }, + "reconciliation_identity": { + "type": "string" + }, + "serial_number": { + "type": "string" + }, + "application_environment_id": { + "type": "integer", + "format": "int32" + }, + "pod_id": { + "type": "integer", + "format": "int32" + }, + "vm_capacity": { + "type": "integer", + "format": "int32" + }, + "switch_domain_id": { + "type": "integer", + "format": "int32" + }, + "blade_slot": { + "type": "integer", + "format": "int32" + }, + "blade_slots_required": { + "type": "integer", + "format": "int32" + }, + "blade_chassis_id": { + "type": "integer", + "format": "int32" + }, + "virtual_host_id": { + "type": "integer", + "format": "int32" + }, + "physical_host_id": { + "type": "integer", + "format": "int32" + }, + "blade_capacity": { + "type": "integer", + "format": "int32" + }, + "device_type_id": { + "type": "integer", + "format": "int32" + }, + "ru_required": { + "type": "integer", + "format": "int32" + }, + "primary_device_id": { + "type": "integer", + "format": "int32" + }, + "instance_id": { + "type": "string" + }, + "operating_system_id": { + "type": "integer", + "format": "int32" + }, + "workbook_version": { + "type": "string" + }, + "virtualized_on_vm_host_pool_id": { + "type": "integer", + "format": "int32" + }, + "contained_in_vm_host_pool_id": { + "type": "integer", + "format": "int32" + }, + "a_or_b": { + "type": "integer", + "format": "int32" + }, + "bottom_ru": { + "type": "integer", + "format": "int32" + }, + "event_logs": { + "type": "array", + "items": { + "$ref": "#/definitions/EventLog" + } + }, + "sync_status": { + "$ref": "#/definitions/SyncStatus" + }, + "device_status": { + "$ref": "#/definitions/DeviceStatus" + }, + "device_status_reason": { + "$ref": "#/definitions/DeviceStatusReason" + }, + "versions": { + "type": "array", + "items": { + "$ref": "#/definitions/Version" + } + }, + "device_model": { + "$ref": "#/definitions/DeviceModel" + }, + "device_type": { + "$ref": "#/definitions/DeviceType" + }, + "project": { + "$ref": "#/definitions/Project" + }, + "rack": { + "$ref": "#/definitions/Rack" + }, + "zone": { + "$ref": "#/definitions/Zone" + }, + "pod": { + "$ref": "#/definitions/Pod" + }, + "application_environment": { + "$ref": "#/definitions/ApplicationEnvironment" + }, + "operating_system": { + "$ref": "#/definitions/OperatingSystem" + }, + "host_name_reservation": { + "$ref": "#/definitions/HostNameReservation" + }, + "interfaces": { + "type": "array", + "items": { + "$ref": "#/definitions/Interface" + } + }, + "switch_ports": { + "type": "array", + "items": { + "$ref": "#/definitions/SwitchPort" + } + }, + "nat_entries": { + "type": "array", + "items": { + "$ref": "#/definitions/NatEntry" + } + }, + "load_balancer_entries": { + "type": "array", + "items": { + "$ref": "#/definitions/LoadBalancerEntry" + } + }, + "blades": { + "type": "array", + "items": { + "$ref": "#/definitions/Device" + } + }, + "blade_chassis": { + "$ref": "#/definitions/Device" + }, + "virtual_clients": { + "type": "array", + "items": { + "$ref": "#/definitions/Device" + } + }, + "virtual_host": { + "$ref": "#/definitions/Device" + }, + "virtual_hosts": { + "type": "array", + "items": { + "$ref": "#/definitions/Device" + } + }, + "physical_host": { + "$ref": "#/definitions/Device" + }, + "host_pool": { + "$ref": "#/definitions/VmHostPool" + }, + "virtualization_pool": { + "$ref": "#/definitions/VmHostPool" + }, + "primary_device": { + "$ref": "#/definitions/Device" + }, + "subnet_assignments": { + "type": "array", + "items": { + "$ref": "#/definitions/SubnetAssignment" + } + }, + "subnets": { + "$ref": "#/definitions/Subnet" + } + }, + "description": "Update Nmdb::Device Object." + }, + "EventLog": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "event_class": { + "type": "string" + }, + "severity": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "status": { + "type": "string" + }, + "details": { + "type": "string" + }, + "data": { + "type": "string" + }, + "loggable_id": { + "type": "integer", + "format": "int32" + }, + "loggable_type": { + "type": "string" + }, + "start_time": { + "type": "string", + "format": "date-time" + }, + "end_time": { + "type": "string", + "format": "date-time" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "loggable": { + "$ref": "#/definitions/Loggable" + } + } + }, + "Loggable": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, + "SyncStatus": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "status": { + "type": "string" + }, + "locked": { + "type": "boolean" + }, + "details": { + "type": "string" + }, + "last_sync_start": { + "type": "string", + "format": "date-time" + }, + "last_sync_end": { + "type": "string", + "format": "date-time" + }, + "synchronizable_id": { + "type": "integer", + "format": "int32" + }, + "synchronizable_type": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "synchronizable": { + "$ref": "#/definitions/Synchronizable" + } + } + }, + "Synchronizable": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, + "DeviceStatus": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "color": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "integration_id": { + "type": "string" + }, + "devices": { + "type": "array", + "items": { + "$ref": "#/definitions/Device" + } + }, + "racks": { + "type": "array", + "items": { + "$ref": "#/definitions/Rack" + } + }, + "device_status_reasons": { + "type": "array", + "items": { + "$ref": "#/definitions/DeviceStatusReason" + } + } + } + }, + "Rack": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "ciid": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "width": { + "type": "string" + }, + "height": { + "type": "string" + }, + "depth": { + "type": "string" + }, + "total_ru_space": { + "type": "integer", + "format": "int32" + }, + "max_power_watts": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "location_id": { + "type": "integer", + "format": "int32" + }, + "fibre_connection_count": { + "type": "integer", + "format": "int32" + }, + "ethernet_connection_count": { + "type": "integer", + "format": "int32" + }, + "device_status_id": { + "type": "integer", + "format": "int32" + }, + "device_status_reason_id": { + "type": "integer", + "format": "int32" + }, + "pod_id": { + "type": "integer", + "format": "int32" + }, + "reconciliation_identity": { + "type": "string" + }, + "event_logs": { + "type": "array", + "items": { + "$ref": "#/definitions/EventLog" + } + }, + "sync_status": { + "$ref": "#/definitions/SyncStatus" + }, + "device_status": { + "$ref": "#/definitions/DeviceStatus" + }, + "device_status_reason": { + "$ref": "#/definitions/DeviceStatusReason" + }, + "devices": { + "type": "array", + "items": { + "$ref": "#/definitions/Device" + } + }, + "location": { + "$ref": "#/definitions/Location" + }, + "pod": { + "$ref": "#/definitions/Pod" + } + } + }, + "DeviceStatusReason": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "device_status_id": { + "type": "integer", + "format": "int32" + }, + "integration_id": { + "type": "string" + }, + "devices": { + "type": "array", + "items": { + "$ref": "#/definitions/Device" + } + }, + "racks": { + "type": "array", + "items": { + "$ref": "#/definitions/Rack" + } + }, + "device_status": { + "$ref": "#/definitions/DeviceStatus" + } + } + }, + "Location": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "site": { + "type": "string" + }, + "region": { + "type": "string" + }, + "building": { + "type": "string" + }, + "floor": { + "type": "string" + }, + "room": { + "type": "string" + }, + "latitude": { + "type": "string" + }, + "longitude": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "pods": { + "type": "array", + "items": { + "$ref": "#/definitions/Pod" + } + } + } + }, + "Pod": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "pod_type_id": { + "type": "integer", + "format": "int32" + }, + "environment_id": { + "type": "integer", + "format": "int32" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "location_id": { + "type": "integer", + "format": "int32" + }, + "pod_type": { + "$ref": "#/definitions/PodType" + }, + "location": { + "$ref": "#/definitions/Location" + }, + "zones": { + "type": "array", + "items": { + "$ref": "#/definitions/Zone" + } + }, + "devices": { + "type": "array", + "items": { + "$ref": "#/definitions/Device" + } + }, + "racks": { + "type": "array", + "items": { + "$ref": "#/definitions/Rack" + } + }, + "data_transactions": { + "type": "array", + "items": { + "$ref": "#/definitions/DataTransaction" + } + } + } + }, + "PodType": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "pods": { + "type": "array", + "items": { + "$ref": "#/definitions/Pod" + } + } + } + }, + "Zone": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "parent_id": { + "type": "integer", + "format": "int32" + }, + "pod_id": { + "type": "integer", + "format": "int32" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "zone_group_id": { + "type": "integer", + "format": "int32" + }, + "notes": { + "type": "string" + }, + "devices": { + "type": "array", + "items": { + "$ref": "#/definitions/Device" + } + }, + "vlans": { + "type": "array", + "items": { + "$ref": "#/definitions/Vlan" + } + }, + "subnets": { + "type": "array", + "items": { + "$ref": "#/definitions/Subnet" + } + }, + "pod": { + "$ref": "#/definitions/Pod" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/Zone" + } + }, + "data_transactions": { + "type": "array", + "items": { + "$ref": "#/definitions/DataTransaction" + } + }, + "parent": { + "$ref": "#/definitions/Zone" + } + } + }, + "Vlan": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "primary_number": { + "type": "integer", + "format": "int32" + }, + "number": { + "type": "integer", + "format": "int32" + }, + "zone_id": { + "type": "integer", + "format": "int32" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "direction_id": { + "type": "integer", + "format": "int32" + }, + "vlan_type_id": { + "type": "integer", + "format": "int32" + }, + "description": { + "type": "string" + }, + "is_primary": { + "type": "boolean" + }, + "notes": { + "type": "array", + "items": { + "$ref": "#/definitions/Note" + } + }, + "subnets": { + "type": "array", + "items": { + "$ref": "#/definitions/Subnet" + } + }, + "zone": { + "$ref": "#/definitions/Zone" + }, + "direction": { + "$ref": "#/definitions/Direction" + }, + "vlan_type": { + "$ref": "#/definitions/VlanType" + }, + "interfaces": { + "type": "array", + "items": { + "$ref": "#/definitions/Interface" + } + }, + "switch_ports": { + "type": "array", + "items": { + "$ref": "#/definitions/SwitchPort" + } + }, + "data_transactions": { + "type": "array", + "items": { + "$ref": "#/definitions/DataTransaction" + } + } + } + }, + "Note": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, + "Subnet": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "network_address": { + "type": "string" + }, + "netmask": { + "type": "integer", + "format": "int32" + }, + "default_gateway_id": { + "type": "string" + }, + "broadcast": { + "type": "string" + }, + "zone_id": { + "type": "integer", + "format": "int32" + }, + "supernet_id": { + "type": "integer", + "format": "int32" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "default_gateway": { + "type": "string" + }, + "vlan_id": { + "type": "integer", + "format": "int32" + }, + "direction_id": { + "type": "integer", + "format": "int32" + }, + "int_address": { + "type": "string" + }, + "cidr_address": { + "type": "string" + }, + "zone": { + "$ref": "#/definitions/Zone" + }, + "vlan": { + "$ref": "#/definitions/Vlan" + }, + "direction": { + "$ref": "#/definitions/Direction" + }, + "ip_addresses": { + "type": "array", + "items": { + "$ref": "#/definitions/IpAddress" + } + }, + "data_transactions": { + "type": "array", + "items": { + "$ref": "#/definitions/DataTransaction" + } + }, + "subnets": { + "type": "array", + "items": { + "$ref": "#/definitions/Subnet" + } + }, + "supernet": { + "$ref": "#/definitions/Subnet" + }, + "devices": { + "$ref": "#/definitions/Device" + }, + "versions": { + "type": "array", + "items": { + "$ref": "#/definitions/Version" + } + } + } + }, + "Direction": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "zone_group_id": { + "type": "integer", + "format": "int32" + }, + "notes": { + "type": "string" + }, + "dns_suffix": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "vlans": { + "type": "array", + "items": { + "$ref": "#/definitions/Vlan" + } + }, + "interfaces": { + "type": "array", + "items": { + "$ref": "#/definitions/Interface" + } + }, + "subnets": { + "type": "array", + "items": { + "$ref": "#/definitions/Subnet" + } + }, + "data_transactions": { + "type": "array", + "items": { + "$ref": "#/definitions/DataTransaction" + } + } + } + }, + "Interface": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "mac_address": { + "type": "string" + }, + "name": { + "type": "string" + }, + "device_id": { + "type": "integer", + "format": "int32" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "require_ip": { + "type": "boolean" + }, + "require_switch_port": { + "type": "boolean" + }, + "require_default_gateway": { + "type": "boolean" + }, + "notes": { + "type": "string" + }, + "media": { + "type": "integer", + "format": "int32" + }, + "vlan_direction_id": { + "type": "integer", + "format": "int32" + }, + "interface_speed_id": { + "type": "integer", + "format": "int32" + }, + "vlan_id": { + "type": "integer", + "format": "int32" + }, + "subnet_id": { + "type": "integer", + "format": "int32" + }, + "direction_id": { + "type": "integer", + "format": "int32" + }, + "duplex_id": { + "type": "integer", + "format": "int32" + }, + "medium_id": { + "type": "integer", + "format": "int32" + }, + "switch_port_id": { + "type": "integer", + "format": "int32" + }, + "pci_slot": { + "type": "string" + }, + "a_or_b": { + "type": "integer", + "format": "int32" + }, + "require_route_for_management": { + "type": "boolean" + }, + "require_route_for_getronics": { + "type": "boolean" + }, + "default_gateway_id": { + "type": "integer", + "format": "int32" + }, + "static_routes": { + "type": "string" + }, + "interface_type_id": { + "type": "integer", + "format": "int32" + }, + "connector_type_id": { + "type": "integer", + "format": "int32" + }, + "mac_addr": { + "type": "string" + }, + "device": { + "$ref": "#/definitions/Device" + }, + "subnet": { + "$ref": "#/definitions/Subnet" + }, + "ip_address": { + "$ref": "#/definitions/IpAddress" + }, + "vlan": { + "$ref": "#/definitions/Vlan" + }, + "direction": { + "$ref": "#/definitions/Direction" + }, + "duplex": { + "$ref": "#/definitions/Duplex" + }, + "interface_speed": { + "$ref": "#/definitions/InterfaceSpeed" + }, + "medium": { + "$ref": "#/definitions/Medium" + }, + "switch_port": { + "$ref": "#/definitions/SwitchPort" + }, + "interface_type": { + "$ref": "#/definitions/InterfaceType" + }, + "connector_type": { + "$ref": "#/definitions/ConnectorType" + }, + "versions": { + "type": "array", + "items": { + "$ref": "#/definitions/Version" + } + } + } + }, + "IpAddress": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "network_address": { + "type": "string" + }, + "int_address": { + "type": "string" + }, + "description": { + "type": "string" + }, + "interface_id": { + "type": "integer", + "format": "int32" + }, + "subnet_id": { + "type": "integer", + "format": "int32" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "dns_name": { + "type": "string" + }, + "inet_address": { + "type": "string" + }, + "ip_type": { + "type": "integer", + "format": "int32" + }, + "subnet": { + "$ref": "#/definitions/Subnet" + }, + "interface": { + "$ref": "#/definitions/Interface" + }, + "outgoing_load_balancer_entries": { + "type": "array", + "items": { + "$ref": "#/definitions/LoadBalancerEntry" + } + }, + "incoming_load_balancer_entries": { + "type": "array", + "items": { + "$ref": "#/definitions/LoadBalancerEntry" + } + }, + "versions": { + "type": "array", + "items": { + "$ref": "#/definitions/Version" + } + } + } + }, + "LoadBalancerEntry": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "device_id": { + "type": "integer", + "format": "int32" + }, + "virtual_ip_address_id": { + "type": "integer", + "format": "int32" + }, + "description": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "physical_ip_id": { + "type": "integer", + "format": "int32" + }, + "device": { + "$ref": "#/definitions/Device" + }, + "virtual_ip_address": { + "$ref": "#/definitions/IpAddress" + }, + "physical_ip": { + "$ref": "#/definitions/IpAddress" + } + } + }, + "Version": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "event": { + "type": "string" + }, + "item_type": { + "type": "string" + }, + "item_id": { + "type": "string" + }, + "whodunnit": { + "type": "string" + }, + "object_changes": { + "type": "string" + } + }, + "description": "Get API Version" + }, + "Duplex": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "switch_ports": { + "type": "array", + "items": { + "$ref": "#/definitions/SwitchPort" + } + }, + "interfaces": { + "type": "array", + "items": { + "$ref": "#/definitions/Interface" + } + } + } + }, + "SwitchPort": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "port_number": { + "type": "integer", + "format": "int32" + }, + "speed": { + "type": "integer", + "format": "int32" + }, + "stp": { + "type": "boolean" + }, + "direction": { + "type": "integer", + "format": "int32" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "device_id": { + "type": "integer", + "format": "int32" + }, + "duplex_id": { + "type": "integer", + "format": "int32" + }, + "medium_id": { + "type": "integer", + "format": "int32" + }, + "zone_group_id": { + "type": "integer", + "format": "int32" + }, + "blade": { + "type": "string" + }, + "switch_port_type_id": { + "type": "integer", + "format": "int32" + }, + "vlan_id": { + "type": "integer", + "format": "int32" + }, + "notes": { + "type": "string" + }, + "cc_frame_id": { + "type": "integer", + "format": "int32" + }, + "pvlan_edge": { + "type": "integer", + "format": "int32" + }, + "in_use": { + "type": "boolean" + }, + "ether_channel": { + "type": "boolean" + }, + "blade_serial_number": { + "type": "string" + }, + "trunk_id": { + "type": "integer", + "format": "int32" + }, + "stp_port_fast": { + "type": "boolean" + }, + "vpc": { + "type": "integer", + "format": "int32" + }, + "wwn": { + "type": "string" + }, + "connected_mac": { + "type": "string" + }, + "connected_mac_updated_at": { + "type": "string", + "format": "date-time" + }, + "bottom_ru": { + "type": "integer", + "format": "int32" + }, + "supports_kvm": { + "type": "boolean" + }, + "capability": { + "type": "string" + }, + "interface_speed_id": { + "type": "integer", + "format": "int32" + }, + "port_channel": { + "type": "integer", + "format": "int32" + }, + "device": { + "$ref": "#/definitions/Device" + }, + "duplex": { + "$ref": "#/definitions/Duplex" + }, + "medium": { + "$ref": "#/definitions/Medium" + }, + "switch_port_type": { + "$ref": "#/definitions/SwitchPortType" + }, + "interface_speed": { + "$ref": "#/definitions/InterfaceSpeed" + }, + "vlan": { + "$ref": "#/definitions/Vlan" + }, + "interface": { + "$ref": "#/definitions/Interface" + }, + "versions": { + "type": "array", + "items": { + "$ref": "#/definitions/Version" + } + } + } + }, + "Medium": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "switch_ports": { + "type": "array", + "items": { + "$ref": "#/definitions/SwitchPort" + } + }, + "interfaces": { + "type": "array", + "items": { + "$ref": "#/definitions/Interface" + } + } + } + }, + "SwitchPortType": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "switch_ports": { + "type": "array", + "items": { + "$ref": "#/definitions/SwitchPort" + } + } + } + }, + "InterfaceSpeed": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "interfaces": { + "type": "array", + "items": { + "$ref": "#/definitions/Interface" + } + }, + "switch_ports": { + "type": "array", + "items": { + "$ref": "#/definitions/SwitchPort" + } + } + } + }, + "InterfaceType": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "interfaces": { + "type": "array", + "items": { + "$ref": "#/definitions/Interface" + } + } + } + }, + "ConnectorType": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "interfaces": { + "type": "array", + "items": { + "$ref": "#/definitions/Interface" + } + } + } + }, + "DataTransaction": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "transactable_type": { + "type": "string" + }, + "transactable_id": { + "type": "integer", + "format": "int32" + }, + "data_cleanup_id": { + "type": "integer", + "format": "int32" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "transactions": { + "type": "string" + }, + "data_cleanup": { + "$ref": "#/definitions/DataCleanup" + } + } + }, + "DataCleanup": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "status": { + "type": "integer", + "format": "int32" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "data_transactions": { + "type": "array", + "items": { + "$ref": "#/definitions/DataTransaction" + } + } + } + }, + "VlanType": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "vlans": { + "type": "array", + "items": { + "$ref": "#/definitions/Vlan" + } + } + } + }, + "DeviceModel": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "vendor_name": { + "type": "string" + }, + "manufacturer_name": { + "type": "string" + }, + "integration_class": { + "type": "string" + }, + "status": { + "type": "integer", + "format": "int32" + }, + "devices": { + "type": "array", + "items": { + "$ref": "#/definitions/Device" + } + }, + "device_types": { + "type": "array", + "items": { + "$ref": "#/definitions/DeviceType" + } + }, + "default_interfaces": { + "type": "array", + "items": { + "$ref": "#/definitions/DefaultInterface" + } + } + } + }, + "DeviceType": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "networkable": { + "type": "boolean" + }, + "routable": { + "type": "boolean" + }, + "interfaceable": { + "type": "boolean" + }, + "switchable": { + "type": "boolean" + }, + "has_switch_ports": { + "type": "boolean" + }, + "rackable": { + "type": "boolean" + }, + "virtual_client": { + "type": "boolean" + }, + "virtual_host": { + "type": "boolean" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "device_category_id": { + "type": "integer", + "format": "int32" + }, + "has_blades": { + "type": "boolean" + }, + "is_blade": { + "type": "boolean" + }, + "is_load_balancer": { + "type": "boolean" + }, + "is_patch_panel": { + "type": "boolean" + }, + "extends_switch": { + "type": "boolean" + }, + "esmt_device_category_id": { + "type": "integer", + "format": "int32" + }, + "esmt_device_type_id": { + "type": "integer", + "format": "int32" + }, + "esmt_device_class_id": { + "type": "integer", + "format": "int32" + }, + "devices": { + "type": "array", + "items": { + "$ref": "#/definitions/Device" + } + }, + "device_models": { + "type": "array", + "items": { + "$ref": "#/definitions/DeviceModel" + } + }, + "esmt_device_class": { + "$ref": "#/definitions/EsmtDeviceClass" + }, + "esmt_device_type": { + "$ref": "#/definitions/EsmtDeviceType" + }, + "esmt_device_category": { + "$ref": "#/definitions/EsmtDeviceCategory" + }, + "device_category": { + "$ref": "#/definitions/DeviceCategory" + } + } + }, + "EsmtDeviceClass": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "device_types": { + "type": "array", + "items": { + "$ref": "#/definitions/DeviceType" + } + } + } + }, + "EsmtDeviceType": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "device_types": { + "type": "array", + "items": { + "$ref": "#/definitions/DeviceType" + } + } + } + }, + "EsmtDeviceCategory": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "device_categories": { + "type": "array", + "items": { + "$ref": "#/definitions/DeviceCategory" + } + }, + "device_types": { + "type": "array", + "items": { + "$ref": "#/definitions/DeviceType" + } + } + } + }, + "DeviceCategory": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "interfaceable": { + "type": "boolean" + }, + "networkable": { + "type": "boolean" + }, + "routable": { + "type": "boolean" + }, + "switchable": { + "type": "boolean" + }, + "has_switch_ports": { + "type": "boolean" + }, + "rackable": { + "type": "boolean" + }, + "virtual_host": { + "type": "boolean" + }, + "virtual_client": { + "type": "boolean" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "has_blades": { + "type": "boolean" + }, + "is_blade": { + "type": "boolean" + }, + "is_load_balancer": { + "type": "boolean" + }, + "is_patch_panel": { + "type": "boolean" + }, + "extends_switch": { + "type": "boolean" + }, + "device_types": { + "type": "array", + "items": { + "$ref": "#/definitions/DeviceType" + } + }, + "esmt_device_type": { + "$ref": "#/definitions/EsmtDeviceType" + }, + "esmt_device_category": { + "$ref": "#/definitions/EsmtDeviceCategory" + } + } + }, + "DefaultInterface": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "device_model_id": { + "type": "integer", + "format": "int32" + }, + "direction": { + "type": "integer", + "format": "int32" + }, + "speed": { + "type": "integer", + "format": "int32" + }, + "require_ip": { + "type": "boolean" + }, + "require_switch_port": { + "type": "boolean" + }, + "require_default_gateway": { + "type": "boolean" + }, + "interface_type": { + "type": "integer", + "format": "int32" + }, + "notes": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "device_model": { + "$ref": "#/definitions/DeviceModel" + } + } + }, + "Project": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "code": { + "type": "string" + }, + "system_id": { + "type": "integer", + "format": "int32" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "ciid": { + "type": "string" + }, + "instance_id": { + "type": "string" + }, + "reconciliation_identity": { + "type": "string" + }, + "workbook_location": { + "type": "string" + }, + "device_status_id": { + "type": "integer", + "format": "int32" + }, + "device_status_reason_id": { + "type": "integer", + "format": "int32" + }, + "event_logs": { + "type": "array", + "items": { + "$ref": "#/definitions/EventLog" + } + }, + "sync_status": { + "$ref": "#/definitions/SyncStatus" + }, + "device_status": { + "$ref": "#/definitions/DeviceStatus" + }, + "device_status_reason": { + "$ref": "#/definitions/DeviceStatusReason" + }, + "devices": { + "type": "array", + "items": { + "$ref": "#/definitions/Device" + } + }, + "system": { + "$ref": "#/definitions/System" + } + } + }, + "System": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "ciid": { + "type": "string" + }, + "instance_id": { + "type": "string" + }, + "reconciliation_identity": { + "type": "string" + }, + "device_status_id": { + "type": "integer", + "format": "int32" + }, + "device_status_reason_id": { + "type": "integer", + "format": "int32" + }, + "event_logs": { + "type": "array", + "items": { + "$ref": "#/definitions/EventLog" + } + }, + "sync_status": { + "$ref": "#/definitions/SyncStatus" + }, + "device_status": { + "$ref": "#/definitions/DeviceStatus" + }, + "device_status_reason": { + "$ref": "#/definitions/DeviceStatusReason" + }, + "projects": { + "type": "array", + "items": { + "$ref": "#/definitions/Project" + } + } + } + }, + "ApplicationEnvironment": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "ciid": { + "type": "string" + }, + "impact_scale": { + "type": "integer", + "format": "int32" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "instance_id": { + "type": "string" + }, + "reconciliation_identity": { + "type": "string" + }, + "device_status_id": { + "type": "integer", + "format": "int32" + }, + "device_status_reason_id": { + "type": "integer", + "format": "int32" + }, + "event_logs": { + "type": "array", + "items": { + "$ref": "#/definitions/EventLog" + } + }, + "sync_status": { + "$ref": "#/definitions/SyncStatus" + }, + "device_status": { + "$ref": "#/definitions/DeviceStatus" + }, + "device_status_reason": { + "$ref": "#/definitions/DeviceStatusReason" + }, + "devices": { + "type": "array", + "items": { + "$ref": "#/definitions/Device" + } + } + } + }, + "OperatingSystem": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "ciid": { + "type": "string" + }, + "device_status_id": { + "type": "integer", + "format": "int32" + }, + "device_status_reason_id": { + "type": "integer", + "format": "int32" + }, + "reconciliation_identity": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "instance_id": { + "type": "string" + }, + "event_logs": { + "type": "array", + "items": { + "$ref": "#/definitions/EventLog" + } + }, + "sync_status": { + "$ref": "#/definitions/SyncStatus" + }, + "device_status": { + "$ref": "#/definitions/DeviceStatus" + }, + "device_status_reason": { + "$ref": "#/definitions/DeviceStatusReason" + }, + "devices": { + "type": "array", + "items": { + "$ref": "#/definitions/Device" + } + } + } + }, + "HostNameReservation": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "host_name": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "device_id": { + "type": "integer", + "format": "int32" + }, + "device": { + "$ref": "#/definitions/Device" + } + } + }, + "NatEntry": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "in_ip_id": { + "type": "integer", + "format": "int32" + }, + "out_ip_id": { + "type": "integer", + "format": "int32" + }, + "device_id": { + "type": "integer", + "format": "int32" + }, + "description": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "device": { + "$ref": "#/definitions/Device" + }, + "in_ip": { + "$ref": "#/definitions/IpAddress" + }, + "out_ip": { + "$ref": "#/definitions/IpAddress" + } + } + }, + "VmHostPool": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "ciid": { + "type": "string" + }, + "name": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "hosts": { + "type": "array", + "items": { + "$ref": "#/definitions/Device" + } + }, + "clients": { + "type": "array", + "items": { + "$ref": "#/definitions/Device" + } + } + } + }, + "SubnetAssignment": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "device_id": { + "type": "integer", + "format": "int32" + }, + "subnet_id": { + "type": "integer", + "format": "int32" + }, + "assigns_vips": { + "type": "boolean" + }, + "assigns_physical_ips": { + "type": "boolean" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "device": { + "$ref": "#/definitions/Device" + }, + "subnet": { + "$ref": "#/definitions/Subnet" + } + } + }, + "NmdbQueryError": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "filters": { + "type": "string" + }, + "rels": { + "type": "string" + } + }, + "description": "GET Nmdb::Device Object." + }, + "postV2Devices": { + "type": "object", + "properties": { + "body": { + "type": "object", + "properties": { + "ciid": { + "type": "string" + }, + "host_name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "zone_id": { + "type": "integer", + "format": "int32" + }, + "project_id": { + "type": "integer", + "format": "int32" + }, + "device_model_id": { + "type": "integer", + "format": "int32" + }, + "rack_id": { + "type": "integer", + "format": "int32" + }, + "device_status_id": { + "type": "integer", + "format": "int32" + }, + "device_status_reason_id": { + "type": "integer", + "format": "int32" + }, + "asset_tag": { + "type": "string" + }, + "reconciliation_identity": { + "type": "string" + }, + "serial_number": { + "type": "string" + }, + "application_environment_id": { + "type": "integer", + "format": "int32" + }, + "pod_id": { + "type": "integer", + "format": "int32" + }, + "vm_capacity": { + "type": "integer", + "format": "int32" + }, + "switch_domain_id": { + "type": "integer", + "format": "int32" + }, + "blade_slot": { + "type": "integer", + "format": "int32" + }, + "blade_slots_required": { + "type": "integer", + "format": "int32" + }, + "blade_chassis_id": { + "type": "integer", + "format": "int32" + }, + "virtual_host_id": { + "type": "integer", + "format": "int32" + }, + "physical_host_id": { + "type": "integer", + "format": "int32" + }, + "blade_capacity": { + "type": "integer", + "format": "int32" + }, + "device_type_id": { + "type": "integer", + "format": "int32" + }, + "ru_required": { + "type": "integer", + "format": "int32" + }, + "primary_device_id": { + "type": "integer", + "format": "int32" + }, + "instance_id": { + "type": "string" + }, + "operating_system_id": { + "type": "integer", + "format": "int32" + }, + "workbook_version": { + "type": "string" + }, + "virtualized_on_vm_host_pool_id": { + "type": "integer", + "format": "int32" + }, + "contained_in_vm_host_pool_id": { + "type": "integer", + "format": "int32" + }, + "a_or_b": { + "type": "integer", + "format": "int32" + }, + "bottom_ru": { + "type": "integer", + "format": "int32" + }, + "host_name_reservation_id": { + "type": "integer", + "format": "int32" + }, + "interfaces_attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "mac_address": { + "type": "string" + }, + "name": { + "type": "string" + }, + "device_id": { + "type": "integer", + "format": "int32" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "require_ip": { + "type": "boolean" + }, + "require_switch_port": { + "type": "boolean" + }, + "require_default_gateway": { + "type": "boolean" + }, + "notes": { + "type": "string" + }, + "media": { + "type": "integer", + "format": "int32" + }, + "vlan_direction_id": { + "type": "integer", + "format": "int32" + }, + "interface_speed_id": { + "type": "integer", + "format": "int32" + }, + "vlan_id": { + "type": "integer", + "format": "int32" + }, + "subnet_id": { + "type": "integer", + "format": "int32" + }, + "direction_id": { + "type": "integer", + "format": "int32" + }, + "duplex_id": { + "type": "integer", + "format": "int32" + }, + "medium_id": { + "type": "integer", + "format": "int32" + }, + "switch_port_id": { + "type": "integer", + "format": "int32" + }, + "pci_slot": { + "type": "string" + }, + "a_or_b": { + "type": "integer", + "format": "int32" + }, + "require_route_for_management": { + "type": "boolean" + }, + "require_route_for_getronics": { + "type": "boolean" + }, + "default_gateway_id": { + "type": "integer", + "format": "int32" + }, + "static_routes": { + "type": "string" + }, + "interface_type_id": { + "type": "integer", + "format": "int32" + }, + "connector_type_id": { + "type": "integer", + "format": "int32" + }, + "mac_addr": { + "type": "string" + }, + "ip_address_id": { + "type": "integer", + "format": "int32" + }, + "_destroy": { + "type": "boolean" + } + } + } + }, + "switch_ports_attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "port_number": { + "type": "integer", + "format": "int32" + }, + "speed": { + "type": "integer", + "format": "int32" + }, + "stp": { + "type": "boolean" + }, + "direction": { + "type": "integer", + "format": "int32" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "device_id": { + "type": "integer", + "format": "int32" + }, + "duplex_id": { + "type": "integer", + "format": "int32" + }, + "medium_id": { + "type": "integer", + "format": "int32" + }, + "zone_group_id": { + "type": "integer", + "format": "int32" + }, + "blade": { + "type": "string" + }, + "switch_port_type_id": { + "type": "integer", + "format": "int32" + }, + "vlan_id": { + "type": "integer", + "format": "int32" + }, + "notes": { + "type": "string" + }, + "cc_frame_id": { + "type": "integer", + "format": "int32" + }, + "pvlan_edge": { + "type": "integer", + "format": "int32" + }, + "in_use": { + "type": "boolean" + }, + "ether_channel": { + "type": "boolean" + }, + "blade_serial_number": { + "type": "string" + }, + "trunk_id": { + "type": "integer", + "format": "int32" + }, + "stp_port_fast": { + "type": "boolean" + }, + "vpc": { + "type": "integer", + "format": "int32" + }, + "wwn": { + "type": "string" + }, + "connected_mac": { + "type": "string" + }, + "connected_mac_updated_at": { + "type": "string", + "format": "date-time" + }, + "bottom_ru": { + "type": "integer", + "format": "int32" + }, + "supports_kvm": { + "type": "boolean" + }, + "capability": { + "type": "string" + }, + "interface_speed_id": { + "type": "integer", + "format": "int32" + }, + "port_channel": { + "type": "integer", + "format": "int32" + }, + "_destroy": { + "type": "boolean" + } + } + } + }, + "nat_entries_attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "in_ip_id": { + "type": "integer", + "format": "int32" + }, + "out_ip_id": { + "type": "integer", + "format": "int32" + }, + "device_id": { + "type": "integer", + "format": "int32" + }, + "description": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "_destroy": { + "type": "boolean" + } + } + } + }, + "load_balancer_entries_attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "device_id": { + "type": "integer", + "format": "int32" + }, + "virtual_ip_address_id": { + "type": "integer", + "format": "int32" + }, + "description": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "physical_ip_id": { + "type": "integer", + "format": "int32" + }, + "_destroy": { + "type": "boolean" + } + } + } + }, + "subnet_assignments_attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "device_id": { + "type": "integer", + "format": "int32" + }, + "subnet_id": { + "type": "integer", + "format": "int32" + }, + "assigns_vips": { + "type": "boolean" + }, + "assigns_physical_ips": { + "type": "boolean" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "_destroy": { + "type": "boolean" + } + } + } + } + } + } + }, + "required": [ + "body" + ], + "description": "Create Nmdb::Device Object." + }, + "putV2Devices": { + "type": "object", + "properties": { + "body": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "ciid": { + "type": "string" + }, + "host_name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "zone_id": { + "type": "integer", + "format": "int32" + }, + "project_id": { + "type": "integer", + "format": "int32" + }, + "device_model_id": { + "type": "integer", + "format": "int32" + }, + "rack_id": { + "type": "integer", + "format": "int32" + }, + "device_status_id": { + "type": "integer", + "format": "int32" + }, + "device_status_reason_id": { + "type": "integer", + "format": "int32" + }, + "asset_tag": { + "type": "string" + }, + "reconciliation_identity": { + "type": "string" + }, + "serial_number": { + "type": "string" + }, + "application_environment_id": { + "type": "integer", + "format": "int32" + }, + "pod_id": { + "type": "integer", + "format": "int32" + }, + "vm_capacity": { + "type": "integer", + "format": "int32" + }, + "switch_domain_id": { + "type": "integer", + "format": "int32" + }, + "blade_slot": { + "type": "integer", + "format": "int32" + }, + "blade_slots_required": { + "type": "integer", + "format": "int32" + }, + "blade_chassis_id": { + "type": "integer", + "format": "int32" + }, + "virtual_host_id": { + "type": "integer", + "format": "int32" + }, + "physical_host_id": { + "type": "integer", + "format": "int32" + }, + "blade_capacity": { + "type": "integer", + "format": "int32" + }, + "device_type_id": { + "type": "integer", + "format": "int32" + }, + "ru_required": { + "type": "integer", + "format": "int32" + }, + "primary_device_id": { + "type": "integer", + "format": "int32" + }, + "instance_id": { + "type": "string" + }, + "operating_system_id": { + "type": "integer", + "format": "int32" + }, + "workbook_version": { + "type": "string" + }, + "virtualized_on_vm_host_pool_id": { + "type": "integer", + "format": "int32" + }, + "contained_in_vm_host_pool_id": { + "type": "integer", + "format": "int32" + }, + "a_or_b": { + "type": "integer", + "format": "int32" + }, + "bottom_ru": { + "type": "integer", + "format": "int32" + }, + "interfaces_attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "mac_address": { + "type": "string" + }, + "name": { + "type": "string" + }, + "device_id": { + "type": "integer", + "format": "int32" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "require_ip": { + "type": "boolean" + }, + "require_switch_port": { + "type": "boolean" + }, + "require_default_gateway": { + "type": "boolean" + }, + "notes": { + "type": "string" + }, + "media": { + "type": "integer", + "format": "int32" + }, + "vlan_direction_id": { + "type": "integer", + "format": "int32" + }, + "interface_speed_id": { + "type": "integer", + "format": "int32" + }, + "vlan_id": { + "type": "integer", + "format": "int32" + }, + "subnet_id": { + "type": "integer", + "format": "int32" + }, + "direction_id": { + "type": "integer", + "format": "int32" + }, + "duplex_id": { + "type": "integer", + "format": "int32" + }, + "medium_id": { + "type": "integer", + "format": "int32" + }, + "switch_port_id": { + "type": "integer", + "format": "int32" + }, + "pci_slot": { + "type": "string" + }, + "a_or_b": { + "type": "integer", + "format": "int32" + }, + "require_route_for_management": { + "type": "boolean" + }, + "require_route_for_getronics": { + "type": "boolean" + }, + "default_gateway_id": { + "type": "integer", + "format": "int32" + }, + "static_routes": { + "type": "string" + }, + "interface_type_id": { + "type": "integer", + "format": "int32" + }, + "connector_type_id": { + "type": "integer", + "format": "int32" + }, + "mac_addr": { + "type": "string" + }, + "ip_address_id": { + "type": "integer", + "format": "int32" + }, + "_destroy": { + "type": "boolean" + } + } + } + }, + "switch_ports_attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "port_number": { + "type": "integer", + "format": "int32" + }, + "speed": { + "type": "integer", + "format": "int32" + }, + "stp": { + "type": "boolean" + }, + "direction": { + "type": "integer", + "format": "int32" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "device_id": { + "type": "integer", + "format": "int32" + }, + "duplex_id": { + "type": "integer", + "format": "int32" + }, + "medium_id": { + "type": "integer", + "format": "int32" + }, + "zone_group_id": { + "type": "integer", + "format": "int32" + }, + "blade": { + "type": "string" + }, + "switch_port_type_id": { + "type": "integer", + "format": "int32" + }, + "vlan_id": { + "type": "integer", + "format": "int32" + }, + "notes": { + "type": "string" + }, + "cc_frame_id": { + "type": "integer", + "format": "int32" + }, + "pvlan_edge": { + "type": "integer", + "format": "int32" + }, + "in_use": { + "type": "boolean" + }, + "ether_channel": { + "type": "boolean" + }, + "blade_serial_number": { + "type": "string" + }, + "trunk_id": { + "type": "integer", + "format": "int32" + }, + "stp_port_fast": { + "type": "boolean" + }, + "vpc": { + "type": "integer", + "format": "int32" + }, + "wwn": { + "type": "string" + }, + "connected_mac": { + "type": "string" + }, + "connected_mac_updated_at": { + "type": "string", + "format": "date-time" + }, + "bottom_ru": { + "type": "integer", + "format": "int32" + }, + "supports_kvm": { + "type": "boolean" + }, + "capability": { + "type": "string" + }, + "interface_speed_id": { + "type": "integer", + "format": "int32" + }, + "port_channel": { + "type": "integer", + "format": "int32" + }, + "_destroy": { + "type": "boolean" + } + } + } + }, + "nat_entries_attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "in_ip_id": { + "type": "integer", + "format": "int32" + }, + "out_ip_id": { + "type": "integer", + "format": "int32" + }, + "device_id": { + "type": "integer", + "format": "int32" + }, + "description": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "_destroy": { + "type": "boolean" + } + } + } + }, + "load_balancer_entries_attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "device_id": { + "type": "integer", + "format": "int32" + }, + "virtual_ip_address_id": { + "type": "integer", + "format": "int32" + }, + "description": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "physical_ip_id": { + "type": "integer", + "format": "int32" + }, + "_destroy": { + "type": "boolean" + } + } + } + }, + "subnet_assignments_attributes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "device_id": { + "type": "integer", + "format": "int32" + }, + "subnet_id": { + "type": "integer", + "format": "int32" + }, + "assigns_vips": { + "type": "boolean" + }, + "assigns_physical_ips": { + "type": "boolean" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "_destroy": { + "type": "boolean" + } + } + } + } + } + } + }, + "required": [ + "body" + ], + "description": "Update Nmdb::Device Object." + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/all-the-things.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/all-the-things.json new file mode 100644 index 0000000000..42e6f24e07 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/expansion/all-the-things.json @@ -0,0 +1,254 @@ +{ + "swagger": "2.0", + "info": { + "version": "1.0.0", + "title": "Swagger Petstore", + "description": "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification", + "termsOfService": "http://helloreverb.com/terms/", + "contact": { + "name": "Wordnik API Team" + }, + "license": { + "name": "MIT" + } + }, + "host": "petstore.swagger.wordnik.com", + "basePath": "/api", + "schemes": [ + "http" + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": { + "idParam": { + "name": "id", + "in": "path", + "description": "ID of pet to fetch", + "required": true, + "type": "integer", + "format": "int64" + }, + "tag": { + "type": "string", + "in": "query", + "required": false + }, + "query": { + "$ref": "#/parameters/tag" + } + }, + "responses": { + "petResponse": { + "description": "pet response", + "schema": { + "$ref": "#/definitions/pet" + } + }, + "stringResponse": { + "descripion": "string response", + "schema": { + "type": "string" + } + }, + "anotherPet": { + "$ref": "#/responses/petResponse" + } + }, + "paths": { + "/": { + "get": { + "operationId": "indexStuff", + "responses": { + "default": { + "$ref": "#/responses/stringResponse" + }, + "200": { + "$ref": "#/responses/anotherPet" + } + } + } + }, + "/pets": { + "get": { + "description": "Returns all pets from the system that the user has access to", + "operationId": "findPets", + "produces": [ + "application/json", + "application/xml", + "text/xml", + "text/html" + ], + "parameters": [ + { + "name": "tags", + "in": "query", + "description": "tags to filter by", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "csv" + }, + { + "name": "limit", + "in": "query", + "description": "maximum number of results to return", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "responses": { + "200": { + "description": "pet response", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/pet" + } + } + }, + "default": { + "description": "unexpected error", + "schema": { + "$ref": "#/definitions/errorModel" + } + } + } + }, + "post": { + "description": "Creates a new pet in the store. Duplicates are allowed", + "operationId": "addPet", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "pet", + "in": "body", + "description": "Pet to add to the store", + "required": true, + "schema": { + "$ref": "#/definitions/petInput" + } + } + ], + "responses": { + "200": { "$ref": "#/responses/petResponse" }, + "default": { + "description": "unexpected error", + "schema": { + "$ref": "#/definitions/errorModel" + } + } + } + } + }, + "/pets/{id}": { + "get": { + "description": "Returns a user based on a single ID, if the user does not have access to the pet", + "operationId": "findPetById", + "produces": [ + "application/json", + "application/xml", + "text/xml", + "text/html" + ], + "parameters": [ + { + "$ref": "#/parameters/idParam" + } + ], + "responses": { + "200": { + "$ref": "#/responses/petResponse" + }, + "default": { + "description": "unexpected error", + "schema": { + "$ref": "#/definitions/errorModel" + } + } + } + }, + "delete": { + "description": "deletes a single pet based on the ID supplied", + "operationId": "deletePet", + "parameters": [ + { + "$ref": "#/parameters/idParam" + } + ], + "responses": { + "204": { + "description": "pet deleted" + }, + "default": { + "description": "unexpected error", + "schema": { + "$ref": "#/definitions/errorModel" + } + } + } + } + } + }, + "definitions": { + "pet": { + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "tag": { + "type": "string" + } + } + }, + "petInput": { + "allOf": [ + { + "$ref": "#/definitions/pet" + }, + { + "required": [ + "name" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64" + } + } + } + ] + }, + "errorModel": { + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + } + } + } + } +} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/circular-minimal.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/circular-minimal.json new file mode 100644 index 0000000000..56a066e950 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/expansion/circular-minimal.json @@ -0,0 +1,58 @@ +{ + "swagger": "2.0", + "info": { + "version": "0.0.1" + }, + "basePath": "/", + "paths": { + "/cycles": { + "get": { + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/node0" + } + } + } + } + } + }, + "definitions": { + "node0": { + "type": "object", + "properties": { + "p00": { + "$ref": "#/definitions/node1" + }, + "p01": { + "$ref": "#/definitions/node3" + } + } + }, + "node1": { + "type": "object", + "properties": { + "p1": { + "$ref": "#/definitions/node2" + } + } + }, + "node2": { + "type": "object", + "properties": { + "p2": { + "$ref": "#/definitions/node0" + } + } + }, + "node3": { + "type": "object", + "properties": { + "p3": { + "$ref": "#/definitions/node1" + } + } + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/circularRefs.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/circularRefs.json new file mode 100644 index 0000000000..f501aa1433 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/expansion/circularRefs.json @@ -0,0 +1,54 @@ +{ + "definitions": { + "brand": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + }, + "category": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/category" + } + } + } + }, + "car": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "make": { + "type": "string" + }, + "similar": { + "items": { + "$ref": "#/definitions/car" + } + }, + "notSimilar": { + "additionalProperties": { + "$ref": "#/definitions/car" + } + }, + "oneCar": { + "$ref": "#/definitions/car" + }, + "category": { + "$ref": "#/definitions/category" + }, + "brand": { + "$ref": "#/definitions/brand" + } + } + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/circularSpec.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/circularSpec.json new file mode 100644 index 0000000000..7b39b999b8 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/expansion/circularSpec.json @@ -0,0 +1 @@ +{"swagger":"2.0","info":{"title":"Swagger Sample","description":"Sample API Playground.","version":"1.0.0"},"basePath":"/v1","schemes":["http"],"consumes":["application/vdn.sample.v1+json"],"produces":["application/vdn.sample.v1+json"],"paths":{"/books":{"get":{"summary":"List all books","operationId":"listBooks","tags":["books"],"responses":{"200":{"headers":{"Link":{"type":"string"}},"description":"An array of books","schema":{"type":"array","items":{"$ref":"#/definitions/Book"}}},"default":{"description":"generic error response","schema":{"$ref":"#/definitions/Error"}}}}}},"definitions":{"Book":{"type":"object","required":["title","summary"],"properties":{"title":{"type":"string","example":"Winnie the Pooh"},"summary":{"type":"string","example":"Famous children's book"},"related_books":{"type":"array","items":{"$ref":"#/definitions/Book"}}}},"Error":{"type":"object","readOnly":true,"properties":{"code":{"type":"integer","format":"int64","example":400},"message":{"type":"string","example":"Unexpected error"}},"required":["message"]}}} diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/circularSpec.yaml b/vendor/github.com/go-openapi/spec/fixtures/expansion/circularSpec.yaml new file mode 100644 index 0000000000..d43bd4640c --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/expansion/circularSpec.yaml @@ -0,0 +1,67 @@ +--- +swagger: "2.0" +info: + title: Swagger Sample + description: Sample API Playground. + version: 1.0.0 +basePath: /v1 +schemes: +- http +consumes: +- application/vdn.sample.v1+json +produces: +- application/vdn.sample.v1+json + +paths: + /books: + get: + summary: List all books + operationId: listBooks + tags: + - books + responses: + 200: + headers: + Link: + type: string + description: An array of books + schema: + type: array + items: + $ref: "#/definitions/Book" + default: + description: generic error response + schema: + $ref: "#/definitions/Error" + +definitions: + Book: + type: object + required: + - title + - summary + properties: + title: + type: string + example: Winnie the Pooh + summary: + type: string + example: Famous children's book + related_books: + type: array + items: + $ref: "#/definitions/Book" + + Error: + type: object + readOnly: true + properties: + code: + type: integer + format: int64 + example: 400 + message: + type: string + example: Unexpected error + required: + - message diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/circularSpec2.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/circularSpec2.json new file mode 100644 index 0000000000..e535418d5b --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/expansion/circularSpec2.json @@ -0,0 +1,330 @@ +{ + "swagger": "2.0", + "info": { + "title": "swagger.yaml for investigating an issue with spec.expandSchema", + "version": "0.0.1", + "description": "expander.go test for issue analysis, the spec derived from ODataWebV3.Northwind.Model and simplified for the analysis" + }, + "schemes": [ + "http" + ], + "host": "localhost", + "basePath": "/modified_from_Northwind.svc", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "paths": { + "/Employees": { + "get": { + "summary": "Get entities from Employees", + "responses": { + "200": { + "description": "Retrieved entities", + "schema": { + "title": "Collection of Employee", + "type": "object", + "properties": { + "value": { + "type": "array", + "items": { + "$ref": "#/definitions/Employee" + } + } + } + } + }, + "default": { + "$ref": "#/responses/error" + } + } + } + } + }, + "definitions": { + "Category": { + "type": "object", + "properties": { + "CategoryID": { + "type": "integer", + "format": "int32" + }, + "CategoryName": { + "type": "string", + "maxLength": 15 + }, + "Products": { + "type": "array", + "items": { + "$ref": "#/definitions/Product" + } + } + }, + "title": "Category" + }, + "CustomerDemographic": { + "type": "object", + "properties": { + "CustomerTypeID": { + "type": "string", + "maxLength": 10 + }, + "CustomerDesc": { + "type": "string", + "example": "string" + }, + "Customers": { + "type": "array", + "items": { + "$ref": "#/definitions/Customer" + } + } + }, + "title": "CustomerDemographic" + }, + "Customer": { + "type": "object", + "properties": { + "CustomerID": { + "type": "string", + "maxLength": 5 + }, + "CompanyName": { + "type": "string", + "maxLength": 40 + }, + "Orders": { + "type": "array", + "items": { + "$ref": "#/definitions/Order" + } + }, + "CustomerDemographics": { + "type": "array", + "items": { + "$ref": "#/definitions/CustomerDemographic" + } + } + }, + "title": "Customer" + }, + "Employee": { + "type": "object", + "properties": { + "EmployeeID": { + "type": "integer", + "format": "int32" + }, + "LastName": { + "type": "string", + "maxLength": 20 + }, + "FirstName": { + "type": "string", + "maxLength": 10 + }, + "Employees1": { + "type": "array", + "items": { + "$ref": "#/definitions/Employee" + } + }, + "Employee1": { + "$ref": "#/definitions/Employee" + }, + "Orders": { + "type": "array", + "items": { + "$ref": "#/definitions/Order" + } + }, + "Territories": { + "type": "array", + "items": { + "$ref": "#/definitions/Territory" + } + } + }, + "title": "Employee" + }, + "Order_Detail": { + "type": "object", + "properties": { + "OrderID": { + "type": "integer", + "format": "int32" + }, + "ProductID": { + "type": "integer", + "format": "int32" + }, + "UnitPrice": { + "type": "number", + "format": "decimal", + "multipleOf": 0.0001 + }, + "Quantity": { + "type": "integer", + "format": "int16" + }, + "Order": { + "$ref": "#/definitions/Order" + }, + "Product": { + "$ref": "#/definitions/Product" + } + }, + "title": "Order_Detail" + }, + "Order": { + "type": "object", + "properties": { + "OrderID": { + "type": "integer", + "format": "int32" + }, + "CustomerID": { + "type": "string", + "maxLength": 5, + "example": "string" + }, + "Customer": { + "$ref": "#/definitions/Customer" + }, + "Employee": { + "$ref": "#/definitions/Employee" + }, + "Order_Details": { + "type": "array", + "items": { + "$ref": "#/definitions/Order_Detail" + } + }, + "Shipper": { + "$ref": "#/definitions/Shipper" + } + }, + "title": "Order" + }, + "Product": { + "type": "object", + "properties": { + "ProductID": { + "type": "integer", + "format": "int32" + }, + "ProductName": { + "type": "string", + "maxLength": 40 + }, + "Category": { + "$ref": "#/definitions/Category" + }, + "Order_Details": { + "type": "array", + "items": { + "$ref": "#/definitions/Order_Detail" + } + }, + "Supplier": { + "$ref": "#/definitions/Supplier" + } + }, + "title": "Product" + }, + "Region": { + "type": "object", + "properties": { + "RegionID": { + "type": "integer", + "format": "int32" + }, + "RegionDescription": { + "type": "string", + "maxLength": 50 + }, + "Territories": { + "type": "array", + "items": { + "$ref": "#/definitions/Territory" + } + } + }, + "title": "Region" + }, + "Shipper": { + "type": "object", + "properties": { + "ShipperID": { + "type": "integer", + "format": "int32" + }, + "CompanyName": { + "type": "string", + "maxLength": 40 + }, + "Orders": { + "type": "array", + "items": { + "$ref": "#/definitions/Order" + } + } + }, + "title": "Shipper" + }, + "Supplier": { + "type": "object", + "properties": { + "SupplierID": { + "type": "integer", + "format": "int32" + }, + "CompanyName": { + "type": "string", + "maxLength": 40 + }, + "Products": { + "type": "array", + "items": { + "$ref": "#/definitions/Product" + } + } + }, + "title": "Supplier" + }, + "Territory": { + "type": "object", + "properties": { + "TerritoryID": { + "type": "string", + "maxLength": 20 + }, + "TerritoryDescription": { + "type": "string", + "maxLength": 50 + }, + "RegionID": { + "type": "integer", + "format": "int32" + }, + "Region": { + "$ref": "#/definitions/Region" + }, + "Employees": { + "type": "array", + "items": { + "$ref": "#/definitions/Employee" + } + } + }, + "title": "Territory" + } + }, + "responses": { + "error": { + "description": "Error" + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/clickmeter.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/clickmeter.json new file mode 100644 index 0000000000..27e819aa52 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/expansion/clickmeter.json @@ -0,0 +1 @@ +{"swagger":"2.0","schemes":["http","https"],"host":"apiv2.clickmeter.com:80","info":{"contact":{"email":"api@clickmeter.com","name":"Api Support","url":"http://www.clickmeter.com/api"},"description":"Api dashboard for ClickMeter API","title":"ClickMeter","version":"v2","x-logo":{"url":"https://s3.amazonaws.com/clickmeter.com/Web/static/cmlogo.svg"},"x-origin":{"format":"swagger","url":"http://api.v2.clickmeter.com.s3.amazonaws.com/docs/api-docs-v2.json","version":"2.0"},"x-providerName":"clickmeter.com"},"securityDefinitions":{"api_key":{"description":"API Key Authentication","in":"header","name":"X-Clickmeter-AuthKey","type":"apiKey"}},"security":[{"api_key":[]}],"paths":{"/account":{"get":{"consumes":[],"deprecated":false,"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.User"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve current account data","tags":["Account"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.User"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.User"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Update current account data","tags":["Account"]}},"/account/domainwhitelist":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Accounting.DomainWhitelistEntry]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve list of a domains allowed to redirect in DDU mode","tags":["Account"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The entry to add","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.DomainWhitelistEntry"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.DomainWhitelistEntry"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Create an domain entry","tags":["Account"]}},"/account/domainwhitelist/{whitelistId}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"The id of the domain to delete","in":"path","name":"whitelistId","required":true,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.DomainWhitelistEntry"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Delete an domain entry","tags":["Account"]}},"/account/guests":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Field to sort by","in":"query","name":"sortBy","required":false,"type":"string"},{"description":"Direction of sort \"asc\" or \"desc\"","enum":["asc","desc"],"in":"query","name":"sortDirection","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve list of a guest","tags":["Account"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Guest object to create","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.Guest"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.Guest"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Create a guest","tags":["Account"]}},"/account/guests/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve count of guests","tags":["Account"]}},"/account/guests/{guestId}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the guest","format":"int64","in":"path","name":"guestId","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Delete a guest","tags":["Account"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the guest","format":"int64","in":"path","name":"guestId","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.Guest"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a guest","tags":["Account"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the guest","format":"int64","in":"path","name":"guestId","required":true,"type":"integer"},{"description":"Guest object with field updated","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.Guest"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.Guest"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Update a guest","tags":["Account"]}},"/account/guests/{guestId}/permissions":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the guest","format":"int64","in":"path","name":"guestId","required":true,"type":"integer"},{"description":"Can be \"datapoint\" or \"group\"","enum":["datapoint","group"],"in":"query","name":"entityType","required":false,"type":"string"},{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Can be \"w\" or \"r\"","enum":["r","w"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Optional id of the datapoint/group entity to filter by","format":"int64","in":"query","name":"entityId","required":false,"type":"integer"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Grants.Grant]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve permissions for a guest","tags":["Account"]}},"/account/guests/{guestId}/permissions/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the guest","format":"int64","in":"path","name":"guestId","required":true,"type":"integer"},{"description":"Can be \"datapoint\" or \"group\"","enum":["datapoint","group"],"in":"query","name":"entityType","required":false,"type":"string"},{"description":"Can be \"w\" or \"r\"","enum":["r","w"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Optional id of the datapoint/group entity to filter by","format":"int64","in":"query","name":"entityId","required":false,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve count of the permissions for a guest","tags":["Account"]}},"/account/guests/{guestId}/{type}/permissions/patch":{"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the guest","format":"int64","in":"path","name":"guestId","required":true,"type":"integer"},{"description":"Can be \"datapoint\" or \"group\"","enum":["datapoint","group"],"in":"path","name":"type","required":true,"type":"string"},{"description":"The patch permission request","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.PermissionPatchRequest"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Change the permission on a shared object","tags":["Account"]},"put":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the guest","format":"int64","in":"path","name":"guestId","required":true,"type":"integer"},{"description":"Can be \"datapoint\" or \"group\"","enum":["datapoint","group"],"in":"path","name":"type","required":true,"type":"string"},{"description":"The patch permission request","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.PermissionPatchRequest"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Change the permission on a shared object","tags":["Account"]}},"/account/ipblacklist":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Accounting.IpBlacklistEntry]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve list of a ip to exclude from event tracking","tags":["Account"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The entry to add","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.IpBlacklistEntry"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.IpBlacklistEntry"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Create an ip blacklist entry","tags":["Account"]}},"/account/ipblacklist/{blacklistId}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"The id of the ip to delete","in":"path","name":"blacklistId","required":true,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.IpBlacklistEntry"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Delete an ip blacklist entry","tags":["Account"]}},"/account/plan":{"get":{"consumes":[],"deprecated":false,"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.Plan"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve current account plan","tags":["Account"]}},"/aggregated":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"If using \"yesterday\" or \"today\" timeframe you can ask for the hourly detail","in":"query","name":"hourly","required":false,"type":"boolean"},{"description":"","in":"query","name":"onlyFavorites","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this customer for a timeframe","tags":["Aggregated"]}},"/aggregated/list":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"The temporal entity you want to group by (\"week\"/\"month\"). If unspecified is \"day\".","enum":["week","month"],"in":"query","name":"groupBy","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this customer for a timeframe grouped by some temporal entity (day/week/month)","tags":["Aggregated"]}},"/aggregated/summary/conversions":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Status of conversion (\"deleted\"/\"active\")","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"Field to sort by","in":"query","name":"sortBy","required":false,"type":"string"},{"description":"Direction of sort \"asc\" or \"desc\"","enum":["asc","desc"],"in":"query","name":"sortDirection","required":false,"type":"string"},{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedSummaryResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about a subset of conversions for a timeframe with conversions data","tags":["Aggregated"]}},"/aggregated/summary/datapoints":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"Type of datapoint (\"tl\"/\"tp\")","enum":["tp","tl"],"in":"query","name":"type","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Status of datapoint (\"deleted\"/\"active\"/\"paused\"/\"spam\")","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tag","required":false,"type":"string"},{"description":"Is the datapoint marked as favourite","in":"query","name":"favourite","required":false,"type":"boolean"},{"description":"Field to sort by","in":"query","name":"sortBy","required":false,"type":"string"},{"description":"Direction of sort \"asc\" or \"desc\"","enum":["asc","desc"],"in":"query","name":"sortDirection","required":false,"type":"string"},{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Filter by this group id","format":"int64","in":"query","name":"groupId","required":false,"type":"integer"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedSummaryResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about a subset of datapoints for a timeframe with datapoints data","tags":["Aggregated"]}},"/aggregated/summary/groups":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Status of group (\"deleted\"/\"active\")","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tag","required":false,"type":"string"},{"description":"Is the group marked as favourite","in":"query","name":"favourite","required":false,"type":"boolean"},{"description":"Field to sort by","in":"query","name":"sortBy","required":false,"type":"string"},{"description":"Direction of sort \"asc\" or \"desc\"","enum":["asc","desc"],"in":"query","name":"sortDirection","required":false,"type":"string"},{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedSummaryResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about a subset of groups for a timeframe with groups data","tags":["Aggregated"]}},"/clickstream":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Filter by this group id (mutually exclusive with \"datapoint\" and \"conversion\")","format":"int64","in":"query","name":"group","required":false,"type":"integer"},{"description":"Filter by this datapoint id (mutually exclusive with \"group\" and \"conversion\")","format":"int64","in":"query","name":"datapoint","required":false,"type":"integer"},{"description":"Filter by this conversion id (mutually exclusive with \"datapoint\" and \"group\")","format":"int64","in":"query","name":"conversion","required":false,"type":"integer"},{"default":50,"description":"Limit results to this number","format":"int32","in":"query","name":"pageSize","required":false,"type":"integer"},{"description":"Filter event type (\"spiders\"/\"uniques\"/\"nonuniques\"/\"conversions\")","enum":["","spiders","uniques","nonuniques","conversions"],"in":"query","name":"filter","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.ClickStream.Hit]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve the latest list of events of this account. Limited to last 100.","tags":["ClickStream"]}},"/conversions":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Status of conversion (\"deleted\"/\"active\")","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude conversions created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude conversions created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a list of conversions","tags":["Conversions"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The body of the conversion","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Conversions.Conversion"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Create a conversion","tags":["Conversions"]}},"/conversions/aggregated/list":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Status of conversion (\"deleted\"/\"active\")","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"The temporal entity you want to group by (\"week\"/\"month\"). If unspecified is \"day\".","enum":["week","month"],"in":"query","name":"groupBy","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this customer for a timeframe related to a subset of conversions grouped by some temporal entity (day/week/month)","tags":["Conversions"]}},"/conversions/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Status of conversion (\"deleted\"/\"active\")","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude conversions created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude conversions created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a count of conversions","tags":["Conversions"]}},"/conversions/{conversionId}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Delete conversion specified by id","tags":["Conversions"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Conversions.Conversion"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve conversion specified by id","tags":["Conversions"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Updated body of the conversion","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Conversions.Conversion"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Update conversion specified by id","tags":["Conversions"]}},"/conversions/{conversionId}/aggregated":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Filter by this tag name","in":"query","name":"tag","required":false,"type":"string"},{"description":"Is the datapoint marked as favourite","in":"query","name":"favourite","required":false,"type":"boolean"},{"description":"If using \"yesterday\" or \"today\" timeframe you can ask for the hourly detail","in":"query","name":"hourly","required":false,"type":"boolean"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this conversion for a timeframe","tags":["Conversions"]}},"/conversions/{conversionId}/aggregated/list":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"The temporal entity you want to group by (\"week\"/\"month\"). If unspecified is \"day\".","enum":["week","month"],"in":"query","name":"groupBy","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this conversion for a timeframe grouped by some temporal entity (day/week/month)","tags":["Conversions"]}},"/conversions/{conversionId}/datapoints":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Type of datapoint (\"tl\"/\"tp\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Status of datapoint (\"deleted\"/\"active\"/\"paused\"/\"spam\")","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"Filter by this tag name","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a list of datapoints connected to this conversion","tags":["Conversions"]}},"/conversions/{conversionId}/datapoints/batch/patch":{"put":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Patch requests","in":"body","name":"data","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.PatchBodyBatch"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Modify the association between a conversion and multiple datapoints","tags":["Conversions"]}},"/conversions/{conversionId}/datapoints/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Type of datapoint (\"tl\"/\"tp\")","in":"query","name":"type","required":false,"type":"string"},{"description":"Status of datapoint (\"deleted\"/\"active\"/\"paused\"/\"spam\")","in":"query","name":"status","required":false,"type":"string"},{"description":"Filter by this tag name","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a count of datapoints connected to this conversion","tags":["Conversions"]}},"/conversions/{conversionId}/datapoints/patch":{"put":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Patch request","in":"body","name":"data","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.ConversionPatchBody"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Modify the association between a conversion and a datapoint","tags":["Conversions"]}},"/conversions/{conversionId}/hits":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","custom"],"in":"query","name":"timeframe","required":true,"type":"string"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Offset where to start from (it's the lastKey field in the response object)","in":"query","name":"offset","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Filter event type (\"spiders\"/\"uniques\"/\"nonuniques\"/\"conversions\")","enum":["spiders","uniques","nonuniques","conversions"],"in":"query","name":"filter","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitListPage"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve the list of events related to this conversion.","tags":["Conversions"]}},"/conversions/{conversionId}/notes":{"put":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Patch requests","in":"body","name":"note","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.GenericTextPatch"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Fast patch the \"notes\" field of a conversion","tags":["Conversions"]}},"/conversions/{conversionId}/reports":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Type of the report.","enum":["datapoints","groups","browsers","browsersfamilies","platforms","cities","countries","keywords","referrers","convparameters","destinations","languages","params"],"in":"query","name":"type","required":true,"type":"string"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","beginning","custom"],"in":"query","name":"timeframe","required":true,"type":"string"},{"description":"Type of the event you want to filter this report with. By default no filter is applied.","enum":["clicks","views"],"in":"query","name":"hittype","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Tops.Top"}},"401":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a top report connected to this conversion","tags":["Conversions"]}},"/datapoints":{"get":{"consumes":[],"deprecated":false,"parameters":[{"default":0,"description":"Where to start when retrieving elements. Default is 0 if not specified.","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Maximum elements to retrieve. Default to 20 if not specified.","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Type of the datapoint (\"tp\"/\"tl\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Status of the datapoint","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Filter fields by favourite status","in":"query","name":"onlyFavorites","required":false,"type":"boolean"},{"description":"Field to sort by","in":"query","name":"sortBy","required":false,"type":"string"},{"description":"Direction of sort \"asc\" or \"desc\"","enum":["asc","desc"],"in":"query","name":"sortDirection","required":false,"type":"string"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the datapoints associated to the user","tags":["DataPoints"]},"post":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The body of the datapoint","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.Datapoint"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Create a datapoint","tags":["DataPoints"]}},"/datapoints/aggregated":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"Type of datapoint (\"tl\"/\"tp\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"If using \"yesterday\" or \"today\" timeframe you can ask for the hourly detail","in":"query","name":"hourly","required":false,"type":"boolean"},{"description":"Status of datapoint (\"deleted\"/\"active\"/\"paused\"/\"spam\")","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tag","required":false,"type":"string"},{"description":"Is the datapoint is marked as favourite","in":"query","name":"favourite","required":false,"type":"boolean"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this customer for a timeframe by groups","tags":["DataPoints"]}},"/datapoints/aggregated/list":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Type of datapoint (\"tl\"/\"tp\")","enum":["tp","tl"],"in":"query","name":"type","required":true,"type":"string"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Status of datapoint (\"deleted\"/\"active\"/\"paused\"/\"spam\")","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tag","required":false,"type":"string"},{"description":"Is the datapoint is marked as favourite","in":"query","name":"favourite","required":false,"type":"boolean"},{"description":"The temporal entity you want to group by (\"week\"/\"month\"). If unspecified is \"day\".","enum":["week","month"],"in":"query","name":"groupBy","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about all datapoints of this customer for a timeframe grouped by some temporal entity (day/week/month)","tags":["DataPoints"]}},"/datapoints/batch":{"delete":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"A json containing the datapoints to delete.","in":"body","name":"batch","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.DeleteBatch"}}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.ModifyBatchItemResponce[Api.Core.Dto.Datapoints.Datapoint,System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Delete multiple datapoints","tags":["DataPoints"]},"post":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"A json containing the datapoints to update.","in":"body","name":"batch","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.DatapointsBatch"}}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.ModifyBatchItemResponce[Api.Core.Dto.Datapoints.Datapoint,System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Update multiple datapoints","tags":["DataPoints"]},"put":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"A json containing the datapoints to create.","in":"body","name":"batch","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.DatapointsBatch"}}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.ModifyBatchItemResponce[Api.Core.Dto.Datapoints.Datapoint,System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Create multiple datapoints","tags":["DataPoints"]}},"/datapoints/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Type of the datapoint (\"tp\"/\"tl\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Status of the datapoint","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Filter fields by favourite status","in":"query","name":"onlyFavorites","required":false,"type":"boolean"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Count the datapoints associated to the user","tags":["DataPoints"]}},"/datapoints/{id}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"The id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Delete a datapoint","tags":["DataPoints"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"The id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.Datapoint"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Get a datapoint","tags":["DataPoints"]},"post":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"The body of the datapoint","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.Datapoint"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Update a datapoint","tags":["DataPoints"]}},"/datapoints/{id}/aggregated":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"If using \"yesterday\" or \"today\" timeframe you can ask for the hourly detail","in":"query","name":"hourly","required":false,"type":"boolean"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this datapoint for a timeframe","tags":["DataPoints"]}},"/datapoints/{id}/aggregated/list":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"The temporal entity you want to group by (\"week\"/\"month\"). If unspecified is \"day\".","enum":["week","month"],"in":"query","name":"groupBy","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this datapoint for a timeframe grouped by some temporal entity (day/week/month)","tags":["DataPoints"]}},"/datapoints/{id}/favourite":{"put":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Fast switch the \"favourite\" field of a datapoint","tags":["DataPoints"]}},"/datapoints/{id}/hits":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","custom"],"in":"query","name":"timeframe","required":true,"type":"string"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Offset where to start from (it's the lastKey field in the response object)","in":"query","name":"offset","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Filter event type (\"spiders\"/\"uniques\"/\"nonuniques\"/\"conversions\")","enum":["spiders","uniques","nonuniques","conversions"],"in":"query","name":"filter","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitListPage"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve the list of events related to this datapoint.","tags":["DataPoints"]}},"/datapoints/{id}/notes":{"put":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Patch requests","in":"body","name":"note","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.GenericTextPatch"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Fast patch the \"notes\" field of a datapoint","tags":["DataPoints"]}},"/datapoints/{id}/reports":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Type of the report.","enum":["browsers","browsersfamilies","platforms","cities","countries","isps","ips","oss","ossfamilies","keywords","referrers","destinations","languages","params"],"in":"query","name":"type","required":true,"type":"string"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","beginning","custom"],"in":"query","name":"timeframe","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Tops.Top"}},"401":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a top report connected to this datapoint","tags":["DataPoints"]}},"/domains":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"default":"system","description":"Type of domain (\"system\"/\"go\"/\"personal\"/\"dedicated\"). If not specified default is \"system\"","enum":["system","go","personal","dedicated"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Filter domains with this anmen","in":"query","name":"name","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a list of domains","tags":["Domains"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The domain to create","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Domains.Domain"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Create a domain","tags":["Domains"]}},"/domains/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"default":"system","description":"Type of domain (\"system\"/\"go\"/\"personal\"/\"dedicated\"). If not specified default is \"system\"","enum":["system","go","personal","dedicated"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Filter domains with this anmen","in":"query","name":"name","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve count of domains","tags":["Domains"]}},"/domains/{id}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of domain","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Delete a domain","tags":["Domains"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of domain","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Domains.Domain"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Get a domain","tags":["Domains"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of domain","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"The domain to update","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Domains.Domain"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Update a domain","tags":["Domains"]}},"/groups":{"get":{"consumes":[],"deprecated":false,"parameters":[{"default":0,"description":"Where to start when retrieving elements. Default is 0 if not specified.","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Maximum elements to retrieve. Default to 20 if not specified.","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Status of the group","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude groups created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude groups created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"},{"description":"Write permission","in":"query","name":"write","required":false,"type":"boolean"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the groups associated to the user.","tags":["Groups"]},"post":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The body of the group","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Groups.Group"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Create a group","tags":["Groups"]}},"/groups/aggregated":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"If using \"yesterday\" or \"today\" timeframe you can ask for the hourly detail","in":"query","name":"hourly","required":false,"type":"boolean"},{"description":"Status of group (\"deleted\"/\"active\")","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tag","required":false,"type":"string"},{"description":"Is the group is marked as favourite","in":"query","name":"favourite","required":false,"type":"boolean"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this customer for a timeframe by groups","tags":["Groups"]}},"/groups/aggregated/list":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Status of group (\"deleted\"/\"active\")","in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tag","required":false,"type":"string"},{"description":"Is the group is marked as favourite","in":"query","name":"favourite","required":false,"type":"boolean"},{"description":"The temporal entity you want to group by (\"week\"/\"month\"). If unspecified is \"day\".","enum":["deleted","active"],"in":"query","name":"groupBy","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about all groups of this customer for a timeframe grouped by some temporal entity (day/week/month)","tags":["Groups"]}},"/groups/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Status of the datapoint","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude groups created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude groups created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"},{"description":"Write permission","in":"query","name":"write","required":false,"type":"boolean"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Count the groups associated to the user.","tags":["Groups"]}},"/groups/{id}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Delete group specified by id","tags":["Groups"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"The id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Groups.Group"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Get a group","tags":["Groups"]},"post":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"The body of the group","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Groups.Group"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Update a group","tags":["Groups"]}},"/groups/{id}/aggregated":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"If using \"yesterday\" or \"today\" timeframe you can ask for the hourly detail","in":"query","name":"hourly","required":false,"type":"boolean"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this group for a timeframe","tags":["Groups"]}},"/groups/{id}/aggregated/list":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"The temporal entity you want to group by (\"week\"/\"month\"). If unspecified is \"day\".","enum":["week","month"],"in":"query","name":"groupBy","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this group for a timeframe grouped by some temporal entity (day/week/month)","tags":["Groups"]}},"/groups/{id}/aggregated/summary":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Filter by this group id","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"Type of datapoint (\"tl\"/\"tp\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Status of datapoint (\"deleted\"/\"active\"/\"paused\"/\"spam\")","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tag","required":false,"type":"string"},{"description":"Is the datapoint marked as favourite","in":"query","name":"favourite","required":false,"type":"boolean"},{"description":"Field to sort by","in":"query","name":"sortBy","required":false,"type":"string"},{"description":"Direction of sort \"asc\" or \"desc\"","enum":["asc","desc"],"in":"query","name":"sortDirection","required":false,"type":"string"},{"default":0,"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedSummaryResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about a subset of datapoints for a timeframe with datapoints data","tags":["Groups"]}},"/groups/{id}/datapoints":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"default":0,"description":"Where to start when retrieving elements. Default is 0 if not specified.","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Maximum elements to retrieve. Default to 20 if not specified.","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Type of the datapoint (\"tp\"/\"tl\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Status of the datapoint","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Filter fields by favourite status","in":"query","name":"onlyFavorites","required":false,"type":"boolean"},{"description":"Field to sort by","in":"query","name":"sortBy","required":false,"type":"string"},{"description":"Direction of sort \"asc\" or \"desc\"","enum":["asc","desc"],"in":"query","name":"sortDirection","required":false,"type":"string"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the datapoints associated to the user in this group.","tags":["Groups"]},"post":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"The body of the datapoint","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.Datapoint"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Create a datapoint in this group","tags":["Groups"]}},"/groups/{id}/datapoints/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Type of the datapoint (\"tp\"/\"tl\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Status of the datapoint","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Filter fields by favourite status","in":"query","name":"onlyFavorites","required":false,"type":"boolean"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Count the datapoints associated to the user in this group.","tags":["Groups"]}},"/groups/{id}/favourite":{"put":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Fast switch the \"favourite\" field of a group","tags":["Groups"]}},"/groups/{id}/hits":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","custom"],"in":"query","name":"timeframe","required":true,"type":"string"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Offset where to start from (it's the lastKey field in the response object)","in":"query","name":"offset","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Filter event type (\"spiders\"/\"uniques\"/\"nonuniques\"/\"conversions\")","enum":["spiders","uniques","nonuniques","conversions"],"in":"query","name":"filter","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitListPage"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve the list of events related to this group.","tags":["Groups"]}},"/groups/{id}/notes":{"put":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Patch requests","in":"body","name":"note","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.GenericTextPatch"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Fast patch the \"notes\" field of a group","tags":["Groups"]}},"/groups/{id}/reports":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Type of the report.","enum":["browsers","browsersfamilies","platforms","cities","countries","isps","ips","oss","ossfamilies","keywords","referrers","destinations","languages","params"],"in":"query","name":"type","required":true,"type":"string"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","beginning","custom"],"in":"query","name":"timeframe","required":true,"type":"string"},{"description":"Type of the event you want to filter this report with. By default no filter is applied.","enum":["clicks","views"],"in":"query","name":"hittype","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Tops.Top"}},"401":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a top report connected to this group","tags":["Groups"]}},"/hits":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","custom"],"in":"query","name":"timeframe","required":true,"type":"string"},{"description":"Limit results to this number","format":"int32","in":"query","name":"limit","required":false,"type":"integer"},{"description":"Offset where to start from (it's the lastKey field in the response object)","in":"query","name":"offset","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Filter event type (\"spiders\"/\"uniques\"/\"nonuniques\"/\"conversions\")","enum":["spiders","uniques","nonuniques","conversions"],"in":"query","name":"filter","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitListPage"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve the list of events related to this account.","tags":["Hits"]}},"/me":{"get":{"consumes":[],"deprecated":false,"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.User"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve current account data","tags":["Me"]}},"/me/plan":{"get":{"consumes":[],"deprecated":false,"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.Plan"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve current account plan","tags":["Me"]}},"/reports":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Type of the report.","enum":["browsers","browsersfamilies","platforms","cities","countries","isps","ips","oss","ossfamilies","keywords","referrers","destinations","languages","params"],"in":"query","name":"type","required":true,"type":"string"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","beginning","custom"],"in":"query","name":"timeframe","required":true,"type":"string"},{"description":"Type of the event you want to filter this report with. By default no filter is applied.","in":"query","name":"hittype","required":false,"type":"string"},{"description":"Filter by this group id (mutually exclusive with \"datapoint\" and \"conversion\")","format":"int64","in":"query","name":"group","required":false,"type":"integer"},{"description":"Filter by this datapoint id (mutually exclusive with \"group\" and \"conversion\")","format":"int64","in":"query","name":"datapoint","required":false,"type":"integer"},{"description":"Filter by this conversion id (mutually exclusive with \"datapoint\" and \"group\")","format":"int64","in":"query","name":"conversion","required":false,"type":"integer"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Tops.Top"}},"401":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a top report","tags":["Reports"]}},"/retargeting":{"get":{"consumes":[],"deprecated":false,"parameters":[{"default":0,"description":"Where to start when retrieving elements. Default is 0 if not specified.","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Maximum elements to retrieve. Default to 20 if not specified.","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the retargeting scripts associated to the user","tags":["Retargeting"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The body of the retargeting script","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Retargeting.RetargetingScript"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Creates a retargeting script","tags":["Retargeting"]}},"/retargeting/count":{"get":{"consumes":[],"deprecated":false,"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve count of retargeting scripts","tags":["Retargeting"]}},"/retargeting/{id}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"The id of the retargeting script","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Deletes a retargeting script (and remove associations)","tags":["Retargeting"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"The id of the retargeting script","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Retargeting.RetargetingScript"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Get a retargeting script object","tags":["Retargeting"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The id of the retargeting script","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"The body of the retargeting script","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Retargeting.RetargetingScript"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Updates a retargeting script","tags":["Retargeting"]}},"/retargeting/{id}/datapoints":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the retargeting script","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"default":0,"description":"Where to start when retrieving elements. Default is 0 if not specified.","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Maximum elements to retrieve. Default to 20 if not specified.","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Status of the datapoint","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Filter fields by favourite status","in":"query","name":"onlyFavorites","required":false,"type":"boolean"},{"description":"Field to sort by","in":"query","name":"sortBy","required":false,"type":"string"},{"description":"Direction of sort \"asc\" or \"desc\"","enum":["asc","desc"],"in":"query","name":"sortDirection","required":false,"type":"string"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the datapoints associated to the retargeting script.","tags":["Retargeting"]}},"/retargeting/{id}/datapoints/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Status of the datapoint","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Filter fields by favourite status","in":"query","name":"onlyFavorites","required":false,"type":"boolean"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Count the datapoints associated to the retargeting script.","tags":["Retargeting"]}},"/tags":{"get":{"consumes":[],"deprecated":false,"parameters":[{"default":0,"description":"Where to start when retrieving elements. Default is 0 if not specified.","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Maximum elements to retrieve. Default to 20 if not specified.","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Name of the tag","in":"query","name":"name","required":false,"type":"string"},{"description":"Comma separated list of datapoints id to filter by","in":"query","name":"datapoints","required":false,"type":"string"},{"description":"Comma separated list of groups id to filter by","in":"query","name":"groups","required":false,"type":"string"},{"description":"Type of entity related to the tag","enum":["tp","tl","dp","gr"],"in":"query","name":"type","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the groups associated to the user filtered by this tag.","tags":["Tags"]},"post":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The body of the tag","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Tags.Tag"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Create a tag","tags":["Tags"]}},"/tags/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Name of the tag","in":"query","name":"name","required":false,"type":"string"},{"description":"Comma separated list of datapoints id to filter by","in":"query","name":"datapoints","required":false,"type":"string"},{"description":"Comma separated list of groups id to filter by","in":"query","name":"groups","required":false,"type":"string"},{"description":"Type of entity related to the tag","enum":["tp","tl","dp","gr"],"in":"query","name":"type","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/System.Object"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the groups associated to the user filtered by this tag.","tags":["Tags"]}},"/tags/{tagId}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the tag","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/System.Object"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Delete a tag","tags":["Tags"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the tag","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Tags.Tag"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a tag","tags":["Tags"]}},"/tags/{tagId}/datapoints":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the tag","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Delete the association of this tag with all datapoints","tags":["Tags"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the tag.","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"},{"default":0,"description":"Where to start when retrieving elements. Default is 0 if not specified.","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Maximum elements to retrieve. Default to 20 if not specified.","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Type of the datapoint (\"tp\"/\"tl\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Status of the datapoint","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the datapoints associated to the user filtered by this tag","tags":["Tags"]}},"/tags/{tagId}/datapoints/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the tag.","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"},{"description":"Type of the datapoint (\"tp\"/\"tl\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Status of the datapoint","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Count the datapoints associated to the user filtered by this tag","tags":["Tags"]}},"/tags/{tagId}/datapoints/patch":{"put":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the tag","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"},{"description":"The body patch","in":"body","name":"data","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.PatchBody"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Associate/Deassociate a tag with a datapoint","tags":["Tags"]}},"/tags/{tagId}/groups":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the tag","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Delete the association of this tag with all groups","tags":["Tags"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the tag.","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"},{"default":0,"description":"Where to start when retrieving elements. Default is 0 if not specified.","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Maximum elements to retrieve. Default to 20 if not specified.","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Status of the datapoint","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude groups created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude groups created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the groups associated to the user filtered by this tag.","tags":["Tags"]}},"/tags/{tagId}/groups/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the tag.","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"},{"description":"Status of the datapoint","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude groups created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude groups created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Count the groups associated to the user filtered by this tag","tags":["Tags"]}},"/tags/{tagId}/groups/patch":{"put":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the tag","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"},{"description":"The body patch","in":"body","name":"data","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.PatchBody"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Associate/Deassociate a tag with a group","tags":["Tags"]}},"/tags/{tagId}/name":{"put":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the tag","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"},{"description":"The body patch","in":"body","name":"data","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.GenericTextPatch"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Fast patch a tag name","tags":["Tags"]}}},"definitions":{"Api.Core.Dto.Accounting.ConversionOptions":{"properties":{"hideComCost":{"type":"boolean"},"hideCost":{"type":"boolean"},"hideCount":{"type":"boolean"},"hideParams":{"type":"boolean"},"hideValue":{"type":"boolean"},"percentCommission":{"format":"int32","type":"integer"},"percentValue":{"format":"int32","type":"integer"}},"type":"object"},"Api.Core.Dto.Accounting.DomainWhitelistEntry":{"properties":{"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"Api.Core.Dto.Accounting.ExtendedGrants":{"properties":{"allowAllGrants":{"type":"boolean"},"allowGroupCreation":{"type":"boolean"}},"type":"object"},"Api.Core.Dto.Accounting.Guest":{"properties":{"apiKey":{"type":"string"},"conversionOptions":{"$ref":"#/definitions/Api.Core.Dto.Accounting.ConversionOptions"},"creationDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"currentGrant":{"$ref":"#/definitions/Api.Core.Dto.Grants.Grant"},"dateFormat":{"type":"string"},"decimalSeparator":{"type":"string"},"email":{"type":"string"},"extendedGrants":{"$ref":"#/definitions/Api.Core.Dto.Accounting.ExtendedGrants"},"groupGrants":{"format":"int64","type":"integer"},"hitOptions":{"$ref":"#/definitions/Api.Core.Dto.Accounting.HitOptions"},"id":{"format":"int64","type":"integer"},"key":{"type":"string"},"language":{"type":"string"},"loginCount":{"format":"int32","type":"integer"},"name":{"type":"string"},"notes":{"type":"string"},"numberGroupSeparator":{"type":"string"},"password":{"type":"string"},"timeFormat":{"enum":["AmPm","H24"],"type":"string"},"timeZone":{"format":"int32","type":"integer"},"timeframeMinDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"timezonename":{"type":"string"},"tlGrants":{"format":"int64","type":"integer"},"tpGrants":{"format":"int64","type":"integer"},"userName":{"type":"string"}},"type":"object"},"Api.Core.Dto.Accounting.HitOptions":{"properties":{"hideReferrer":{"type":"boolean"}},"type":"object"},"Api.Core.Dto.Accounting.IpBlacklistEntry":{"properties":{"id":{"type":"string"},"ip":{"type":"string"}},"type":"object"},"Api.Core.Dto.Accounting.Plan":{"properties":{"allowedPersonalDomains":{"format":"int32","type":"integer"},"allowedPersonalUrls":{"format":"int32","type":"integer"},"billingPeriodEnd":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"billingPeriodStart":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"bonusMonthlyEvents":{"format":"int64","type":"integer"},"maximumDatapoints":{"format":"int64","type":"integer"},"maximumGuests":{"format":"int64","type":"integer"},"monthlyEvents":{"format":"int64","type":"integer"},"name":{"type":"string"},"price":{"format":"double","type":"number"},"profileId":{"format":"int64","type":"integer"},"recurring":{"type":"boolean"},"recurringPeriod":{"format":"int32","type":"integer"},"usedDatapoints":{"format":"int64","type":"integer"},"usedMonthlyEvents":{"format":"int64","type":"integer"}},"type":"object"},"Api.Core.Dto.Accounting.User":{"properties":{"boGoVal":{"type":"string"},"bonusClicks":{"format":"int64","type":"integer"},"companyName":{"type":"string"},"companyRole":{"type":"string"},"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"phone":{"type":"string"},"redirectOnly":{"type":"boolean"},"registrationDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"timeframeMinDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"timezone":{"format":"int32","type":"integer"},"timezonename":{"type":"string"}},"type":"object"},"Api.Core.Dto.Aggregated.AggregatedResult":{"properties":{"activityDay":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"commissionsCost":{"format":"double","type":"number"},"conversionsCost":{"format":"double","type":"number"},"conversionsValue":{"format":"double","type":"number"},"convertedClicks":{"format":"int64","type":"integer"},"entityData":{"$ref":"#/definitions/System.Object"},"entityId":{"type":"string"},"fromDay":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"hourlyBreakDown":{"additionalProperties":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"},"type":"object"},"lastHitDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"spiderHitsCount":{"format":"int64","type":"integer"},"toDay":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"totalClicks":{"format":"int64","type":"integer"},"totalViews":{"format":"int64","type":"integer"},"uniqueClicks":{"format":"int64","type":"integer"},"uniqueConversions":{"format":"int64","type":"integer"},"uniqueViews":{"format":"int64","type":"integer"}},"type":"object"},"Api.Core.Dto.Aggregated.AggregatedSummaryResult":{"properties":{"count":{"format":"int64","type":"integer"},"limit":{"format":"int32","type":"integer"},"offset":{"format":"int64","type":"integer"},"result":{"items":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"},"type":"array"}},"type":"object"},"Api.Core.Dto.ClickStream.Hit":{"properties":{"accessTime":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"browser":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitBrowserInfo"},"clientLanguage":{"type":"string"},"conversion1":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo"},"conversion2":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo"},"conversion3":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo"},"conversion4":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo"},"conversion5":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo"},"conversions":{"items":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo"},"type":"array"},"entity":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitDatapointInfo"},"ip":{"type":"string"},"isProxy":{"type":"string"},"isSpider":{"type":"string"},"isUnique":{"type":"string"},"location":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitLocationInfo"},"org":{"type":"string"},"os":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitOsInfo"},"queryParams":{"type":"string"},"realDestinationUrl":{"type":"string"},"referer":{"type":"string"},"source":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitSource"},"type":{"type":"string"}},"type":"object"},"Api.Core.Dto.ClickStream.HitBrowserInfo":{"properties":{"browserType":{"type":"string"},"familyId":{"format":"int64","type":"integer"},"familyName":{"type":"string"},"id":{"format":"int64","type":"integer"},"name":{"type":"string"}},"type":"object"},"Api.Core.Dto.ClickStream.HitConversionInfo":{"properties":{"accessTime":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"comcost":{"format":"double","type":"number"},"cost":{"format":"double","type":"number"},"date":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"name":{"type":"string"},"parameter":{"type":"string"},"value":{"format":"double","type":"number"}},"type":"object"},"Api.Core.Dto.ClickStream.HitDatapointInfo":{"properties":{"creationDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"datapointFavourite":{"type":"boolean"},"datapointId":{"format":"int64","type":"integer"},"datapointName":{"type":"string"},"datapointTitle":{"type":"string"},"datapointType":{"type":"string"},"destinationUrl":{"type":"string"},"groupId":{"format":"int64","type":"integer"},"groupName":{"type":"string"},"isABTest":{"type":"boolean"},"isPrivateShared":{"type":"boolean"},"isPublic":{"type":"boolean"},"notes":{"type":"string"},"status":{"enum":["Active","Paused","Abuse","Deleted"],"type":"string"},"tags":{"items":{"$ref":"#/definitions/Api.Core.Dto.Tags.Tag"},"type":"array"},"trackingCode":{"type":"string"}},"type":"object"},"Api.Core.Dto.ClickStream.HitListPage":{"properties":{"hits":{"items":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.Hit"},"type":"array"},"lastKey":{"type":"string"}},"type":"object"},"Api.Core.Dto.ClickStream.HitLocationInfo":{"properties":{"areacode":{"type":"string"},"city":{"type":"string"},"country":{"type":"string"},"latitude":{"format":"double","type":"number"},"longitude":{"format":"double","type":"number"},"metrocode":{"type":"string"},"organization":{"type":"string"},"postalcode":{"type":"string"},"region":{"type":"string"},"regionName":{"type":"string"}},"type":"object"},"Api.Core.Dto.ClickStream.HitOsInfo":{"properties":{"familyId":{"format":"int64","type":"integer"},"familyName":{"type":"string"},"id":{"format":"int64","type":"integer"},"name":{"type":"string"}},"type":"object"},"Api.Core.Dto.ClickStream.HitSource":{"properties":{"id":{"format":"int64","type":"integer"},"name":{"type":"string"},"param":{"type":"string"}},"type":"object"},"Api.Core.Dto.Conversions.Conversion":{"properties":{"code":{"type":"string"},"creationDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"deleted":{"type":"boolean"},"description":{"type":"string"},"id":{"format":"int64","type":"integer"},"name":{"type":"string"},"protocol":{"enum":["Http","Https"],"type":"string"},"value":{"format":"double","type":"number"}},"type":"object"},"Api.Core.Dto.Datapoints.BrowserBaseDestinationItem":{"properties":{"emailDestinationUrl":{"type":"string"},"mobileDestinationUrl":{"type":"string"},"spidersDestinationUrl":{"type":"string"}},"type":"object"},"Api.Core.Dto.Datapoints.Datapoint":{"properties":{"creationDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"encodeIp":{"type":"boolean"},"fifthConversionId":{"format":"int64","type":"integer"},"fifthConversionName":{"type":"string"},"firstConversionId":{"format":"int64","type":"integer"},"firstConversionName":{"type":"string"},"fourthConversionId":{"format":"int64","type":"integer"},"fourthConversionName":{"type":"string"},"groupId":{"format":"int64","type":"integer"},"groupName":{"type":"string"},"id":{"format":"int64","type":"integer"},"isPublic":{"type":"boolean"},"isSecured":{"type":"boolean"},"lightTracking":{"type":"boolean"},"name":{"type":"string"},"notes":{"type":"string"},"preferred":{"type":"boolean"},"redirectOnly":{"type":"boolean"},"secondConversionId":{"format":"int64","type":"integer"},"secondConversionName":{"type":"string"},"status":{"enum":["Active","Paused","Abuse","Deleted"],"type":"string"},"tags":{"items":{"$ref":"#/definitions/Api.Core.Dto.Tags.Tag"},"type":"array"},"thirdConversionId":{"format":"int64","type":"integer"},"thirdConversionName":{"type":"string"},"title":{"type":"string"},"trackingCode":{"type":"string"},"type":{"enum":["TrackingLink","TrackingPixel"],"type":"string"},"typeTL":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.TrackingLinkSpecifics"},"typeTP":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.TrackingPixelSpecifics"},"writePermited":{"type":"boolean"}},"type":"object"},"Api.Core.Dto.Datapoints.DatapointRetargetingInfo":{"properties":{"id":{"format":"int64","type":"integer"},"name":{"type":"string"}},"type":"object"},"Api.Core.Dto.Datapoints.MultipleDestinationItem":{"properties":{"url":{"type":"string"}},"type":"object"},"Api.Core.Dto.Datapoints.TrackingLinkSpecifics":{"properties":{"appendQuery":{"type":"boolean"},"browserDestinationItem":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.BrowserBaseDestinationItem"},"destinationMode":{"enum":["Simple","RandomDestination","DestinationByLanguage","SpilloverDestination","DynamicUrl","BrowserDestination","DestinationByNation","UniqueDestination","SequentialDestination","WeightedDestination"],"type":"string"},"domainId":{"format":"int32","type":"integer"},"encodeUrl":{"type":"boolean"},"expirationClicks":{"format":"int64","type":"integer"},"expirationDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"firstUrl":{"type":"string"},"goDomainId":{"format":"int32","type":"integer"},"hideUrl":{"type":"boolean"},"hideUrlTitle":{"type":"string"},"isABTest":{"type":"boolean"},"password":{"type":"string"},"pauseAfterClicksExpiration":{"type":"boolean"},"pauseAfterDateExpiration":{"type":"boolean"},"randomDestinationItems":{"items":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.MultipleDestinationItem"},"type":"array"},"redirectType":{"enum":["PermanentRedirect","TemporaryRedirect"],"type":"string"},"referrerClean":{"enum":["None","Clean","Myself"],"type":"string"},"scripts":{"items":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.DatapointRetargetingInfo"},"type":"array"},"sequentialDestinationItems":{"items":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.MultipleDestinationItem"},"type":"array"},"spilloverDestinationItems":{"items":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.MultipleDestinationItem"},"type":"array"},"uniqueDestinationItem":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.UniqueDestinationItem"},"url":{"type":"string"},"urlAfterClicksExpiration":{"type":"string"},"urlAfterDateExpiration":{"type":"string"},"urlsByLanguage":{"items":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.UrlByLanguageItem"},"type":"array"},"urlsByNation":{"items":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.UrlByNationItem"},"type":"array"},"weightedDestinationItems":{"items":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.WeightedDestinationItem"},"type":"array"}},"type":"object"},"Api.Core.Dto.Datapoints.TrackingPixelSpecifics":{"properties":{"parameterNote":{"type":"string"}},"type":"object"},"Api.Core.Dto.Datapoints.UniqueDestinationItem":{"properties":{"firstDestinationUrl":{"type":"string"}},"type":"object"},"Api.Core.Dto.Datapoints.UrlByLanguageItem":{"properties":{"languageCode":{"type":"string"},"url":{"type":"string"}},"type":"object"},"Api.Core.Dto.Datapoints.UrlByNationItem":{"properties":{"nation":{"type":"string"},"url":{"type":"string"}},"type":"object"},"Api.Core.Dto.Datapoints.WeightedDestinationItem":{"properties":{"url":{"type":"string"},"weight":{"format":"int32","type":"integer"}},"type":"object"},"Api.Core.Dto.Domains.Domain":{"properties":{"custom404":{"type":"string"},"customHomepage":{"type":"string"},"id":{"format":"int64","type":"integer"},"name":{"type":"string"},"type":{"enum":["System","Go","Dedicated","Personal"],"type":"string"}},"type":"object"},"Api.Core.Dto.EntityUriLong":{"properties":{"id":{"format":"int64","type":"integer"},"uri":{"type":"string"}},"type":"object"},"Api.Core.Dto.Grants.Grant":{"properties":{"DatapointType":{"type":"string"},"Entity":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"},"EntityName":{"type":"string"},"EntityType":{"type":"string"},"Type":{"type":"string"}},"type":"object"},"Api.Core.Dto.Groups.Group":{"properties":{"creationDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"isPublic":{"type":"boolean"},"name":{"type":"string"},"notes":{"type":"string"},"preferred":{"type":"boolean"},"redirectOnly":{"type":"boolean"},"tags":{"items":{"$ref":"#/definitions/Api.Core.Dto.Tags.Tag"},"type":"array"},"writePermited":{"type":"boolean"}},"type":"object"},"Api.Core.Dto.Retargeting.RetargetingScript":{"properties":{"id":{"format":"int64","type":"integer"},"name":{"type":"string"},"script":{"type":"string"}},"type":"object"},"Api.Core.Dto.Tags.Tag":{"properties":{"datapoints":{"items":{"format":"int64","type":"integer"},"type":"array"},"groups":{"items":{"format":"int64","type":"integer"},"type":"array"},"id":{"format":"int64","type":"integer"},"name":{"type":"string"}},"type":"object"},"Api.Core.Dto.Tops.Top":{"properties":{"createdAt":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"data":{"items":{"$ref":"#/definitions/Api.Core.Dto.Tops.TopItem"},"type":"array"},"key":{"type":"string"}},"type":"object"},"Api.Core.Dto.Tops.TopItem":{"properties":{"entityData":{"$ref":"#/definitions/System.Object"},"id":{"type":"string"},"lastHitDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"spiderClicks":{"format":"int64","type":"integer"},"spiderHits":{"format":"int64","type":"integer"},"spiderViews":{"format":"int64","type":"integer"},"totalClicks":{"format":"int64","type":"integer"},"totalCommissionsCost":{"format":"double","type":"number"},"totalConversions":{"format":"int64","type":"integer"},"totalConversionsCost":{"format":"double","type":"number"},"totalConversionsValue":{"format":"double","type":"number"},"totalHits":{"format":"int64","type":"integer"},"totalViews":{"format":"int64","type":"integer"},"uniqueClicks":{"format":"int64","type":"integer"},"uniqueHits":{"format":"int64","type":"integer"},"uniqueViews":{"format":"int64","type":"integer"}},"type":"object"},"Api.Core.Requests.ConversionPatchBody":{"properties":{"Action":{"type":"string"},"Id":{"format":"int64","type":"integer"},"ReplaceId":{"format":"int64","type":"integer"}},"type":"object"},"Api.Core.Requests.DatapointsBatch":{"properties":{"List":{"items":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.Datapoint"},"type":"array"}},"type":"object"},"Api.Core.Requests.DeleteBatch":{"properties":{"Entities":{"items":{"$ref":"#/definitions/Api.Core.Dto.EntityUriLong"},"type":"array"}},"type":"object"},"Api.Core.Requests.GenericTextPatch":{"properties":{"Text":{"type":"string"}},"type":"object"},"Api.Core.Requests.PatchBody":{"properties":{"Action":{"type":"string"},"Id":{"format":"int64","type":"integer"}},"type":"object"},"Api.Core.Requests.PatchBodyBatch":{"properties":{"PatchRequests":{"items":{"$ref":"#/definitions/Api.Core.Requests.PatchBody"},"type":"array"}},"type":"object"},"Api.Core.Requests.PermissionPatchRequest":{"properties":{"Action":{"type":"string"},"Id":{"format":"int64","type":"integer"},"Verb":{"type":"string"}},"type":"object"},"Api.Core.Responses.CountResponce":{"properties":{"count":{"format":"int64","type":"integer"}},"type":"object"},"Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Accounting.DomainWhitelistEntry]":{"properties":{"entities":{"items":{"$ref":"#/definitions/Api.Core.Dto.Accounting.DomainWhitelistEntry"},"type":"array"}},"type":"object"},"Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Accounting.IpBlacklistEntry]":{"properties":{"entities":{"items":{"$ref":"#/definitions/Api.Core.Dto.Accounting.IpBlacklistEntry"},"type":"array"}},"type":"object"},"Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]":{"properties":{"entities":{"items":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"},"type":"array"}},"type":"object"},"Api.Core.Responses.EntitiesResponse[Api.Core.Dto.ClickStream.Hit]":{"properties":{"entities":{"items":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.Hit"},"type":"array"}},"type":"object"},"Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Grants.Grant]":{"properties":{"entities":{"items":{"$ref":"#/definitions/Api.Core.Dto.Grants.Grant"},"type":"array"}},"type":"object"},"Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]":{"properties":{"entities":{"items":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"},"type":"array"}},"type":"object"},"Api.Core.Responses.EntityUri[System.Int64]":{"properties":{"id":{"format":"int64","type":"integer"},"uri":{"type":"string"}},"type":"object"},"Api.Core.Responses.ModifyBatchItemResponce[Api.Core.Dto.Datapoints.Datapoint,System.Int64]":{"properties":{"entityData":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.Datapoint"},"errors":{"items":{"$ref":"#/definitions/ClickMeter.Infrastructure.Validation.ValidationFailure"},"type":"array"},"result":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"},"status":{"type":"string"}},"type":"object"},"ClickMeter.Infrastructure.Validation.ValidationFailure":{"properties":{"code":{"$ref":"#/definitions/System.Object"},"errorMessage":{"type":"string"},"errorValue":{"$ref":"#/definitions/System.Object"},"property":{"type":"string"}},"type":"object"},"System.Object":{"properties":{},"type":"object"}}} diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/clickmeter.yaml b/vendor/github.com/go-openapi/spec/fixtures/expansion/clickmeter.yaml new file mode 100644 index 0000000000..0ce32b1a92 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/expansion/clickmeter.yaml @@ -0,0 +1,6461 @@ +swagger: '2.0' +schemes: + - http + - https +host: 'apiv2.clickmeter.com:80' +info: + contact: + email: api@clickmeter.com + name: Api Support + url: 'http://www.clickmeter.com/api' + description: Api dashboard for ClickMeter API + title: ClickMeter + version: v2 + x-logo: + url: 'https://s3.amazonaws.com/clickmeter.com/Web/static/cmlogo.svg' + x-origin: + format: swagger + url: 'http://api.v2.clickmeter.com.s3.amazonaws.com/docs/api-docs-v2.json' + version: '2.0' + x-providerName: clickmeter.com +securityDefinitions: + api_key: + description: API Key Authentication + in: header + name: X-Clickmeter-AuthKey + type: apiKey +security: + - api_key: [] +paths: + /account: + get: + consumes: [] + deprecated: false + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Accounting.User' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve current account data + tags: + - Account + post: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - in: body + name: value + required: true + schema: + $ref: '#/definitions/Api.Core.Dto.Accounting.User' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Accounting.User' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Update current account data + tags: + - Account + /account/domainwhitelist: + get: + consumes: [] + deprecated: false + parameters: + - description: Offset where to start from + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - description: Limit results to this number + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Accounting.DomainWhitelistEntry]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve list of a domains allowed to redirect in DDU mode + tags: + - Account + post: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: The entry to add + in: body + name: value + required: true + schema: + $ref: '#/definitions/Api.Core.Dto.Accounting.DomainWhitelistEntry' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Accounting.DomainWhitelistEntry' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Create an domain entry + tags: + - Account + '/account/domainwhitelist/{whitelistId}': + delete: + consumes: [] + deprecated: false + parameters: + - description: The id of the domain to delete + in: path + name: whitelistId + required: true + type: string + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Accounting.DomainWhitelistEntry' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Delete an domain entry + tags: + - Account + /account/guests: + get: + consumes: [] + deprecated: false + parameters: + - description: Offset where to start from + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - description: Limit results to this number + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: Field to sort by + in: query + name: sortBy + required: false + type: string + - description: 'Direction of sort "asc" or "desc"' + enum: + - asc + - desc + in: query + name: sortDirection + required: false + type: string + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve list of a guest + tags: + - Account + post: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: Guest object to create + in: body + name: value + required: true + schema: + $ref: '#/definitions/Api.Core.Dto.Accounting.Guest' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Accounting.Guest' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Create a guest + tags: + - Account + /account/guests/count: + get: + consumes: [] + deprecated: false + parameters: + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.CountResponce' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve count of guests + tags: + - Account + '/account/guests/{guestId}': + delete: + consumes: [] + deprecated: false + parameters: + - description: Id of the guest + format: int64 + in: path + name: guestId + required: true + type: integer + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Delete a guest + tags: + - Account + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the guest + format: int64 + in: path + name: guestId + required: true + type: integer + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Accounting.Guest' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve a guest + tags: + - Account + post: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: Id of the guest + format: int64 + in: path + name: guestId + required: true + type: integer + - description: Guest object with field updated + in: body + name: value + required: true + schema: + $ref: '#/definitions/Api.Core.Dto.Accounting.Guest' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Accounting.Guest' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Update a guest + tags: + - Account + '/account/guests/{guestId}/permissions': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the guest + format: int64 + in: path + name: guestId + required: true + type: integer + - description: 'Can be "datapoint" or "group"' + enum: + - datapoint + - group + in: query + name: entityType + required: false + type: string + - description: Offset where to start from + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - description: Limit results to this number + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: 'Can be "w" or "r"' + enum: + - r + - w + in: query + name: type + required: false + type: string + - description: Optional id of the datapoint/group entity to filter by + format: int64 + in: query + name: entityId + required: false + type: integer + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Grants.Grant]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve permissions for a guest + tags: + - Account + '/account/guests/{guestId}/permissions/count': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the guest + format: int64 + in: path + name: guestId + required: true + type: integer + - description: 'Can be "datapoint" or "group"' + enum: + - datapoint + - group + in: query + name: entityType + required: false + type: string + - description: 'Can be "w" or "r"' + enum: + - r + - w + in: query + name: type + required: false + type: string + - description: Optional id of the datapoint/group entity to filter by + format: int64 + in: query + name: entityId + required: false + type: integer + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.CountResponce' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve count of the permissions for a guest + tags: + - Account + '/account/guests/{guestId}/{type}/permissions/patch': + post: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: Id of the guest + format: int64 + in: path + name: guestId + required: true + type: integer + - description: 'Can be "datapoint" or "group"' + enum: + - datapoint + - group + in: path + name: type + required: true + type: string + - description: The patch permission request + in: body + name: body + required: true + schema: + $ref: '#/definitions/Api.Core.Requests.PermissionPatchRequest' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Change the permission on a shared object + tags: + - Account + put: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: Id of the guest + format: int64 + in: path + name: guestId + required: true + type: integer + - description: 'Can be "datapoint" or "group"' + enum: + - datapoint + - group + in: path + name: type + required: true + type: string + - description: The patch permission request + in: body + name: body + required: true + schema: + $ref: '#/definitions/Api.Core.Requests.PermissionPatchRequest' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Change the permission on a shared object + tags: + - Account + /account/ipblacklist: + get: + consumes: [] + deprecated: false + parameters: + - description: Offset where to start from + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - description: Limit results to this number + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Accounting.IpBlacklistEntry]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve list of a ip to exclude from event tracking + tags: + - Account + post: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: The entry to add + in: body + name: value + required: true + schema: + $ref: '#/definitions/Api.Core.Dto.Accounting.IpBlacklistEntry' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Accounting.IpBlacklistEntry' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Create an ip blacklist entry + tags: + - Account + '/account/ipblacklist/{blacklistId}': + delete: + consumes: [] + deprecated: false + parameters: + - description: The id of the ip to delete + in: path + name: blacklistId + required: true + type: string + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Accounting.IpBlacklistEntry' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Delete an ip blacklist entry + tags: + - Account + /account/plan: + get: + consumes: [] + deprecated: false + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Accounting.Plan' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve current account plan + tags: + - Account + /aggregated: + get: + consumes: [] + deprecated: false + parameters: + - description: Timeframe of the request. See list at $timeframeList + enum: + - today + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - last12months + - lastyear + - currentyear + - beginning + - custom + in: query + name: timeFrame + required: true + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'If using "yesterday" or "today" timeframe you can ask for the hourly detail' + in: query + name: hourly + required: false + type: boolean + - description: '' + in: query + name: onlyFavorites + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve statistics about this customer for a timeframe + tags: + - Aggregated + /aggregated/list: + get: + consumes: [] + deprecated: false + parameters: + - description: Timeframe of the request. See list at $timeframeList + enum: + - today + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - last12months + - lastyear + - currentyear + - beginning + - custom + in: query + name: timeFrame + required: true + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'The temporal entity you want to group by ("week"/"month"). If unspecified is "day".' + enum: + - week + - month + in: query + name: groupBy + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve statistics about this customer for a timeframe grouped by some temporal entity (day/week/month) + tags: + - Aggregated + /aggregated/summary/conversions: + get: + consumes: [] + deprecated: false + parameters: + - description: Timeframe of the request. See list at $timeframeList + enum: + - today + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - last12months + - lastyear + - currentyear + - beginning + - custom + in: query + name: timeFrame + required: true + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'Status of conversion ("deleted"/"active")' + enum: + - deleted + - active + in: query + name: status + required: false + type: string + - description: Field to sort by + in: query + name: sortBy + required: false + type: string + - description: 'Direction of sort "asc" or "desc"' + enum: + - asc + - desc + in: query + name: sortDirection + required: false + type: string + - description: Offset where to start from + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - description: Limit results to this number + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedSummaryResult' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve statistics about a subset of conversions for a timeframe with conversions data + tags: + - Aggregated + /aggregated/summary/datapoints: + get: + consumes: [] + deprecated: false + parameters: + - description: Timeframe of the request. See list at $timeframeList + enum: + - today + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - last12months + - lastyear + - currentyear + - beginning + - custom + in: query + name: timeFrame + required: true + type: string + - description: 'Type of datapoint ("tl"/"tp")' + enum: + - tp + - tl + in: query + name: type + required: true + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'Status of datapoint ("deleted"/"active"/"paused"/"spam")' + enum: + - deleted + - active + - paused + - spam + in: query + name: status + required: false + type: string + - description: A comma separated list of tags you want to filter with. + in: query + name: tag + required: false + type: string + - description: Is the datapoint marked as favourite + in: query + name: favourite + required: false + type: boolean + - description: Field to sort by + in: query + name: sortBy + required: false + type: string + - description: 'Direction of sort "asc" or "desc"' + enum: + - asc + - desc + in: query + name: sortDirection + required: false + type: string + - description: Offset where to start from + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - description: Limit results to this number + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: Filter by this group id + format: int64 + in: query + name: groupId + required: false + type: integer + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedSummaryResult' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve statistics about a subset of datapoints for a timeframe with datapoints data + tags: + - Aggregated + /aggregated/summary/groups: + get: + consumes: [] + deprecated: false + parameters: + - description: Timeframe of the request. See list at $timeframeList + enum: + - today + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - last12months + - lastyear + - currentyear + - beginning + - custom + in: query + name: timeFrame + required: true + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'Status of group ("deleted"/"active")' + enum: + - deleted + - active + in: query + name: status + required: false + type: string + - description: A comma separated list of tags you want to filter with. + in: query + name: tag + required: false + type: string + - description: Is the group marked as favourite + in: query + name: favourite + required: false + type: boolean + - description: Field to sort by + in: query + name: sortBy + required: false + type: string + - description: 'Direction of sort "asc" or "desc"' + enum: + - asc + - desc + in: query + name: sortDirection + required: false + type: string + - description: Offset where to start from + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - description: Limit results to this number + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedSummaryResult' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve statistics about a subset of groups for a timeframe with groups data + tags: + - Aggregated + /clickstream: + get: + consumes: [] + deprecated: false + parameters: + - description: 'Filter by this group id (mutually exclusive with "datapoint" and "conversion")' + format: int64 + in: query + name: group + required: false + type: integer + - description: 'Filter by this datapoint id (mutually exclusive with "group" and "conversion")' + format: int64 + in: query + name: datapoint + required: false + type: integer + - description: 'Filter by this conversion id (mutually exclusive with "datapoint" and "group")' + format: int64 + in: query + name: conversion + required: false + type: integer + - default: 50 + description: Limit results to this number + format: int32 + in: query + name: pageSize + required: false + type: integer + - description: 'Filter event type ("spiders"/"uniques"/"nonuniques"/"conversions")' + enum: + - '' + - spiders + - uniques + - nonuniques + - conversions + in: query + name: filter + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.ClickStream.Hit]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve the latest list of events of this account. Limited to last 100. + tags: + - ClickStream + /conversions: + get: + consumes: [] + deprecated: false + parameters: + - description: Offset where to start from + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - description: Limit results to this number + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: 'Status of conversion ("deleted"/"active")' + enum: + - deleted + - active + in: query + name: status + required: false + type: string + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + - description: Exclude conversions created before this date (YYYYMMDD) + in: query + name: createdAfter + required: false + type: string + - description: Exclude conversions created after this date (YYYYMMDD) + in: query + name: createdBefore + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve a list of conversions + tags: + - Conversions + post: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: The body of the conversion + in: body + name: value + required: true + schema: + $ref: '#/definitions/Api.Core.Dto.Conversions.Conversion' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Create a conversion + tags: + - Conversions + /conversions/aggregated/list: + get: + consumes: [] + deprecated: false + parameters: + - description: Timeframe of the request. See list at $timeframeList + enum: + - today + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - last12months + - lastyear + - currentyear + - beginning + - custom + in: query + name: timeFrame + required: true + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'Status of conversion ("deleted"/"active")' + enum: + - deleted + - active + in: query + name: status + required: false + type: string + - description: 'The temporal entity you want to group by ("week"/"month"). If unspecified is "day".' + enum: + - week + - month + in: query + name: groupBy + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve statistics about this customer for a timeframe related to a subset of conversions grouped by some temporal entity (day/week/month) + tags: + - Conversions + /conversions/count: + get: + consumes: [] + deprecated: false + parameters: + - description: 'Status of conversion ("deleted"/"active")' + enum: + - deleted + - active + in: query + name: status + required: false + type: string + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + - description: Exclude conversions created before this date (YYYYMMDD) + in: query + name: createdAfter + required: false + type: string + - description: Exclude conversions created after this date (YYYYMMDD) + in: query + name: createdBefore + required: false + type: string + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.CountResponce' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve a count of conversions + tags: + - Conversions + '/conversions/{conversionId}': + delete: + consumes: [] + deprecated: false + parameters: + - description: Id of the conversion + format: int64 + in: path + name: conversionId + required: true + type: integer + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Delete conversion specified by id + tags: + - Conversions + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the conversion + format: int64 + in: path + name: conversionId + required: true + type: integer + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Conversions.Conversion' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Retrieve conversion specified by id + tags: + - Conversions + post: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: Id of the conversion + format: int64 + in: path + name: conversionId + required: true + type: integer + - description: Updated body of the conversion + in: body + name: value + required: true + schema: + $ref: '#/definitions/Api.Core.Dto.Conversions.Conversion' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Update conversion specified by id + tags: + - Conversions + '/conversions/{conversionId}/aggregated': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the conversion + format: int64 + in: path + name: conversionId + required: true + type: integer + - description: Timeframe of the request. See list at $timeframeList + enum: + - today + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - last12months + - lastyear + - currentyear + - beginning + - custom + in: query + name: timeFrame + required: true + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: Filter by this tag name + in: query + name: tag + required: false + type: string + - description: Is the datapoint marked as favourite + in: query + name: favourite + required: false + type: boolean + - description: 'If using "yesterday" or "today" timeframe you can ask for the hourly detail' + in: query + name: hourly + required: false + type: boolean + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve statistics about this conversion for a timeframe + tags: + - Conversions + '/conversions/{conversionId}/aggregated/list': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the conversion + format: int64 + in: path + name: conversionId + required: true + type: integer + - description: Timeframe of the request. See list at $timeframeList + enum: + - today + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - last12months + - lastyear + - currentyear + - beginning + - custom + in: query + name: timeFrame + required: true + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'The temporal entity you want to group by ("week"/"month"). If unspecified is "day".' + enum: + - week + - month + in: query + name: groupBy + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve statistics about this conversion for a timeframe grouped by some temporal entity (day/week/month) + tags: + - Conversions + '/conversions/{conversionId}/datapoints': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the conversion + format: int64 + in: path + name: conversionId + required: true + type: integer + - description: Offset where to start from + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - description: Limit results to this number + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: 'Type of datapoint ("tl"/"tp")' + enum: + - tp + - tl + in: query + name: type + required: false + type: string + - description: 'Status of datapoint ("deleted"/"active"/"paused"/"spam")' + enum: + - deleted + - active + - paused + - spam + in: query + name: status + required: false + type: string + - description: Filter by this tag name + in: query + name: tags + required: false + type: string + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + - description: Exclude datapoints created before this date (YYYYMMDD) + in: query + name: createdAfter + required: false + type: string + - description: Exclude datapoints created after this date (YYYYMMDD) + in: query + name: createdBefore + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve a list of datapoints connected to this conversion + tags: + - Conversions + '/conversions/{conversionId}/datapoints/batch/patch': + put: + consumes: + - application/json + - text/json + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: Id of the conversion + format: int64 + in: path + name: conversionId + required: true + type: integer + - description: Patch requests + in: body + name: data + required: true + schema: + $ref: '#/definitions/Api.Core.Requests.PatchBodyBatch' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Modify the association between a conversion and multiple datapoints + tags: + - Conversions + '/conversions/{conversionId}/datapoints/count': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the conversion + format: int64 + in: path + name: conversionId + required: true + type: integer + - description: 'Type of datapoint ("tl"/"tp")' + in: query + name: type + required: false + type: string + - description: 'Status of datapoint ("deleted"/"active"/"paused"/"spam")' + in: query + name: status + required: false + type: string + - description: Filter by this tag name + in: query + name: tags + required: false + type: string + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + - description: Exclude datapoints created before this date (YYYYMMDD) + in: query + name: createdAfter + required: false + type: string + - description: Exclude datapoints created after this date (YYYYMMDD) + in: query + name: createdBefore + required: false + type: string + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.CountResponce' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve a count of datapoints connected to this conversion + tags: + - Conversions + '/conversions/{conversionId}/datapoints/patch': + put: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: Id of the conversion + format: int64 + in: path + name: conversionId + required: true + type: integer + - description: Patch request + in: body + name: data + required: true + schema: + $ref: '#/definitions/Api.Core.Requests.ConversionPatchBody' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Modify the association between a conversion and a datapoint + tags: + - Conversions + '/conversions/{conversionId}/hits': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the conversion + format: int64 + in: path + name: conversionId + required: true + type: integer + - description: Timeframe of the request. See list at $timeframeList + enum: + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - custom + in: query + name: timeframe + required: true + type: string + - description: Limit results to this number + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: "Offset where to start from (it's the lastKey field in the response object)" + in: query + name: offset + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'Filter event type ("spiders"/"uniques"/"nonuniques"/"conversions")' + enum: + - spiders + - uniques + - nonuniques + - conversions + in: query + name: filter + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.ClickStream.HitListPage' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve the list of events related to this conversion. + tags: + - Conversions + '/conversions/{conversionId}/notes': + put: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: Id of the conversion + format: int64 + in: path + name: conversionId + required: true + type: integer + - description: Patch requests + in: body + name: note + required: true + schema: + $ref: '#/definitions/Api.Core.Requests.GenericTextPatch' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not found + '500': + description: Internal Server Error + summary: 'Fast patch the "notes" field of a conversion' + tags: + - Conversions + '/conversions/{conversionId}/reports': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the conversion + format: int64 + in: path + name: conversionId + required: true + type: integer + - description: Type of the report. + enum: + - datapoints + - groups + - browsers + - browsersfamilies + - platforms + - cities + - countries + - keywords + - referrers + - convparameters + - destinations + - languages + - params + in: query + name: type + required: true + type: string + - description: Timeframe of the request. See list at $timeframeList + enum: + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - beginning + - custom + in: query + name: timeframe + required: true + type: string + - description: Type of the event you want to filter this report with. By default no filter is applied. + enum: + - clicks + - views + in: query + name: hittype + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Tops.Top' + '401': + description: Forbidden + '404': + description: Not found + '500': + description: Internal Server Error + summary: Retrieve a top report connected to this conversion + tags: + - Conversions + /datapoints: + get: + consumes: [] + deprecated: false + parameters: + - default: 0 + description: Where to start when retrieving elements. Default is 0 if not specified. + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - default: 20 + description: Maximum elements to retrieve. Default to 20 if not specified. + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: 'Type of the datapoint ("tp"/"tl")' + enum: + - tp + - tl + in: query + name: type + required: false + type: string + - description: Status of the datapoint + enum: + - deleted + - active + - paused + - spam + in: query + name: status + required: false + type: string + - description: A comma separated list of tags you want to filter with. + in: query + name: tags + required: false + type: string + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + - description: Filter fields by favourite status + in: query + name: onlyFavorites + required: false + type: boolean + - description: Field to sort by + in: query + name: sortBy + required: false + type: string + - description: 'Direction of sort "asc" or "desc"' + enum: + - asc + - desc + in: query + name: sortDirection + required: false + type: string + - description: Exclude datapoints created before this date (YYYYMMDD) + in: query + name: createdAfter + required: false + type: string + - description: Exclude datapoints created after this date (YYYYMMDD) + in: query + name: createdBefore + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: List of all the datapoints associated to the user + tags: + - DataPoints + post: + consumes: + - application/json + - text/json + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: The body of the datapoint + in: body + name: value + required: true + schema: + $ref: '#/definitions/Api.Core.Dto.Datapoints.Datapoint' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Create a datapoint + tags: + - DataPoints + /datapoints/aggregated: + get: + consumes: [] + deprecated: false + parameters: + - description: Timeframe of the request. See list at $timeframeList + enum: + - today + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - last12months + - lastyear + - currentyear + - beginning + - custom + in: query + name: timeFrame + required: true + type: string + - description: 'Type of datapoint ("tl"/"tp")' + enum: + - tp + - tl + in: query + name: type + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'If using "yesterday" or "today" timeframe you can ask for the hourly detail' + in: query + name: hourly + required: false + type: boolean + - description: 'Status of datapoint ("deleted"/"active"/"paused"/"spam")' + enum: + - deleted + - active + - paused + - spam + in: query + name: status + required: false + type: string + - description: A comma separated list of tags you want to filter with. + in: query + name: tag + required: false + type: string + - description: Is the datapoint is marked as favourite + in: query + name: favourite + required: false + type: boolean + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve statistics about this customer for a timeframe by groups + tags: + - DataPoints + /datapoints/aggregated/list: + get: + consumes: [] + deprecated: false + parameters: + - description: 'Type of datapoint ("tl"/"tp")' + enum: + - tp + - tl + in: query + name: type + required: true + type: string + - description: Timeframe of the request. See list at $timeframeList + enum: + - today + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - last12months + - lastyear + - currentyear + - beginning + - custom + in: query + name: timeFrame + required: true + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'Status of datapoint ("deleted"/"active"/"paused"/"spam")' + enum: + - deleted + - active + - paused + - spam + in: query + name: status + required: false + type: string + - description: A comma separated list of tags you want to filter with. + in: query + name: tag + required: false + type: string + - description: Is the datapoint is marked as favourite + in: query + name: favourite + required: false + type: boolean + - description: 'The temporal entity you want to group by ("week"/"month"). If unspecified is "day".' + enum: + - week + - month + in: query + name: groupBy + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve statistics about all datapoints of this customer for a timeframe grouped by some temporal entity (day/week/month) + tags: + - DataPoints + /datapoints/batch: + delete: + consumes: + - application/json + - text/json + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: A json containing the datapoints to delete. + in: body + name: batch + required: true + schema: + $ref: '#/definitions/Api.Core.Requests.DeleteBatch' + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.ModifyBatchItemResponce[Api.Core.Dto.Datapoints.Datapoint,System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Delete multiple datapoints + tags: + - DataPoints + post: + consumes: + - application/json + - text/json + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: A json containing the datapoints to update. + in: body + name: batch + required: true + schema: + $ref: '#/definitions/Api.Core.Requests.DatapointsBatch' + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.ModifyBatchItemResponce[Api.Core.Dto.Datapoints.Datapoint,System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Update multiple datapoints + tags: + - DataPoints + put: + consumes: + - application/json + - text/json + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: A json containing the datapoints to create. + in: body + name: batch + required: true + schema: + $ref: '#/definitions/Api.Core.Requests.DatapointsBatch' + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.ModifyBatchItemResponce[Api.Core.Dto.Datapoints.Datapoint,System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Create multiple datapoints + tags: + - DataPoints + /datapoints/count: + get: + consumes: [] + deprecated: false + parameters: + - description: 'Type of the datapoint ("tp"/"tl")' + enum: + - tp + - tl + in: query + name: type + required: false + type: string + - description: Status of the datapoint + enum: + - deleted + - active + - paused + - spam + in: query + name: status + required: false + type: string + - description: A comma separated list of tags you want to filter with. + in: query + name: tags + required: false + type: string + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + - description: Filter fields by favourite status + in: query + name: onlyFavorites + required: false + type: boolean + - description: Exclude datapoints created before this date (YYYYMMDD) + in: query + name: createdAfter + required: false + type: string + - description: Exclude datapoints created after this date (YYYYMMDD) + in: query + name: createdBefore + required: false + type: string + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.CountResponce' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Count the datapoints associated to the user + tags: + - DataPoints + '/datapoints/{id}': + delete: + consumes: [] + deprecated: false + parameters: + - description: The id of the datapoint + format: int64 + in: path + name: id + required: true + type: integer + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Delete a datapoint + tags: + - DataPoints + get: + consumes: [] + deprecated: false + parameters: + - description: The id of the datapoint + format: int64 + in: path + name: id + required: true + type: integer + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Datapoints.Datapoint' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Get a datapoint + tags: + - DataPoints + post: + consumes: + - application/json + - text/json + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: The id of the datapoint + format: int64 + in: path + name: id + required: true + type: integer + - description: The body of the datapoint + in: body + name: value + required: true + schema: + $ref: '#/definitions/Api.Core.Dto.Datapoints.Datapoint' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Update a datapoint + tags: + - DataPoints + '/datapoints/{id}/aggregated': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the datapoint + format: int64 + in: path + name: id + required: true + type: integer + - description: Timeframe of the request. See list at $timeframeList + enum: + - today + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - last12months + - lastyear + - currentyear + - beginning + - custom + in: query + name: timeFrame + required: true + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'If using "yesterday" or "today" timeframe you can ask for the hourly detail' + in: query + name: hourly + required: false + type: boolean + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve statistics about this datapoint for a timeframe + tags: + - DataPoints + '/datapoints/{id}/aggregated/list': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the datapoint + format: int64 + in: path + name: id + required: true + type: integer + - description: Timeframe of the request. See list at $timeframeList + enum: + - today + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - last12months + - lastyear + - currentyear + - beginning + - custom + in: query + name: timeFrame + required: true + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'The temporal entity you want to group by ("week"/"month"). If unspecified is "day".' + enum: + - week + - month + in: query + name: groupBy + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve statistics about this datapoint for a timeframe grouped by some temporal entity (day/week/month) + tags: + - DataPoints + '/datapoints/{id}/favourite': + put: + consumes: [] + deprecated: false + parameters: + - description: Id of the datapoint + format: int64 + in: path + name: id + required: true + type: integer + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not found + '500': + description: Internal Server Error + summary: 'Fast switch the "favourite" field of a datapoint' + tags: + - DataPoints + '/datapoints/{id}/hits': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the datapoint + format: int64 + in: path + name: id + required: true + type: integer + - description: Timeframe of the request. See list at $timeframeList + enum: + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - custom + in: query + name: timeframe + required: true + type: string + - description: Limit results to this number + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: "Offset where to start from (it's the lastKey field in the response object)" + in: query + name: offset + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'Filter event type ("spiders"/"uniques"/"nonuniques"/"conversions")' + enum: + - spiders + - uniques + - nonuniques + - conversions + in: query + name: filter + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.ClickStream.HitListPage' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve the list of events related to this datapoint. + tags: + - DataPoints + '/datapoints/{id}/notes': + put: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: Id of the datapoint + format: int64 + in: path + name: id + required: true + type: integer + - description: Patch requests + in: body + name: note + required: true + schema: + $ref: '#/definitions/Api.Core.Requests.GenericTextPatch' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not found + '500': + description: Internal Server Error + summary: 'Fast patch the "notes" field of a datapoint' + tags: + - DataPoints + '/datapoints/{id}/reports': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the datapoint + format: int64 + in: path + name: id + required: true + type: integer + - description: Type of the report. + enum: + - browsers + - browsersfamilies + - platforms + - cities + - countries + - isps + - ips + - oss + - ossfamilies + - keywords + - referrers + - destinations + - languages + - params + in: query + name: type + required: true + type: string + - description: Timeframe of the request. See list at $timeframeList + enum: + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - beginning + - custom + in: query + name: timeframe + required: true + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Tops.Top' + '401': + description: Forbidden + '404': + description: Not found + '500': + description: Internal Server Error + summary: Retrieve a top report connected to this datapoint + tags: + - DataPoints + /domains: + get: + consumes: [] + deprecated: false + parameters: + - description: Offset where to start from + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - description: Limit results to this number + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - default: system + description: 'Type of domain ("system"/"go"/"personal"/"dedicated"). If not specified default is "system"' + enum: + - system + - go + - personal + - dedicated + in: query + name: type + required: false + type: string + - description: Filter domains with this anmen + in: query + name: name + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve a list of domains + tags: + - Domains + post: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: The domain to create + in: body + name: value + required: true + schema: + $ref: '#/definitions/Api.Core.Dto.Domains.Domain' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Create a domain + tags: + - Domains + /domains/count: + get: + consumes: [] + deprecated: false + parameters: + - default: system + description: 'Type of domain ("system"/"go"/"personal"/"dedicated"). If not specified default is "system"' + enum: + - system + - go + - personal + - dedicated + in: query + name: type + required: false + type: string + - description: Filter domains with this anmen + in: query + name: name + required: false + type: string + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.CountResponce' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve count of domains + tags: + - Domains + '/domains/{id}': + delete: + consumes: [] + deprecated: false + parameters: + - description: Id of domain + format: int64 + in: path + name: id + required: true + type: integer + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Delete a domain + tags: + - Domains + get: + consumes: [] + deprecated: false + parameters: + - description: Id of domain + format: int64 + in: path + name: id + required: true + type: integer + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Domains.Domain' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Get a domain + tags: + - Domains + post: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: Id of domain + format: int64 + in: path + name: id + required: true + type: integer + - description: The domain to update + in: body + name: value + required: true + schema: + $ref: '#/definitions/Api.Core.Dto.Domains.Domain' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Update a domain + tags: + - Domains + /groups: + get: + consumes: [] + deprecated: false + parameters: + - default: 0 + description: Where to start when retrieving elements. Default is 0 if not specified. + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - default: 20 + description: Maximum elements to retrieve. Default to 20 if not specified. + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: Status of the group + enum: + - deleted + - active + in: query + name: status + required: false + type: string + - description: A comma separated list of tags you want to filter with. + in: query + name: tags + required: false + type: string + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + - description: Exclude groups created before this date (YYYYMMDD) + in: query + name: createdAfter + required: false + type: string + - description: Exclude groups created after this date (YYYYMMDD) + in: query + name: createdBefore + required: false + type: string + - description: Write permission + in: query + name: write + required: false + type: boolean + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: List of all the groups associated to the user. + tags: + - Groups + post: + consumes: + - application/json + - text/json + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: The body of the group + in: body + name: value + required: true + schema: + $ref: '#/definitions/Api.Core.Dto.Groups.Group' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Create a group + tags: + - Groups + /groups/aggregated: + get: + consumes: [] + deprecated: false + parameters: + - description: Timeframe of the request. See list at $timeframeList + enum: + - today + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - last12months + - lastyear + - currentyear + - beginning + - custom + in: query + name: timeFrame + required: true + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'If using "yesterday" or "today" timeframe you can ask for the hourly detail' + in: query + name: hourly + required: false + type: boolean + - description: 'Status of group ("deleted"/"active")' + enum: + - deleted + - active + in: query + name: status + required: false + type: string + - description: A comma separated list of tags you want to filter with. + in: query + name: tag + required: false + type: string + - description: Is the group is marked as favourite + in: query + name: favourite + required: false + type: boolean + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve statistics about this customer for a timeframe by groups + tags: + - Groups + /groups/aggregated/list: + get: + consumes: [] + deprecated: false + parameters: + - description: Timeframe of the request. See list at $timeframeList + enum: + - today + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - last12months + - lastyear + - currentyear + - beginning + - custom + in: query + name: timeFrame + required: true + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'Status of group ("deleted"/"active")' + in: query + name: status + required: false + type: string + - description: A comma separated list of tags you want to filter with. + in: query + name: tag + required: false + type: string + - description: Is the group is marked as favourite + in: query + name: favourite + required: false + type: boolean + - description: 'The temporal entity you want to group by ("week"/"month"). If unspecified is "day".' + enum: + - deleted + - active + in: query + name: groupBy + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve statistics about all groups of this customer for a timeframe grouped by some temporal entity (day/week/month) + tags: + - Groups + /groups/count: + get: + consumes: [] + deprecated: false + parameters: + - description: Status of the datapoint + enum: + - deleted + - active + in: query + name: status + required: false + type: string + - description: A comma separated list of tags you want to filter with. + in: query + name: tags + required: false + type: string + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + - description: Exclude groups created before this date (YYYYMMDD) + in: query + name: createdAfter + required: false + type: string + - description: Exclude groups created after this date (YYYYMMDD) + in: query + name: createdBefore + required: false + type: string + - description: Write permission + in: query + name: write + required: false + type: boolean + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.CountResponce' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Count the groups associated to the user. + tags: + - Groups + '/groups/{id}': + delete: + consumes: [] + deprecated: false + parameters: + - description: Id of the group + format: int64 + in: path + name: id + required: true + type: integer + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Delete group specified by id + tags: + - Groups + get: + consumes: [] + deprecated: false + parameters: + - description: The id of the group + format: int64 + in: path + name: id + required: true + type: integer + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Groups.Group' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Get a group + tags: + - Groups + post: + consumes: + - application/json + - text/json + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: The id of the group + format: int64 + in: path + name: id + required: true + type: integer + - description: The body of the group + in: body + name: value + required: true + schema: + $ref: '#/definitions/Api.Core.Dto.Groups.Group' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Update a group + tags: + - Groups + '/groups/{id}/aggregated': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the group + format: int64 + in: path + name: id + required: true + type: integer + - description: Timeframe of the request. See list at $timeframeList + enum: + - today + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - last12months + - lastyear + - currentyear + - beginning + - custom + in: query + name: timeFrame + required: true + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'If using "yesterday" or "today" timeframe you can ask for the hourly detail' + in: query + name: hourly + required: false + type: boolean + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve statistics about this group for a timeframe + tags: + - Groups + '/groups/{id}/aggregated/list': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the group + format: int64 + in: path + name: id + required: true + type: integer + - description: Timeframe of the request. See list at $timeframeList + enum: + - today + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - last12months + - lastyear + - currentyear + - beginning + - custom + in: query + name: timeFrame + required: true + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'The temporal entity you want to group by ("week"/"month"). If unspecified is "day".' + enum: + - week + - month + in: query + name: groupBy + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve statistics about this group for a timeframe grouped by some temporal entity (day/week/month) + tags: + - Groups + '/groups/{id}/aggregated/summary': + get: + consumes: [] + deprecated: false + parameters: + - description: Filter by this group id + format: int64 + in: path + name: id + required: true + type: integer + - description: Timeframe of the request. See list at $timeframeList + enum: + - today + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - last12months + - lastyear + - currentyear + - beginning + - custom + in: query + name: timeFrame + required: true + type: string + - description: 'Type of datapoint ("tl"/"tp")' + enum: + - tp + - tl + in: query + name: type + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'Status of datapoint ("deleted"/"active"/"paused"/"spam")' + enum: + - deleted + - active + in: query + name: status + required: false + type: string + - description: A comma separated list of tags you want to filter with. + in: query + name: tag + required: false + type: string + - description: Is the datapoint marked as favourite + in: query + name: favourite + required: false + type: boolean + - description: Field to sort by + in: query + name: sortBy + required: false + type: string + - description: 'Direction of sort "asc" or "desc"' + enum: + - asc + - desc + in: query + name: sortDirection + required: false + type: string + - default: 0 + description: Offset where to start from + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - default: 20 + description: Limit results to this number + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedSummaryResult' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve statistics about a subset of datapoints for a timeframe with datapoints data + tags: + - Groups + '/groups/{id}/datapoints': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the group + format: int64 + in: path + name: id + required: true + type: integer + - default: 0 + description: Where to start when retrieving elements. Default is 0 if not specified. + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - default: 20 + description: Maximum elements to retrieve. Default to 20 if not specified. + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: 'Type of the datapoint ("tp"/"tl")' + enum: + - tp + - tl + in: query + name: type + required: false + type: string + - description: Status of the datapoint + enum: + - deleted + - active + - paused + - spam + in: query + name: status + required: false + type: string + - description: A comma separated list of tags you want to filter with. + in: query + name: tags + required: false + type: string + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + - description: Filter fields by favourite status + in: query + name: onlyFavorites + required: false + type: boolean + - description: Field to sort by + in: query + name: sortBy + required: false + type: string + - description: 'Direction of sort "asc" or "desc"' + enum: + - asc + - desc + in: query + name: sortDirection + required: false + type: string + - description: Exclude datapoints created before this date (YYYYMMDD) + in: query + name: createdAfter + required: false + type: string + - description: Exclude datapoints created after this date (YYYYMMDD) + in: query + name: createdBefore + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: List of all the datapoints associated to the user in this group. + tags: + - Groups + post: + consumes: + - application/json + - text/json + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: The id of the group + format: int64 + in: path + name: id + required: true + type: integer + - description: The body of the datapoint + in: body + name: value + required: true + schema: + $ref: '#/definitions/Api.Core.Dto.Datapoints.Datapoint' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Create a datapoint in this group + tags: + - Groups + '/groups/{id}/datapoints/count': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the group + format: int64 + in: path + name: id + required: true + type: integer + - description: 'Type of the datapoint ("tp"/"tl")' + enum: + - tp + - tl + in: query + name: type + required: false + type: string + - description: Status of the datapoint + enum: + - deleted + - active + - paused + - spam + in: query + name: status + required: false + type: string + - description: A comma separated list of tags you want to filter with. + in: query + name: tags + required: false + type: string + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + - description: Filter fields by favourite status + in: query + name: onlyFavorites + required: false + type: boolean + - description: Exclude datapoints created before this date (YYYYMMDD) + in: query + name: createdAfter + required: false + type: string + - description: Exclude datapoints created after this date (YYYYMMDD) + in: query + name: createdBefore + required: false + type: string + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.CountResponce' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Count the datapoints associated to the user in this group. + tags: + - Groups + '/groups/{id}/favourite': + put: + consumes: [] + deprecated: false + parameters: + - description: Id of the group + format: int64 + in: path + name: id + required: true + type: integer + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not found + '500': + description: Internal Server Error + summary: 'Fast switch the "favourite" field of a group' + tags: + - Groups + '/groups/{id}/hits': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the group + format: int64 + in: path + name: id + required: true + type: integer + - description: Timeframe of the request. See list at $timeframeList + enum: + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - custom + in: query + name: timeframe + required: true + type: string + - description: Limit results to this number + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: "Offset where to start from (it's the lastKey field in the response object)" + in: query + name: offset + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'Filter event type ("spiders"/"uniques"/"nonuniques"/"conversions")' + enum: + - spiders + - uniques + - nonuniques + - conversions + in: query + name: filter + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.ClickStream.HitListPage' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve the list of events related to this group. + tags: + - Groups + '/groups/{id}/notes': + put: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: Id of the group + format: int64 + in: path + name: id + required: true + type: integer + - description: Patch requests + in: body + name: note + required: true + schema: + $ref: '#/definitions/Api.Core.Requests.GenericTextPatch' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not found + '500': + description: Internal Server Error + summary: 'Fast patch the "notes" field of a group' + tags: + - Groups + '/groups/{id}/reports': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the group + format: int64 + in: path + name: id + required: true + type: integer + - description: Type of the report. + enum: + - browsers + - browsersfamilies + - platforms + - cities + - countries + - isps + - ips + - oss + - ossfamilies + - keywords + - referrers + - destinations + - languages + - params + in: query + name: type + required: true + type: string + - description: Timeframe of the request. See list at $timeframeList + enum: + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - beginning + - custom + in: query + name: timeframe + required: true + type: string + - description: Type of the event you want to filter this report with. By default no filter is applied. + enum: + - clicks + - views + in: query + name: hittype + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Tops.Top' + '401': + description: Forbidden + '404': + description: Not found + '500': + description: Internal Server Error + summary: Retrieve a top report connected to this group + tags: + - Groups + /hits: + get: + consumes: [] + deprecated: false + parameters: + - description: Timeframe of the request. See list at $timeframeList + enum: + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - custom + in: query + name: timeframe + required: true + type: string + - description: Limit results to this number + format: int32 + in: query + name: limit + required: false + type: integer + - description: "Offset where to start from (it's the lastKey field in the response object)" + in: query + name: offset + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + - description: 'Filter event type ("spiders"/"uniques"/"nonuniques"/"conversions")' + enum: + - spiders + - uniques + - nonuniques + - conversions + in: query + name: filter + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.ClickStream.HitListPage' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve the list of events related to this account. + tags: + - Hits + /me: + get: + consumes: [] + deprecated: false + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Accounting.User' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve current account data + tags: + - Me + /me/plan: + get: + consumes: [] + deprecated: false + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Accounting.Plan' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve current account plan + tags: + - Me + /reports: + get: + consumes: [] + deprecated: false + parameters: + - description: Type of the report. + enum: + - browsers + - browsersfamilies + - platforms + - cities + - countries + - isps + - ips + - oss + - ossfamilies + - keywords + - referrers + - destinations + - languages + - params + in: query + name: type + required: true + type: string + - description: Timeframe of the request. See list at $timeframeList + enum: + - yesterday + - last7 + - last30 + - lastmonth + - currentmonth + - previousmonth + - last90 + - last120 + - last180 + - beginning + - custom + in: query + name: timeframe + required: true + type: string + - description: Type of the event you want to filter this report with. By default no filter is applied. + in: query + name: hittype + required: false + type: string + - description: 'Filter by this group id (mutually exclusive with "datapoint" and "conversion")' + format: int64 + in: query + name: group + required: false + type: integer + - description: 'Filter by this datapoint id (mutually exclusive with "group" and "conversion")' + format: int64 + in: query + name: datapoint + required: false + type: integer + - description: 'Filter by this conversion id (mutually exclusive with "datapoint" and "group")' + format: int64 + in: query + name: conversion + required: false + type: integer + - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' + in: query + name: fromDay + required: false + type: string + - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' + in: query + name: toDay + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Tops.Top' + '401': + description: Forbidden + '404': + description: Not found + '500': + description: Internal Server Error + summary: Retrieve a top report + tags: + - Reports + /retargeting: + get: + consumes: [] + deprecated: false + parameters: + - default: 0 + description: Where to start when retrieving elements. Default is 0 if not specified. + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - default: 20 + description: Maximum elements to retrieve. Default to 20 if not specified. + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: List of all the retargeting scripts associated to the user + tags: + - Retargeting + post: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: The body of the retargeting script + in: body + name: value + required: true + schema: + $ref: '#/definitions/Api.Core.Dto.Retargeting.RetargetingScript' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Creates a retargeting script + tags: + - Retargeting + /retargeting/count: + get: + consumes: [] + deprecated: false + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.CountResponce' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve count of retargeting scripts + tags: + - Retargeting + '/retargeting/{id}': + delete: + consumes: [] + deprecated: false + parameters: + - description: The id of the retargeting script + format: int64 + in: path + name: id + required: true + type: integer + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Deletes a retargeting script (and remove associations) + tags: + - Retargeting + get: + consumes: [] + deprecated: false + parameters: + - description: The id of the retargeting script + format: int64 + in: path + name: id + required: true + type: integer + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Retargeting.RetargetingScript' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Get a retargeting script object + tags: + - Retargeting + post: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: The id of the retargeting script + format: int64 + in: path + name: id + required: true + type: integer + - description: The body of the retargeting script + in: body + name: value + required: true + schema: + $ref: '#/definitions/Api.Core.Dto.Retargeting.RetargetingScript' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Updates a retargeting script + tags: + - Retargeting + '/retargeting/{id}/datapoints': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the retargeting script + format: int64 + in: path + name: id + required: true + type: integer + - default: 0 + description: Where to start when retrieving elements. Default is 0 if not specified. + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - default: 20 + description: Maximum elements to retrieve. Default to 20 if not specified. + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: Status of the datapoint + enum: + - deleted + - active + - paused + - spam + in: query + name: status + required: false + type: string + - description: A comma separated list of tags you want to filter with. + in: query + name: tags + required: false + type: string + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + - description: Filter fields by favourite status + in: query + name: onlyFavorites + required: false + type: boolean + - description: Field to sort by + in: query + name: sortBy + required: false + type: string + - description: 'Direction of sort "asc" or "desc"' + enum: + - asc + - desc + in: query + name: sortDirection + required: false + type: string + - description: Exclude datapoints created before this date (YYYYMMDD) + in: query + name: createdAfter + required: false + type: string + - description: Exclude datapoints created after this date (YYYYMMDD) + in: query + name: createdBefore + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: List of all the datapoints associated to the retargeting script. + tags: + - Retargeting + '/retargeting/{id}/datapoints/count': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the group + format: int64 + in: path + name: id + required: true + type: integer + - description: Status of the datapoint + enum: + - deleted + - active + - paused + - spam + in: query + name: status + required: false + type: string + - description: A comma separated list of tags you want to filter with. + in: query + name: tags + required: false + type: string + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + - description: Filter fields by favourite status + in: query + name: onlyFavorites + required: false + type: boolean + - description: Exclude datapoints created before this date (YYYYMMDD) + in: query + name: createdAfter + required: false + type: string + - description: Exclude datapoints created after this date (YYYYMMDD) + in: query + name: createdBefore + required: false + type: string + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.CountResponce' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Count the datapoints associated to the retargeting script. + tags: + - Retargeting + /tags: + get: + consumes: [] + deprecated: false + parameters: + - default: 0 + description: Where to start when retrieving elements. Default is 0 if not specified. + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - default: 20 + description: Maximum elements to retrieve. Default to 20 if not specified. + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: Name of the tag + in: query + name: name + required: false + type: string + - description: Comma separated list of datapoints id to filter by + in: query + name: datapoints + required: false + type: string + - description: Comma separated list of groups id to filter by + in: query + name: groups + required: false + type: string + - description: Type of entity related to the tag + enum: + - tp + - tl + - dp + - gr + in: query + name: type + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: List of all the groups associated to the user filtered by this tag. + tags: + - Tags + post: + consumes: + - application/json + - text/json + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: The body of the tag + in: body + name: value + required: true + schema: + $ref: '#/definitions/Api.Core.Dto.Tags.Tag' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Create a tag + tags: + - Tags + /tags/count: + get: + consumes: [] + deprecated: false + parameters: + - description: Name of the tag + in: query + name: name + required: false + type: string + - description: Comma separated list of datapoints id to filter by + in: query + name: datapoints + required: false + type: string + - description: Comma separated list of groups id to filter by + in: query + name: groups + required: false + type: string + - description: Type of entity related to the tag + enum: + - tp + - tl + - dp + - gr + in: query + name: type + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/System.Object' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: List of all the groups associated to the user filtered by this tag. + tags: + - Tags + '/tags/{tagId}': + delete: + consumes: [] + deprecated: false + parameters: + - description: Id of the tag + format: int64 + in: path + name: tagId + required: true + type: integer + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/System.Object' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Delete a tag + tags: + - Tags + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the tag + format: int64 + in: path + name: tagId + required: true + type: integer + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Dto.Tags.Tag' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Retrieve a tag + tags: + - Tags + '/tags/{tagId}/datapoints': + delete: + consumes: [] + deprecated: false + parameters: + - description: Id of the tag + format: int64 + in: path + name: tagId + required: true + type: integer + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Delete the association of this tag with all datapoints + tags: + - Tags + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the tag. + format: int64 + in: path + name: tagId + required: true + type: integer + - default: 0 + description: Where to start when retrieving elements. Default is 0 if not specified. + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - default: 20 + description: Maximum elements to retrieve. Default to 20 if not specified. + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: 'Type of the datapoint ("tp"/"tl")' + enum: + - tp + - tl + in: query + name: type + required: false + type: string + - description: Status of the datapoint + enum: + - deleted + - active + - paused + - spam + in: query + name: status + required: false + type: string + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + - description: Exclude datapoints created before this date (YYYYMMDD) + in: query + name: createdAfter + required: false + type: string + - description: Exclude datapoints created after this date (YYYYMMDD) + in: query + name: createdBefore + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: List of all the datapoints associated to the user filtered by this tag + tags: + - Tags + '/tags/{tagId}/datapoints/count': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the tag. + format: int64 + in: path + name: tagId + required: true + type: integer + - description: 'Type of the datapoint ("tp"/"tl")' + enum: + - tp + - tl + in: query + name: type + required: false + type: string + - description: Status of the datapoint + enum: + - deleted + - active + - paused + - spam + in: query + name: status + required: false + type: string + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + - description: Exclude datapoints created before this date (YYYYMMDD) + in: query + name: createdAfter + required: false + type: string + - description: Exclude datapoints created after this date (YYYYMMDD) + in: query + name: createdBefore + required: false + type: string + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.CountResponce' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Count the datapoints associated to the user filtered by this tag + tags: + - Tags + '/tags/{tagId}/datapoints/patch': + put: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: Id of the tag + format: int64 + in: path + name: tagId + required: true + type: integer + - description: The body patch + in: body + name: data + required: true + schema: + $ref: '#/definitions/Api.Core.Requests.PatchBody' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Associate/Deassociate a tag with a datapoint + tags: + - Tags + '/tags/{tagId}/groups': + delete: + consumes: [] + deprecated: false + parameters: + - description: Id of the tag + format: int64 + in: path + name: tagId + required: true + type: integer + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Delete the association of this tag with all groups + tags: + - Tags + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the tag. + format: int64 + in: path + name: tagId + required: true + type: integer + - default: 0 + description: Where to start when retrieving elements. Default is 0 if not specified. + format: int32 + in: query + minLength: 0 + name: offset + required: false + type: integer + - default: 20 + description: Maximum elements to retrieve. Default to 20 if not specified. + format: int32 + in: query + maxLength: 0 + minLength: 0 + name: limit + required: false + type: integer + - description: Status of the datapoint + enum: + - deleted + - active + in: query + name: status + required: false + type: string + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + - description: Exclude groups created before this date (YYYYMMDD) + in: query + name: createdAfter + required: false + type: string + - description: Exclude groups created after this date (YYYYMMDD) + in: query + name: createdBefore + required: false + type: string + produces: + - application/json + - text/json + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: List of all the groups associated to the user filtered by this tag. + tags: + - Tags + '/tags/{tagId}/groups/count': + get: + consumes: [] + deprecated: false + parameters: + - description: Id of the tag. + format: int64 + in: path + name: tagId + required: true + type: integer + - description: Status of the datapoint + enum: + - deleted + - active + in: query + name: status + required: false + type: string + - description: Filter fields by this pattern + in: query + name: textSearch + required: false + type: string + - description: Exclude groups created before this date (YYYYMMDD) + in: query + name: createdAfter + required: false + type: string + - description: Exclude groups created after this date (YYYYMMDD) + in: query + name: createdBefore + required: false + type: string + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.CountResponce' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Count the groups associated to the user filtered by this tag + tags: + - Tags + '/tags/{tagId}/groups/patch': + put: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: Id of the tag + format: int64 + in: path + name: tagId + required: true + type: integer + - description: The body patch + in: body + name: data + required: true + schema: + $ref: '#/definitions/Api.Core.Requests.PatchBody' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '404': + description: Not found + '500': + description: Internal Server Error + summary: Associate/Deassociate a tag with a group + tags: + - Tags + '/tags/{tagId}/name': + put: + consumes: + - application/json + - text/json + - application/xml + - text/xml + - application/x-www-form-urlencoded + deprecated: false + parameters: + - description: Id of the tag + format: int64 + in: path + name: tagId + required: true + type: integer + - description: The body patch + in: body + name: data + required: true + schema: + $ref: '#/definitions/Api.Core.Requests.GenericTextPatch' + produces: + - application/json + - text/json + - application/xml + - text/xml + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + '401': + description: Unauthorized + '500': + description: Internal Server Error + summary: Fast patch a tag name + tags: + - Tags +definitions: + Api.Core.Dto.Accounting.ConversionOptions: + properties: + hideComCost: + type: boolean + hideCost: + type: boolean + hideCount: + type: boolean + hideParams: + type: boolean + hideValue: + type: boolean + percentCommission: + format: int32 + type: integer + percentValue: + format: int32 + type: integer + type: object + Api.Core.Dto.Accounting.DomainWhitelistEntry: + properties: + id: + type: string + name: + type: string + type: object + Api.Core.Dto.Accounting.ExtendedGrants: + properties: + allowAllGrants: + type: boolean + allowGroupCreation: + type: boolean + type: object + Api.Core.Dto.Accounting.Guest: + properties: + apiKey: + type: string + conversionOptions: + $ref: '#/definitions/Api.Core.Dto.Accounting.ConversionOptions' + creationDate: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + currentGrant: + $ref: '#/definitions/Api.Core.Dto.Grants.Grant' + dateFormat: + type: string + decimalSeparator: + type: string + email: + type: string + extendedGrants: + $ref: '#/definitions/Api.Core.Dto.Accounting.ExtendedGrants' + groupGrants: + format: int64 + type: integer + hitOptions: + $ref: '#/definitions/Api.Core.Dto.Accounting.HitOptions' + id: + format: int64 + type: integer + key: + type: string + language: + type: string + loginCount: + format: int32 + type: integer + name: + type: string + notes: + type: string + numberGroupSeparator: + type: string + password: + type: string + timeFormat: + enum: + - AmPm + - H24 + type: string + timeZone: + format: int32 + type: integer + timeframeMinDate: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + timezonename: + type: string + tlGrants: + format: int64 + type: integer + tpGrants: + format: int64 + type: integer + userName: + type: string + type: object + Api.Core.Dto.Accounting.HitOptions: + properties: + hideReferrer: + type: boolean + type: object + Api.Core.Dto.Accounting.IpBlacklistEntry: + properties: + id: + type: string + ip: + type: string + type: object + Api.Core.Dto.Accounting.Plan: + properties: + allowedPersonalDomains: + format: int32 + type: integer + allowedPersonalUrls: + format: int32 + type: integer + billingPeriodEnd: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + billingPeriodStart: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + bonusMonthlyEvents: + format: int64 + type: integer + maximumDatapoints: + format: int64 + type: integer + maximumGuests: + format: int64 + type: integer + monthlyEvents: + format: int64 + type: integer + name: + type: string + price: + format: double + type: number + profileId: + format: int64 + type: integer + recurring: + type: boolean + recurringPeriod: + format: int32 + type: integer + usedDatapoints: + format: int64 + type: integer + usedMonthlyEvents: + format: int64 + type: integer + type: object + Api.Core.Dto.Accounting.User: + properties: + boGoVal: + type: string + bonusClicks: + format: int64 + type: integer + companyName: + type: string + companyRole: + type: string + email: + type: string + firstName: + type: string + lastName: + type: string + phone: + type: string + redirectOnly: + type: boolean + registrationDate: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + timeframeMinDate: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + timezone: + format: int32 + type: integer + timezonename: + type: string + type: object + Api.Core.Dto.Aggregated.AggregatedResult: + properties: + activityDay: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + commissionsCost: + format: double + type: number + conversionsCost: + format: double + type: number + conversionsValue: + format: double + type: number + convertedClicks: + format: int64 + type: integer + entityData: + $ref: '#/definitions/System.Object' + entityId: + type: string + fromDay: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + hourlyBreakDown: + additionalProperties: + $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' + type: object + lastHitDate: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + spiderHitsCount: + format: int64 + type: integer + toDay: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + totalClicks: + format: int64 + type: integer + totalViews: + format: int64 + type: integer + uniqueClicks: + format: int64 + type: integer + uniqueConversions: + format: int64 + type: integer + uniqueViews: + format: int64 + type: integer + type: object + Api.Core.Dto.Aggregated.AggregatedSummaryResult: + properties: + count: + format: int64 + type: integer + limit: + format: int32 + type: integer + offset: + format: int64 + type: integer + result: + items: + $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' + type: array + type: object + Api.Core.Dto.ClickStream.Hit: + properties: + accessTime: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + browser: + $ref: '#/definitions/Api.Core.Dto.ClickStream.HitBrowserInfo' + clientLanguage: + type: string + conversion1: + $ref: '#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo' + conversion2: + $ref: '#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo' + conversion3: + $ref: '#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo' + conversion4: + $ref: '#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo' + conversion5: + $ref: '#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo' + conversions: + items: + $ref: '#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo' + type: array + entity: + $ref: '#/definitions/Api.Core.Dto.ClickStream.HitDatapointInfo' + ip: + type: string + isProxy: + type: string + isSpider: + type: string + isUnique: + type: string + location: + $ref: '#/definitions/Api.Core.Dto.ClickStream.HitLocationInfo' + org: + type: string + os: + $ref: '#/definitions/Api.Core.Dto.ClickStream.HitOsInfo' + queryParams: + type: string + realDestinationUrl: + type: string + referer: + type: string + source: + $ref: '#/definitions/Api.Core.Dto.ClickStream.HitSource' + type: + type: string + type: object + Api.Core.Dto.ClickStream.HitBrowserInfo: + properties: + browserType: + type: string + familyId: + format: int64 + type: integer + familyName: + type: string + id: + format: int64 + type: integer + name: + type: string + type: object + Api.Core.Dto.ClickStream.HitConversionInfo: + properties: + accessTime: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + comcost: + format: double + type: number + cost: + format: double + type: number + date: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + deleted: + type: boolean + id: + format: int64 + type: integer + name: + type: string + parameter: + type: string + value: + format: double + type: number + type: object + Api.Core.Dto.ClickStream.HitDatapointInfo: + properties: + creationDate: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + datapointFavourite: + type: boolean + datapointId: + format: int64 + type: integer + datapointName: + type: string + datapointTitle: + type: string + datapointType: + type: string + destinationUrl: + type: string + groupId: + format: int64 + type: integer + groupName: + type: string + isABTest: + type: boolean + isPrivateShared: + type: boolean + isPublic: + type: boolean + notes: + type: string + status: + enum: + - Active + - Paused + - Abuse + - Deleted + type: string + tags: + items: + $ref: '#/definitions/Api.Core.Dto.Tags.Tag' + type: array + trackingCode: + type: string + type: object + Api.Core.Dto.ClickStream.HitListPage: + properties: + hits: + items: + $ref: '#/definitions/Api.Core.Dto.ClickStream.Hit' + type: array + lastKey: + type: string + type: object + Api.Core.Dto.ClickStream.HitLocationInfo: + properties: + areacode: + type: string + city: + type: string + country: + type: string + latitude: + format: double + type: number + longitude: + format: double + type: number + metrocode: + type: string + organization: + type: string + postalcode: + type: string + region: + type: string + regionName: + type: string + type: object + Api.Core.Dto.ClickStream.HitOsInfo: + properties: + familyId: + format: int64 + type: integer + familyName: + type: string + id: + format: int64 + type: integer + name: + type: string + type: object + Api.Core.Dto.ClickStream.HitSource: + properties: + id: + format: int64 + type: integer + name: + type: string + param: + type: string + type: object + Api.Core.Dto.Conversions.Conversion: + properties: + code: + type: string + creationDate: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + deleted: + type: boolean + description: + type: string + id: + format: int64 + type: integer + name: + type: string + protocol: + enum: + - Http + - Https + type: string + value: + format: double + type: number + type: object + Api.Core.Dto.Datapoints.BrowserBaseDestinationItem: + properties: + emailDestinationUrl: + type: string + mobileDestinationUrl: + type: string + spidersDestinationUrl: + type: string + type: object + Api.Core.Dto.Datapoints.Datapoint: + properties: + creationDate: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + encodeIp: + type: boolean + fifthConversionId: + format: int64 + type: integer + fifthConversionName: + type: string + firstConversionId: + format: int64 + type: integer + firstConversionName: + type: string + fourthConversionId: + format: int64 + type: integer + fourthConversionName: + type: string + groupId: + format: int64 + type: integer + groupName: + type: string + id: + format: int64 + type: integer + isPublic: + type: boolean + isSecured: + type: boolean + lightTracking: + type: boolean + name: + type: string + notes: + type: string + preferred: + type: boolean + redirectOnly: + type: boolean + secondConversionId: + format: int64 + type: integer + secondConversionName: + type: string + status: + enum: + - Active + - Paused + - Abuse + - Deleted + type: string + tags: + items: + $ref: '#/definitions/Api.Core.Dto.Tags.Tag' + type: array + thirdConversionId: + format: int64 + type: integer + thirdConversionName: + type: string + title: + type: string + trackingCode: + type: string + type: + enum: + - TrackingLink + - TrackingPixel + type: string + typeTL: + $ref: '#/definitions/Api.Core.Dto.Datapoints.TrackingLinkSpecifics' + typeTP: + $ref: '#/definitions/Api.Core.Dto.Datapoints.TrackingPixelSpecifics' + writePermited: + type: boolean + type: object + Api.Core.Dto.Datapoints.DatapointRetargetingInfo: + properties: + id: + format: int64 + type: integer + name: + type: string + type: object + Api.Core.Dto.Datapoints.MultipleDestinationItem: + properties: + url: + type: string + type: object + Api.Core.Dto.Datapoints.TrackingLinkSpecifics: + properties: + appendQuery: + type: boolean + browserDestinationItem: + $ref: '#/definitions/Api.Core.Dto.Datapoints.BrowserBaseDestinationItem' + destinationMode: + enum: + - Simple + - RandomDestination + - DestinationByLanguage + - SpilloverDestination + - DynamicUrl + - BrowserDestination + - DestinationByNation + - UniqueDestination + - SequentialDestination + - WeightedDestination + type: string + domainId: + format: int32 + type: integer + encodeUrl: + type: boolean + expirationClicks: + format: int64 + type: integer + expirationDate: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + firstUrl: + type: string + goDomainId: + format: int32 + type: integer + hideUrl: + type: boolean + hideUrlTitle: + type: string + isABTest: + type: boolean + password: + type: string + pauseAfterClicksExpiration: + type: boolean + pauseAfterDateExpiration: + type: boolean + randomDestinationItems: + items: + $ref: '#/definitions/Api.Core.Dto.Datapoints.MultipleDestinationItem' + type: array + redirectType: + enum: + - PermanentRedirect + - TemporaryRedirect + type: string + referrerClean: + enum: + - None + - Clean + - Myself + type: string + scripts: + items: + $ref: '#/definitions/Api.Core.Dto.Datapoints.DatapointRetargetingInfo' + type: array + sequentialDestinationItems: + items: + $ref: '#/definitions/Api.Core.Dto.Datapoints.MultipleDestinationItem' + type: array + spilloverDestinationItems: + items: + $ref: '#/definitions/Api.Core.Dto.Datapoints.MultipleDestinationItem' + type: array + uniqueDestinationItem: + $ref: '#/definitions/Api.Core.Dto.Datapoints.UniqueDestinationItem' + url: + type: string + urlAfterClicksExpiration: + type: string + urlAfterDateExpiration: + type: string + urlsByLanguage: + items: + $ref: '#/definitions/Api.Core.Dto.Datapoints.UrlByLanguageItem' + type: array + urlsByNation: + items: + $ref: '#/definitions/Api.Core.Dto.Datapoints.UrlByNationItem' + type: array + weightedDestinationItems: + items: + $ref: '#/definitions/Api.Core.Dto.Datapoints.WeightedDestinationItem' + type: array + type: object + Api.Core.Dto.Datapoints.TrackingPixelSpecifics: + properties: + parameterNote: + type: string + type: object + Api.Core.Dto.Datapoints.UniqueDestinationItem: + properties: + firstDestinationUrl: + type: string + type: object + Api.Core.Dto.Datapoints.UrlByLanguageItem: + properties: + languageCode: + type: string + url: + type: string + type: object + Api.Core.Dto.Datapoints.UrlByNationItem: + properties: + nation: + type: string + url: + type: string + type: object + Api.Core.Dto.Datapoints.WeightedDestinationItem: + properties: + url: + type: string + weight: + format: int32 + type: integer + type: object + Api.Core.Dto.Domains.Domain: + properties: + custom404: + type: string + customHomepage: + type: string + id: + format: int64 + type: integer + name: + type: string + type: + enum: + - System + - Go + - Dedicated + - Personal + type: string + type: object + Api.Core.Dto.EntityUriLong: + properties: + id: + format: int64 + type: integer + uri: + type: string + type: object + Api.Core.Dto.Grants.Grant: + properties: + DatapointType: + type: string + Entity: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + EntityName: + type: string + EntityType: + type: string + Type: + type: string + type: object + Api.Core.Dto.Groups.Group: + properties: + creationDate: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + deleted: + type: boolean + id: + format: int64 + type: integer + isPublic: + type: boolean + name: + type: string + notes: + type: string + preferred: + type: boolean + redirectOnly: + type: boolean + tags: + items: + $ref: '#/definitions/Api.Core.Dto.Tags.Tag' + type: array + writePermited: + type: boolean + type: object + Api.Core.Dto.Retargeting.RetargetingScript: + properties: + id: + format: int64 + type: integer + name: + type: string + script: + type: string + type: object + Api.Core.Dto.Tags.Tag: + properties: + datapoints: + items: + format: int64 + type: integer + type: array + groups: + items: + format: int64 + type: integer + type: array + id: + format: int64 + type: integer + name: + type: string + type: object + Api.Core.Dto.Tops.Top: + properties: + createdAt: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + data: + items: + $ref: '#/definitions/Api.Core.Dto.Tops.TopItem' + type: array + key: + type: string + type: object + Api.Core.Dto.Tops.TopItem: + properties: + entityData: + $ref: '#/definitions/System.Object' + id: + type: string + lastHitDate: + description: ' (A date in "YmdHis" format)' + example: '20120203120530' + type: string + spiderClicks: + format: int64 + type: integer + spiderHits: + format: int64 + type: integer + spiderViews: + format: int64 + type: integer + totalClicks: + format: int64 + type: integer + totalCommissionsCost: + format: double + type: number + totalConversions: + format: int64 + type: integer + totalConversionsCost: + format: double + type: number + totalConversionsValue: + format: double + type: number + totalHits: + format: int64 + type: integer + totalViews: + format: int64 + type: integer + uniqueClicks: + format: int64 + type: integer + uniqueHits: + format: int64 + type: integer + uniqueViews: + format: int64 + type: integer + type: object + Api.Core.Requests.ConversionPatchBody: + properties: + Action: + type: string + Id: + format: int64 + type: integer + ReplaceId: + format: int64 + type: integer + type: object + Api.Core.Requests.DatapointsBatch: + properties: + List: + items: + $ref: '#/definitions/Api.Core.Dto.Datapoints.Datapoint' + type: array + type: object + Api.Core.Requests.DeleteBatch: + properties: + Entities: + items: + $ref: '#/definitions/Api.Core.Dto.EntityUriLong' + type: array + type: object + Api.Core.Requests.GenericTextPatch: + properties: + Text: + type: string + type: object + Api.Core.Requests.PatchBody: + properties: + Action: + type: string + Id: + format: int64 + type: integer + type: object + Api.Core.Requests.PatchBodyBatch: + properties: + PatchRequests: + items: + $ref: '#/definitions/Api.Core.Requests.PatchBody' + type: array + type: object + Api.Core.Requests.PermissionPatchRequest: + properties: + Action: + type: string + Id: + format: int64 + type: integer + Verb: + type: string + type: object + Api.Core.Responses.CountResponce: + properties: + count: + format: int64 + type: integer + type: object + 'Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Accounting.DomainWhitelistEntry]': + properties: + entities: + items: + $ref: '#/definitions/Api.Core.Dto.Accounting.DomainWhitelistEntry' + type: array + type: object + 'Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Accounting.IpBlacklistEntry]': + properties: + entities: + items: + $ref: '#/definitions/Api.Core.Dto.Accounting.IpBlacklistEntry' + type: array + type: object + 'Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]': + properties: + entities: + items: + $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' + type: array + type: object + 'Api.Core.Responses.EntitiesResponse[Api.Core.Dto.ClickStream.Hit]': + properties: + entities: + items: + $ref: '#/definitions/Api.Core.Dto.ClickStream.Hit' + type: array + type: object + 'Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Grants.Grant]': + properties: + entities: + items: + $ref: '#/definitions/Api.Core.Dto.Grants.Grant' + type: array + type: object + 'Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]': + properties: + entities: + items: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + type: array + type: object + 'Api.Core.Responses.EntityUri[System.Int64]': + properties: + id: + format: int64 + type: integer + uri: + type: string + type: object + 'Api.Core.Responses.ModifyBatchItemResponce[Api.Core.Dto.Datapoints.Datapoint,System.Int64]': + properties: + entityData: + $ref: '#/definitions/Api.Core.Dto.Datapoints.Datapoint' + errors: + items: + $ref: '#/definitions/ClickMeter.Infrastructure.Validation.ValidationFailure' + type: array + result: + $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' + status: + type: string + type: object + ClickMeter.Infrastructure.Validation.ValidationFailure: + properties: + code: + $ref: '#/definitions/System.Object' + errorMessage: + type: string + errorValue: + $ref: '#/definitions/System.Object' + property: + type: string + type: object + System.Object: + properties: {} + type: object diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/invalid-refs.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/invalid-refs.json new file mode 100644 index 0000000000..d636d45895 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/expansion/invalid-refs.json @@ -0,0 +1,85 @@ +{ + "swagger": "2.0", + "info": { + "version": "1.0.0", + "title": "Swagger Petstore", + "contact": { + "name": "wordnik api team", + "url": "http://developer.wordnik.com" + }, + "license": { + "name": "Creative Commons 4.0 International", + "url": "http://creativecommons.org/licenses/by/4.0/" + } + }, + "host": "petstore.swagger.wordnik.com", + "basePath": "/api", + "schemes": [ + "http" + ], + "paths": { + "/pets": { + "get": { + "tags": [ "Pet Operations" ], + "summary": "finds pets in the system", + "responses": { + "200": { + "description": "pet response", + "schema": { + "type": "array", + "items": { + "$ref": "NotCorrectRef" + } + }, + "headers": { + "x-expires": { + "type": "string" + } + } + }, + "default": { + "description": "unexpected error", + "schema": { + "$ref": "NotCorrectRef" + } + } + } + } + } + }, + "definitions": { + "Pet": { + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "tag": { + "type": "string" + } + } + }, + "Error": { + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + } + } + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/missingItemRef.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/missingItemRef.json new file mode 100644 index 0000000000..f3908d52f0 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/expansion/missingItemRef.json @@ -0,0 +1,31 @@ +{ + "swagger": "2.0", + "info": { + "version": "2.1.0", + "title": "Missing Item API" + }, + "host": "item.com", + "basePath": "/missing/ref", + "schemes": [ + "http" + ], + "paths": { + "/employees": { + "get": { + "operationId": "LIST-Employees", + "summary": "List Employee Types", + "responses": { + "200": { + "description": "", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/employees-output" + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/missingRef.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/missingRef.json new file mode 100644 index 0000000000..d59794696a --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/expansion/missingRef.json @@ -0,0 +1,165 @@ +{ + "input": { + "swagger": "2.0", + "info": { + "version": "1.0", + "title": "Continue On Error" + }, + "paths": { + "/todos": { + "get": { + "responses": { + "200": { + "description": "List Todos", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/todo-full" + } + } + }, + "404": { + "$ref": "#/responses/404" + } + } + } + } + }, + "definitions": { + "todo-partial": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "completed": { + "type": "boolean" + } + } + }, + "todo-full": { + "allOf": [ + { + "$ref": "#/definitions/todo-partial" + }, + { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "completed_at": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "updated_at": { + "type": "string" + } + } + } + ] + } + } + }, + "expected": { + "swagger": "2.0", + "info": { + "title": "Continue On Error", + "version": "1.0" + }, + "paths": { + "/todos": { + "get": { + "responses": { + "200": { + "description": "List Todos", + "schema": { + "type": "array", + "items": { + "allOf": [ + { + "type": "object", + "properties": { + "completed": { + "type": "boolean" + }, + "name": { + "type": "string" + } + } + }, + { + "type": "object", + "properties": { + "completed_at": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "updated_at": { + "type": "string" + } + } + } + ] + } + } + }, + "404": {} + } + } + } + }, + "definitions": { + "todo-full": { + "allOf": [ + { + "type": "object", + "properties": { + "completed": { + "type": "boolean" + }, + "name": { + "type": "string" + } + } + }, + { + "type": "object", + "properties": { + "completed_at": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "updated_at": { + "type": "string" + } + } + } + ] + }, + "todo-partial": { + "type": "object", + "properties": { + "completed": { + "type": "boolean" + }, + "name": { + "type": "string" + } + } + } + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/overflow.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/overflow.json new file mode 100644 index 0000000000..5a2a9f3dd0 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/expansion/overflow.json @@ -0,0 +1,124 @@ +{ + "swagger": "2.0", + "info": { + "title": "Swagger Sample", + "description": "Sample API Playground.", + "version": "1.0.0" + }, + "basePath": "/v1", + "schemes": [ + "http" + ], + "consumes": [ + "application/vdn.sample.v1+json" + ], + "produces": [ + "application/vdn.sample.v1+json" + ], + "paths": { + "/books": { + "get": { + "summary": "List all books", + "operationId": "listBooks", + "tags": [ + "books" + ], + "responses": { + "200": { + "headers": { + "Link": { + "type": "string" + } + }, + "description": "An array of books", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Book" + } + } + }, + "default": { + "description": "generic error response", + "schema": { + "$ref": "#/definitions/Error" + } + } + } + } + } + }, + "definitions": { + "Store": { + "type": "object", + "properties": { + "title": { + "type": "string", + "example": "Book Shop" + }, + "categories": { + "type": "array", + "items": { + "$ref": "#/definitions/Category" + } + } + } + }, + "Category": { + "type": "object", + "properties": { + "title": { + "type": "string", + "example": "Drama" + }, + "books": { + "type": "array", + "items": { + "$ref": "#/definitions/Book" + } + } + } + }, + "Book": { + "type": "object", + "required": [ + "title", + "summary" + ], + "properties": { + "title": { + "type": "string", + "example": "Winnie the Pooh" + }, + "summary": { + "type": "string", + "example": "Famous children's book" + }, + "related_books": { + "type": "array", + "items": { + "$ref": "#/definitions/Book" + } + } + } + }, + "Error": { + "type": "object", + "readOnly": true, + "properties": { + "code": { + "type": "integer", + "format": "int64", + "example": 400 + }, + "message": { + "type": "string", + "example": "Unexpected error" + } + }, + "required": [ + "message" + ] + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/params.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/params.json new file mode 100644 index 0000000000..76e7b418e3 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/expansion/params.json @@ -0,0 +1,25 @@ +{ + "parameters": { + "id": { + "type": "integer", + "format": "int64", + "in": "path", + "required": true + }, + "tag": { + "type": "string", + "in": "query", + "required": false + }, + "query": { + "$ref": "#/parameters/tag" + } + }, + "paths": { + "/cars/{id}": { + "parameters": [ + { "$ref": "#/parameters/id"} + ] + } + } +} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/schemas1.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/schemas1.json new file mode 100644 index 0000000000..e53a412ef0 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/expansion/schemas1.json @@ -0,0 +1,127 @@ +{ + "definitions": { + "car": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "make": { + "type": "string" + }, + "brand": { + "$ref": "#/definitions/brand" + } + } + }, + "tag": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "value": { + "type": "string" + } + } + }, + "brand": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + } + }, + "truck": { + "$ref": "#/definitions/car" + }, + "batch": { + "items": { + "$ref": "#/definitions/brand" + } + }, + "batch2": { + "items": [ + { + "$ref": "#/definitions/brand" + }, + { + "$ref": "#/definitions/tag" + } + ] + }, + "allofBoth": { + "allOf": [ + { + "$ref": "#/definitions/brand" + }, + { + "$ref": "#/definitions/tag" + } + ] + }, + "anyofBoth": { + "anyOf": [ + { + "$ref": "#/definitions/brand" + }, + { + "$ref": "#/definitions/tag" + } + ] + }, + "oneofBoth": { + "oneOf": [ + { + "$ref": "#/definitions/brand" + }, + { + "$ref": "#/definitions/tag" + } + ] + }, + "notSomething": { + "not": { + "$ref": "#/definitions/tag" + } + }, + "withAdditional": { + "additionalProperties": { + "$ref": "#/definitions/tag" + } + }, + "withPattern": { + "patternProperties": { + "^x-ab": { + "$ref": "#/definitions/tag" + } + } + }, + "withAdditionalItems": { + "additionalItems": { + "$ref": "#/definitions/tag" + } + }, + "deps": { + "dependencies": { + "something": { + "$ref": "#/definitions/tag" + } + } + }, + "defined": { + "definitions": { + "something": { + "$ref": "#/definitions/tag" + } + } + } + } +} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/schemas2.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/schemas2.json new file mode 100644 index 0000000000..fe885fd98a --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/expansion/schemas2.json @@ -0,0 +1,161 @@ +{ + "definitions": { + "car": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "make": { + "type": "string" + }, + "brand": { + "items": { + "$ref": "#/definitions/brand" + } + } + } + }, + "tag": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "value": { + "type": "string" + } + } + }, + "brand": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + } + }, + "truck": { + "items": { + "$ref": "#/definitions/car" + } + }, + "batch": { + "items": { + "items": { + "$ref": "#/definitions/brand" + } + } + }, + "batch2": { + "items": [ + { + "items": { + "$ref": "#/definitions/brand" + } + }, + { + "items": { + "$ref": "#/definitions/tag" + } + } + ] + }, + "allofBoth": { + "allOf": [ + { + "items": { + "$ref": "#/definitions/brand" + } + }, + { + "items": { + "$ref": "#/definitions/tag" + } + } + ] + }, + "anyofBoth": { + "anyOf": [ + { + "items": { + "$ref": "#/definitions/brand" + } + }, + { + "items": { + "$ref": "#/definitions/tag" + } + } + ] + }, + "oneofBoth": { + "oneOf": [ + { + "items": { + "$ref": "#/definitions/brand" + } + }, + { + "items": { + "$ref": "#/definitions/tag" + } + } + ] + }, + "notSomething": { + "not": { + "items": { + "$ref": "#/definitions/tag" + } + } + }, + "withAdditional": { + "additionalProperties": { + "items": { + "$ref": "#/definitions/tag" + } + } + }, + "withPattern": { + "patternProperties": { + "^x-ab": { + "items": { + "$ref": "#/definitions/tag" + } + } + } + }, + "withAdditionalItems": { + "additionalItems": { + "items": { + "$ref": "#/definitions/tag" + } + } + }, + "deps": { + "dependencies": { + "something": { + "items": { + "$ref": "#/definitions/tag" + } + } + } + }, + "defined": { + "definitions": { + "something": { + "items": { + "$ref": "#/definitions/tag" + } + } + } + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/local_expansion/item.json b/vendor/github.com/go-openapi/spec/fixtures/local_expansion/item.json new file mode 100644 index 0000000000..f042fdd7a8 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/local_expansion/item.json @@ -0,0 +1,18 @@ +{ + "properties": { + "id": { + "format": "int64", + "readOnly": true, + "type": "integer" + }, + "title": { + "maxLength": 80, + "minLength": 2, + "type": "string" + } + }, + "required": [ + "title" + ], + "type": "object" +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/local_expansion/item2.yaml b/vendor/github.com/go-openapi/spec/fixtures/local_expansion/item2.yaml new file mode 100644 index 0000000000..87803b5981 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/local_expansion/item2.yaml @@ -0,0 +1,12 @@ +type: object +required: + - title +properties: + id: + type: integer + format: uint64 + readOnly: true + title: + type: string + minLength: 2 + maxLength: 80 diff --git a/vendor/github.com/go-openapi/spec/fixtures/local_expansion/spec.json b/vendor/github.com/go-openapi/spec/fixtures/local_expansion/spec.json new file mode 100644 index 0000000000..5c653bca8e --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/local_expansion/spec.json @@ -0,0 +1,46 @@ +{ + "basePath": "/v1", + "consumes": [ + "application/json" + ], + "host": "item.api.local", + "info": { + "description": "Item API", + "title": "Item API", + "version": "1.0.0" + }, + "paths": { + "/item": { + "get": { + "operationId": "GetItem", + "responses": { + "200": { + "description": "item detail response", + "schema": { + "$ref": "item.json" + } + } + } + } + } + }, + "produces": [ + "application/json" + ], + "schemes": [ + "http" + ], + "security": [ + { + "key": [] + } + ], + "securityDefinitions": { + "key": { + "in": "header", + "name": "x-item-token", + "type": "apiKey" + } + }, + "swagger": "2.0" +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/local_expansion/spec2.yaml b/vendor/github.com/go-openapi/spec/fixtures/local_expansion/spec2.yaml new file mode 100644 index 0000000000..dced7592eb --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/local_expansion/spec2.yaml @@ -0,0 +1,30 @@ +--- +swagger: "2.0" +info: + title: Item API + description: Item API + version: "1.0.0" +host: item.api.local +basePath: /v1 +securityDefinitions: + key: + type: apiKey + name: x-item-token + in: header +security: + - key: [] +consumes: + - application/json +produces: + - application/json +schemes: + - http +paths: + /item: + get: + operationId: GetItem + responses: + 200: + description: item detail response + schema: + "$ref": "item2.yaml" diff --git a/vendor/github.com/go-openapi/spec/fixtures/more_circulars/bitbucket.json b/vendor/github.com/go-openapi/spec/fixtures/more_circulars/bitbucket.json new file mode 100644 index 0000000000..49e40521c0 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/more_circulars/bitbucket.json @@ -0,0 +1,8322 @@ +{ + "info": { + "termsOfService": "https://www.atlassian.com/end-user-agreement", + "version": "2.0", + "contact": { + "url": "https://bitbucket.org/support", + "name": "Bitbucket Support", + "email": "support@bitbucket.org" + }, + "description": "Code against the Bitbucket API to automate simple tasks, embed Bitbucket data into your own site, build mobile or desktop apps, or even add custom UI add-ons into Bitbucket itself using the Connect framework.", + "title": "Bitbucket API" + }, + "paths": { + "/repositories/{username}/{repo_slug}/refs/branches/{name}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "name", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "refs" + ] + } + }, + "/teams/{username}/following": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "account" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the list of accounts this team is following.", + "responses": { + "200": { + "description": "A paginated list of user objects.", + "schema": { + "$ref": "#/definitions/paginated_users" + } + }, + "404": { + "description": "If no team exists for the specified name, or if the specified account is a personal account, not a team account.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The team's username", + "name": "username", + "in": "path" + } + ], + "tags": [ + "teams" + ] + } + }, + "/repositories/{username}/{repo_slug}/commit/{sha}/comments/{comment_id}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "sha", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "comment_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the specified commit comment.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "commits" + ] + } + }, + "/repositories/{username}/{repo_slug}/hooks": { + "post": { + "security": [ + { + "oauth2": [ + "webhook" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Creates a new webhook on the specified repository.", + "responses": { + "201": { + "description": "If the webhook was registered successfully.", + "schema": { + "$ref": "#/definitions/webhook_subscription" + } + }, + "403": { + "description": "If the authenticated user does not have permission to install webhooks on the specified repository.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the repository does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "webhooks" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "webhook" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns a paginated list of webhooks installed on this repository.", + "responses": { + "200": { + "description": "The paginated list of installed webhooks.", + "schema": { + "$ref": "#/definitions/paginated_webhook_subscriptions" + } + }, + "403": { + "description": "If the authenticated user does not have permission to access the webhooks.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the repository does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "webhooks" + ] + } + }, + "/repositories/{username}/{repo_slug}/issues/{issue_id}/attachments/{path}": { + "delete": { + "security": [ + { + "oauth2": [ + "issue:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Deletes an attachment.", + "responses": { + "401": { + "description": "If the issue tracker is private and the request was not authenticated." + }, + "404": { + "description": "If the specified repository, issue, or attachment does not exist, or if the repository doesn't have the issue tracker enabled.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "204": { + "description": "Indicates that the deletion was successful" + } + }, + "parameters": [], + "tags": [ + "issue_tracker" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "issue_id", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "path", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "issue" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the contents of the specified file attachment.\n\nNote that this endpoint does not return a JSON response, but instead\nreturns a redirect pointing to the actual file that in turn will return\nthe raw contents.\n\nThe redirect URL contains a one-time token that has a limited lifetime.\nAs a result, the link should not be persisted, stored, or shared.", + "responses": { + "401": { + "description": "If the issue tracker is private and the request was not authenticated." + }, + "404": { + "description": "If the specified repository or issue does not exist, or if the repository doesn't have the issue tracker enabled.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "302": { + "headers": { + "Location": { + "type": "string" + } + }, + "description": "A redirect to the file's contents" + } + }, + "parameters": [], + "tags": [ + "issue_tracker" + ] + } + }, + "/repositories/{username}/{repo_slug}/versions/{version_id}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "version_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "issue" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the specified issue tracker version object.", + "responses": { + "200": { + "description": "The specified version object.", + "schema": { + "$ref": "#/definitions/version" + } + }, + "404": { + "description": "If the specified repository or version does not exist, or if the repository doesn't have the issue tracker enabled.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "integer", + "description": "The version's id", + "name": "version_id", + "in": "path" + } + ], + "tags": [ + "issue_tracker" + ] + } + }, + "/repositories/{username}/{repo_slug}/issues/{issue_id}/vote": { + "put": { + "security": [ + { + "oauth2": [ + "issue", + "account:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Vote for this issue.\n\nTo cast your vote, do an empty PUT. The 204 status code indicates that\nthe operation was successful.", + "responses": { + "401": { + "description": "When the request wasn't authenticated.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "When the issue does not exist, the repo does not exist, or when the repos does not have an issue tracker.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "204": { + "description": "Indicating the authenticated user has cast their vote successfully.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "integer", + "description": "The issue's id", + "name": "issue_id", + "in": "path" + } + ], + "tags": [ + "issue_tracker" + ] + }, + "delete": { + "security": [ + { + "oauth2": [ + "issue:write", + "account:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Retract your vote.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "integer", + "description": "The issue's id", + "name": "issue_id", + "in": "path" + } + ], + "tags": [ + "issue_tracker" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "issue_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "issue", + "account" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Check whether the authenticated user has voted for this issue.\nA 204 status code indicates that the user has voted, while a 404\nimplies they haven't.", + "responses": { + "401": { + "description": "When the request wasn't authenticated.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the authenticated user has not voted for this issue, or when the repo does not exist, or does not have an issue tracker.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "204": { + "description": "If the authenticated user has not voted for this issue.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "integer", + "description": "The issue's id", + "name": "issue_id", + "in": "path" + } + ], + "tags": [ + "issue_tracker" + ] + } + }, + "/repositories/{username}/{repo_slug}/milestones": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "issue" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the milestones that have been defined in the issue tracker.\n\nThis resource is only available on repositories that have the issue\ntracker enabled.", + "responses": { + "200": { + "description": "The milestones that have been defined in the issue tracker.", + "schema": { + "$ref": "#/definitions/paginated_milestones" + } + }, + "404": { + "description": "If the specified repository does not exist, or if the repository doesn't have the issue tracker enabled.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "issue_tracker" + ] + } + }, + "/repositories/{username}/{repo_slug}/components": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "issue" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the components that have been defined in the issue tracker.\n\nThis resource is only available on repositories that have the issue\ntracker enabled.", + "responses": { + "200": { + "description": "The components that have been defined in the issue tracker.", + "schema": { + "$ref": "#/definitions/paginated_components" + } + }, + "404": { + "description": "If the specified repository does not exist, or if the repository doesn't have the issue tracker enabled.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "issue_tracker" + ] + } + }, + "/account/{username}/addons/{encoded_context_id}/refresh": { + "put": { + "security": [ + { + "oauth2": [ + "account:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "addon" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "encoded_context_id", + "in": "path" + } + ] + }, + "/addon/linkers/{linker_key}/values": { + "put": { + "security": [ + { + "oauth2": [] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "addon" + ] + }, + "post": { + "security": [ + { + "oauth2": [] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "addon" + ] + }, + "delete": { + "security": [ + { + "oauth2": [] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "addon" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "linker_key", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "addon" + ] + } + }, + "/repositories/{username}/{repo_slug}/refs/branches": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "refs" + ] + } + }, + "/hook_events/{subject_type}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "subject_type", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns a paginated list of all valid webhook events for the\nspecified entity.\n\nThis is public data that does not require any scopes or authentication.", + "responses": { + "200": { + "description": "A paginated list of webhook types available to subscribe on.", + "schema": { + "$ref": "#/definitions/paginated_hook_events" + } + }, + "404": { + "description": "If an invalid `{subject_type}` value was specified.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "enum": [ + "user", + "repository", + "team" + ], + "name": "subject_type", + "required": true, + "in": "path", + "type": "string", + "description": "A resource or subject type." + } + ], + "tags": [ + "webhooks" + ] + } + }, + "/users/{username}/followers": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the list of accounts that are following this team.", + "responses": { + "200": { + "description": "A paginated list of user objects.", + "schema": { + "$ref": "#/definitions/paginated_users" + } + }, + "404": { + "description": "If no account exists for the specified name, or if the specified account is a team account, not a personal account.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The account's username", + "name": "username", + "in": "path" + } + ], + "tags": [ + "users" + ] + } + }, + "/repositories/{username}/{repo_slug}/default-reviewers": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository:admin" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the repository's default reviewers.\n\nThese are the users that are automatically added as reviewers on every\nnew pull request that is created.", + "responses": { + "200": { + "description": "The paginated list of default reviewers" + } + }, + "parameters": [], + "tags": [ + "pullrequests" + ] + } + }, + "/repositories/{username}/{repo_slug}/downloads/{filename}": { + "delete": { + "security": [ + { + "oauth2": [ + "repository:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Deletes the specified download artifact from the repository.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "downloads" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "filename", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Return a redirect to the contents of a download artifact.\n\nThis endpoint returns the actual file contents and not the artifact's\nmetadata.\n\n $ curl -s -L https://api.bitbucket.org/2.0/repositories/evzijst/git-tests/downloads/hello.txt\n Hello World", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "downloads" + ] + } + }, + "/repositories/{username}/{repo_slug}/commit/{node}/statuses/build/{key}": { + "put": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "node", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "key", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [] + } + }, + "/repositories/{username}/{repo_slug}/watchers": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns a paginated list of all the watchers on the specified\nrepository.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "repositories" + ] + } + }, + "/snippets/{username}/{encoded_id}/commits": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "encoded_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "snippet" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the changes (commits) made on this snippet.", + "responses": { + "200": { + "description": "The paginated list of snippet commits.", + "schema": { + "$ref": "#/definitions/paginated_snippet_commit" + } + }, + "403": { + "description": "If the authenticated user does not have access to the snippet.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "snippets" + ] + } + }, + "/users/{username}/repositories": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "All repositories owned by a user/team. This includes private\nrepositories, but filtered down to the ones that the calling user has\naccess to.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "users", + "teams" + ] + } + }, + "/repositories/{username}/{repo_slug}/pullrequests/activity": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "pullrequest" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the pull request's activity log. This includes comments that\nwere made by the reviewers, updates and approvals.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "pullrequests" + ] + } + }, + "/snippets/{username}/{encoded_id}/comments/{comment_id}": { + "put": { + "security": [ + { + "oauth2": [ + "snippet" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Updates a comment.\n\nComments can only be updated by their author.", + "responses": { + "200": { + "description": "The updated comment object." + }, + "403": { + "description": "If the authenticated user does not have access to the snippet.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the comment or snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "snippets" + ] + }, + "delete": { + "security": [ + { + "oauth2": [ + "snippet" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Deletes a snippet comment.\n\nComments can only be removed by their author.", + "responses": { + "204": { + "description": "Indicates the comment was deleted successfully." + }, + "403": { + "description": "If the authenticated user is not the author of the comment.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the comment or the snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "snippets" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "encoded_id", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "comment_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "snippet" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the specific snippet comment.", + "responses": { + "200": { + "description": "The specified comment.", + "schema": { + "$ref": "#/definitions/snippet_comment" + } + }, + "403": { + "description": "If the authenticated user does not have access to the snippet.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the comment or snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "snippets" + ] + } + }, + "/repositories/{username}/{repo_slug}/diff/{spec}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "spec", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "commits" + ] + } + }, + "/repositories/{username}/{repo_slug}/branch-restrictions": { + "post": { + "security": [ + { + "oauth2": [ + "repository:admin" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "branch_restrictions" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository:admin" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "branch_restrictions" + ] + } + }, + "/repositories/{username}/{repo_slug}/issues/{issue_id}/comments/{comment_id}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "issue_id", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "comment_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "issue" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the specified issue comment object.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "issue_tracker" + ] + } + }, + "/repositories/{username}/{repo_slug}/hooks/{uid}": { + "put": { + "security": [ + { + "oauth2": [ + "webhook" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Updates the specified webhook subscription.\n\nThe following properties can be mutated:\n\n* `description`\n* `url`\n* `active`\n* `events`", + "responses": { + "200": { + "description": "The webhook subscription object.", + "schema": { + "$ref": "#/definitions/webhook_subscription" + } + }, + "403": { + "description": "If the authenticated user does not have permission to update the webhook.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the webhook or repository does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The installed webhook's id", + "name": "uid", + "in": "path" + } + ], + "tags": [ + "webhooks" + ] + }, + "delete": { + "security": [ + { + "oauth2": [ + "webhook" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Deletes the specified webhook subscription.", + "responses": { + "204": { + "description": "When the webhook was deleted successfully", + "schema": { + "$ref": "#/definitions/webhook_subscription" + } + }, + "403": { + "description": "If the authenticated user does not have permission to delete the webhook.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the webhook or repository does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The installed webhook's id", + "name": "uid", + "in": "path" + } + ], + "tags": [ + "webhooks" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "uid", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "webhook" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the webhook installed on the specified repository.", + "responses": { + "200": { + "description": "The webhook subscription object.", + "schema": { + "$ref": "#/definitions/webhook_subscription" + } + }, + "404": { + "description": "If the webhook or repository does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The installed webhook's id.", + "name": "uid", + "in": "path" + } + ], + "tags": [ + "webhooks" + ] + } + }, + "/users/{username}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Gets the public information associated with a user account.\n\nIf the user's profile is private, `location`, `website` and\n`created_on` elements are omitted.", + "responses": { + "200": { + "description": "The user object", + "schema": { + "$ref": "#/definitions/team" + } + }, + "404": { + "description": "If no user exists for the specified name or UUID, or if the specified account is a team account, not a personal account.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The account's username or UUID.", + "name": "username", + "in": "path" + } + ], + "tags": [ + "users" + ] + } + }, + "/snippets/{username}/{encoded_id}": { + "put": { + "responses": { + "200": { + "description": "The updated snippet object.", + "schema": { + "$ref": "#/definitions/snippet" + } + }, + "401": { + "description": "If the snippet is private and the request was not authenticated.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "403": { + "description": "If authenticated user does not have permission to update the private snippet.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The snippet's id.", + "name": "encoded_id", + "in": "path" + } + ], + "tags": [ + "snippets" + ], + "produces": [ + "application/json", + "multipart/related", + "multipart/form-data" + ], + "security": [ + { + "oauth2": [ + "snippet:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "consumes": [ + "application/json", + "multipart/related", + "multipart/form-data" + ], + "description": "Used to update a snippet. Use this to add and delete files and to\nchange a snippet's title.\n\nTo update a snippet, one can either PUT a full snapshot, or only the\nparts that need to be changed.\n\nThe contract for PUT on this API is that properties missing from the\nrequest remain untouched so that snippets can be efficiently\nmanipulated with differential payloads.\n\nTo delete a property (e.g. the title, or a file), include its name in\nthe request, but omit its value (use `null`).\n\nAs in Git, explicit renaming of files is not supported. Instead, to\nrename a file, delete it and add it again under another name. This can\nbe done atomically in a single request. Rename detection is left to\nthe SCM.\n\nPUT supports three different content types for both request and\nresponse bodies:\n\n* `application/json`\n* `multipart/related`\n* `multipart/form-data`\n\nThe content type used for the request body can be different than that\nused for the response. Content types are specified using standard HTTP\nheaders.\n\nUse the `Content-Type` and `Accept` headers to select the desired\nrequest and response format.\n\n\napplication/json\n----------------\n\nAs with creation and retrieval, the content type determines what\nproperties can be manipulated. `application/json` does not support\nfile contents and is therefore limited to a snippet's meta data.\n\nTo update the title, without changing any of its files:\n\n $ curl -X POST -H \"Content-Type: application/json\" https://api.bitbucket.org/2.0/snippets/evzijst/kypj -d '{\"title\": \"Updated title\"}'\n\n\nTo delete the title:\n\n $ curl -X POST -H \"Content-Type: application/json\" https://api.bitbucket.org/2.0/snippets/evzijst/kypj -d '{\"title\": null}'\n\nNot all parts of a snippet can be manipulated. The owner and creator\nfor instance are immutable.\n\n\nmultipart/related\n-----------------\n\n`multipart/related` can be used to manipulate all of a snippet's\nproperties. The body is identical to a POST. properties omitted from\nthe request are left unchanged. Since the `start` part contains JSON,\nthe mechanism for manipulating the snippet's meta data is identical\nto `application/json` requests.\n\nTo update one of a snippet's file contents, while also changing its\ntitle:\n\n PUT /2.0/snippets/evzijst/kypj HTTP/1.1\n Content-Length: 288\n Content-Type: multipart/related; start=\"snippet\"; boundary=\"===============1438169132528273974==\"\n MIME-Version: 1.0\n\n --===============1438169132528273974==\n Content-Type: application/json; charset=\"utf-8\"\n MIME-Version: 1.0\n Content-ID: snippet\n\n {\n \"title\": \"My updated snippet\",\n \"files\": {\n \"foo.txt\": {}\n }\n }\n\n --===============1438169132528273974==\n Content-Type: text/plain; charset=\"us-ascii\"\n MIME-Version: 1.0\n Content-Transfer-Encoding: 7bit\n Content-ID: \"foo.txt\"\n Content-Disposition: attachment; filename=\"foo.txt\"\n\n Updated file contents.\n\n --===============1438169132528273974==--\n\nHere only the parts that are changed are included in the body. The\nother files remain untouched.\n\nNote the use of the `files` list in the JSON part. This list contains\nthe files that are being manipulated. This list should have\ncorresponding multiparts in the request that contain the new contents\nof these files.\n\nIf a filename in the `files` list does not have a corresponding part,\nit will be deleted from the snippet, as shown below:\n\n PUT /2.0/snippets/evzijst/kypj HTTP/1.1\n Content-Length: 188\n Content-Type: multipart/related; start=\"snippet\"; boundary=\"===============1438169132528273974==\"\n MIME-Version: 1.0\n\n --===============1438169132528273974==\n Content-Type: application/json; charset=\"utf-8\"\n MIME-Version: 1.0\n Content-ID: snippet\n\n {\n \"files\": {\n \"image.png\": {}\n }\n }\n\n --===============1438169132528273974==--\n\nTo simulate a rename, delete a file and add the same file under\nanother name:\n\n PUT /2.0/snippets/evzijst/kypj HTTP/1.1\n Content-Length: 212\n Content-Type: multipart/related; start=\"snippet\"; boundary=\"===============1438169132528273974==\"\n MIME-Version: 1.0\n\n --===============1438169132528273974==\n Content-Type: application/json; charset=\"utf-8\"\n MIME-Version: 1.0\n Content-ID: snippet\n\n {\n \"files\": {\n \"foo.txt\": {},\n \"bar.txt\": {}\n }\n }\n\n --===============1438169132528273974==\n Content-Type: text/plain; charset=\"us-ascii\"\n MIME-Version: 1.0\n Content-Transfer-Encoding: 7bit\n Content-ID: \"bar.txt\"\n Content-Disposition: attachment; filename=\"bar.txt\"\n\n foo\n\n --===============1438169132528273974==--\n\n\nmultipart/form-data\n-----------------\n\nAgain, one can also use `multipart/form-data` to manipulate file\ncontents and meta data atomically.\n\n $ curl -X PUT http://localhost:12345/2.0/snippets/evzijst/kypj -F title=\"My updated snippet\" -F file=@foo.txt\n\n PUT /2.0/snippets/evzijst/kypj HTTP/1.1\n Content-Length: 351\n Content-Type: multipart/form-data; boundary=----------------------------63a4b224c59f\n\n ------------------------------63a4b224c59f\n Content-Disposition: form-data; name=\"file\"; filename=\"foo.txt\"\n Content-Type: text/plain\n\n foo\n\n ------------------------------63a4b224c59f\n Content-Disposition: form-data; name=\"title\"\n\n My updated snippet\n ------------------------------63a4b224c59f\n\nTo delete a file, omit its contents while including its name in the\n`files` field:\n\n $ curl -X PUT https://api.bitbucket.org/2.0/snippets/evzijst/kypj -F files=image.png\n\n PUT /2.0/snippets/evzijst/kypj HTTP/1.1\n Content-Length: 149\n Content-Type: multipart/form-data; boundary=----------------------------ef8871065a86\n\n ------------------------------ef8871065a86\n Content-Disposition: form-data; name=\"files\"\n\n image.png\n ------------------------------ef8871065a86--\n\nThe explicit use of the `files` element in `multipart/related` and\n`multipart/form-data` is only required when deleting files.\nThe default mode of operation is for file parts to be processed,\nregardless of whether or not they are listed in `files`, as a\nconvenience to the client." + }, + "delete": { + "security": [ + { + "oauth2": [ + "snippet:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Deletes a snippet and returns an empty response.", + "responses": { + "401": { + "description": "If the snippet is private and the request was not authenticated.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "403": { + "description": "If authenticated user does not have permission to delete the private snippet.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "204": { + "description": "If the snippet was deleted successfully." + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The snippet's id.", + "name": "encoded_id", + "in": "path" + } + ], + "tags": [ + "snippets" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "encoded_id", + "in": "path" + } + ], + "get": { + "responses": { + "200": { + "description": "The snippet object.", + "schema": { + "$ref": "#/definitions/snippet" + } + }, + "401": { + "description": "If the snippet is private and the request was not authenticated.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "403": { + "description": "If authenticated user does not have access to the private snippet.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The snippet's id.", + "name": "encoded_id", + "in": "path" + } + ], + "produces": [ + "application/json", + "multipart/related", + "multipart/form-data" + ], + "tags": [ + "snippets" + ], + "security": [ + { + "oauth2": [ + "snippet" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Retrieves a single snippet.\n\nSnippets support multiple content types:\n\n* application/json\n* multipart/related\n* multipart/form-data\n\n\napplication/json\n----------------\n\nThe default content type of the response is `application/json`.\nSince JSON is always `utf-8`, it cannot reliably contain file contents\nfor files that are not text. Therefore, JSON snippet documents only\ncontain the filename and links to the file contents.\n\nThis means that in order to retrieve all parts of a snippet, N+1\nrequests need to be made (where N is the number of files in the\nsnippet).\n\n\nmultipart/related\n-----------------\n\nTo retrieve an entire snippet in a single response, use the\n`Accept: multipart/related` HTTP request header.\n\n $ curl -H \"Accept: multipart/related\" https://api.bitbucket.org/2.0/snippets/evzijst/1\n\nResponse:\n\n HTTP/1.1 200 OK\n Content-Length: 2214\n Content-Type: multipart/related; start=\"snippet\"; boundary=\"===============1438169132528273974==\"\n MIME-Version: 1.0\n\n --===============1438169132528273974==\n Content-Type: application/json; charset=\"utf-8\"\n MIME-Version: 1.0\n Content-ID: snippet\n\n {\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/snippets/evzijst/kypj\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/snippets/evzijst/kypj\"\n },\n \"comments\": {\n \"href\": \"https://api.bitbucket.org/2.0/snippets/evzijst/kypj/comments\"\n },\n \"watchers\": {\n \"href\": \"https://api.bitbucket.org/2.0/snippets/evzijst/kypj/watchers\"\n },\n \"commits\": {\n \"href\": \"https://api.bitbucket.org/2.0/snippets/evzijst/kypj/commits\"\n }\n },\n \"id\": kypj,\n \"title\": \"My snippet\",\n \"created_on\": \"2014-12-29T22:22:04.790331+00:00\",\n \"updated_on\": \"2014-12-29T22:22:04.790331+00:00\",\n \"is_private\": false,\n \"files\": {\n \"foo.txt\": {\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/snippets/evzijst/kypj/files/367ab19/foo.txt\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/snippets/evzijst/kypj#foo.txt\"\n }\n }\n },\n \"image.png\": {\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/snippets/evzijst/kypj/files/367ab19/image.png\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/snippets/evzijst/kypj#image.png\"\n }\n }\n }\n ],\n \"owner\": {\n \"username\": \"evzijst\",\n \"display_name\": \"Erik van Zijst\",\n \"uuid\": \"{d301aafa-d676-4ee0-88be-962be7417567}\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/users/evzijst\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/evzijst\"\n },\n \"avatar\": {\n \"href\": \"https://bitbucket-staging-assetroot.s3.amazonaws.com/c/photos/2013/Jul/31/erik-avatar-725122544-0_avatar.png\"\n }\n }\n },\n \"creator\": {\n \"username\": \"evzijst\",\n \"display_name\": \"Erik van Zijst\",\n \"uuid\": \"{d301aafa-d676-4ee0-88be-962be7417567}\",\n \"links\": {\n \"self\": {\n \"href\": \"https://api.bitbucket.org/2.0/users/evzijst\"\n },\n \"html\": {\n \"href\": \"https://bitbucket.org/evzijst\"\n },\n \"avatar\": {\n \"href\": \"https://bitbucket-staging-assetroot.s3.amazonaws.com/c/photos/2013/Jul/31/erik-avatar-725122544-0_avatar.png\"\n }\n }\n }\n }\n\n --===============1438169132528273974==\n Content-Type: text/plain; charset=\"us-ascii\"\n MIME-Version: 1.0\n Content-Transfer-Encoding: 7bit\n Content-ID: \"foo.txt\"\n Content-Disposition: attachment; filename=\"foo.txt\"\n\n foo\n\n --===============1438169132528273974==\n Content-Type: image/png\n MIME-Version: 1.0\n Content-Transfer-Encoding: base64\n Content-ID: \"image.png\"\n Content-Disposition: attachment; filename=\"image.png\"\n\n iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAABD0lEQVR4Ae3VMUoDQRTG8ccUaW2m\n TKONFxArJYJamCvkCnZTaa+VnQdJSBFl2SMsLFrEWNjZBZs0JgiL/+KrhhVmJRbCLPx4O+/DT2TB\n cbblJxf+UWFVVRNsEGAtgvJxnLm2H+A5RQ93uIl+3632PZyl/skjfOn9Gvdwmlcw5aPUwimG+NT5\n EnNN036IaZePUuIcK533NVfal7/5yjWeot2z9ta1cAczHEf7I+3J0ws9Cgx0fsOFpmlfwKcWPuBQ\n 73Oc4FHzBaZ8llq4q1mr5B2mOUCt815qYR8eB1hG2VJ7j35q4RofaH7IG+Xrf/PfJhfmwtfFYoIN\n AqxFUD6OMxcvkO+UfKfkOyXfKdsv/AYCHMLVkHAFWgAAAABJRU5ErkJggg==\n --===============1438169132528273974==--\n\nmultipart/form-data\n-------------------\n\nAs with creating new snippets, `multipart/form-data` can be used as an\nalternative to `multipart/related`. However, the inherently flat\nstructure of form-data means that only basic, root-level properties\ncan be returned, while nested elements like `links` are omitted:\n\n $ curl -H \"Accept: multipart/form-data\" https://api.bitbucket.org/2.0/snippets/evzijst/kypj\n\nResponse:\n\n HTTP/1.1 200 OK\n Content-Length: 951\n Content-Type: multipart/form-data; boundary=----------------------------63a4b224c59f\n\n ------------------------------63a4b224c59f\n Content-Disposition: form-data; name=\"title\"\n Content-Type: text/plain; charset=\"utf-8\"\n\n My snippet\n ------------------------------63a4b224c59f--\n Content-Disposition: attachment; name=\"file\"; filename=\"foo.txt\"\n Content-Type: text/plain\n\n foo\n\n ------------------------------63a4b224c59f\n Content-Disposition: attachment; name=\"file\"; filename=\"image.png\"\n Content-Transfer-Encoding: base64\n Content-Type: application/octet-stream\n\n iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAABD0lEQVR4Ae3VMUoDQRTG8ccUaW2m\n TKONFxArJYJamCvkCnZTaa+VnQdJSBFl2SMsLFrEWNjZBZs0JgiL/+KrhhVmJRbCLPx4O+/DT2TB\n cbblJxf+UWFVVRNsEGAtgvJxnLm2H+A5RQ93uIl+3632PZyl/skjfOn9Gvdwmlcw5aPUwimG+NT5\n EnNN036IaZePUuIcK533NVfal7/5yjWeot2z9ta1cAczHEf7I+3J0ws9Cgx0fsOFpmlfwKcWPuBQ\n 73Oc4FHzBaZ8llq4q1mr5B2mOUCt815qYR8eB1hG2VJ7j35q4RofaH7IG+Xrf/PfJhfmwtfFYoIN\n AqxFUD6OMxcvkO+UfKfkOyXfKdsv/AYCHMLVkHAFWgAAAABJRU5ErkJggg==\n ------------------------------5957323a6b76--" + } + }, + "/addon/linkers": { + "parameters": [], + "get": { + "security": [ + { + "oauth2": [] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "addon" + ] + } + }, + "/repositories/{username}/{repo_slug}/pullrequests/{pull_request_id}/comments/{comment_id}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "pull_request_id", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "comment_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "pullrequest" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns a specific pull request comment.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "pullrequests" + ] + } + }, + "/repositories/{username}/{repo_slug}/components/{component_id}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "component_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "issue" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the specified issue tracker component object.", + "responses": { + "200": { + "description": "The specified component object.", + "schema": { + "$ref": "#/definitions/component" + } + }, + "404": { + "description": "If the specified repository or component does not exist, or if the repository doesn't have the issue tracker enabled.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "integer", + "description": "The component's id", + "name": "component_id", + "in": "path" + } + ], + "tags": [ + "issue_tracker" + ] + } + }, + "/addon": { + "put": { + "security": [ + { + "oauth2": [] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "addon" + ] + }, + "parameters": [], + "delete": { + "security": [ + { + "oauth2": [] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "addon" + ] + } + }, + "/users/{username}/following": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "account" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the list of accounts this user is following.", + "responses": { + "200": { + "description": "A paginated list of user objects.", + "schema": { + "$ref": "#/definitions/paginated_users" + } + }, + "404": { + "description": "If no user exists for the specified name, or if the specified account is a team account, not a personal account.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The user's username", + "name": "username", + "in": "path" + } + ], + "tags": [ + "users" + ] + } + }, + "/repositories/{username}/{repo_slug}/issues/{issue_id}": { + "delete": { + "security": [ + { + "oauth2": [ + "issue:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Deletes the specified issue. This requires write access to the\nrepository.", + "responses": { + "200": { + "description": "The issue object.", + "schema": { + "$ref": "#/definitions/issue" + } + }, + "403": { + "description": "When the authenticated user lacks isn't authorized to delete the issue tracker.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the specified repository or issue does not exist, or if the repository doesn't have the issue tracker enabled.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "issue_tracker" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "issue_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "issue" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the specified issue.", + "responses": { + "200": { + "description": "The issue object.", + "schema": { + "$ref": "#/definitions/issue" + } + }, + "403": { + "description": "When the authenticated user lacks isn't authorized to access the issue tracker.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the specified repository or issue does not exist, or if the repository doesn't have the issue tracker enabled.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "issue_tracker" + ] + } + }, + "/teams/{username}/repositories": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "All repositories owned by a user/team. This includes private\nrepositories, but filtered down to the ones that the calling user has\naccess to.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "users", + "teams" + ] + } + }, + "/repositories/{username}/{repo_slug}/downloads": { + "post": { + "security": [ + { + "oauth2": [ + "repository:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Upload new download artifacts.\n\nTo upload files, perform a `multipart/form-data` POST containing one\nor more `files` fields:\n\n $ echo Hello World > hello.txt\n $ curl -s -u evzijst -X POST https://api.bitbucket.org/2.0/repositories/evzijst/git-tests/downloads -F files=@hello.txt\n\nWhen a file is uploaded with the same name as an existing artifact,\nthen the existing file will be replaced.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "downloads" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns a list of download links associated with the repository.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "downloads" + ] + } + }, + "/repositories/{username}/{repo_slug}/refs": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "refs" + ] + } + }, + "/hook_events": { + "parameters": [], + "get": { + "security": [ + { + "oauth2": [] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the webhook resource or subject types on which webhooks can\nbe registered.\n\nEach resource/subject type contains an `event` link that returns the\npaginated list of specific events each individual subject type can\nemit.\n\nThis endpoint is publicly accessible and does not require\nauthentication or scopes.", + "responses": { + "200": { + "description": "A mapping of resource/subject types pointing to their individual event types.", + "schema": { + "$ref": "#/definitions/subject_types" + } + } + }, + "parameters": [], + "tags": [ + "webhooks" + ] + } + }, + "/teams/{username}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Gets the public information associated with a team.\n\nIf the team's profile is private, `location`, `website` and\n`created_on` elements are omitted.", + "responses": { + "200": { + "description": "The team object", + "schema": { + "$ref": "#/definitions/team" + } + }, + "404": { + "description": "If no team exists for the specified name or UUID, or if the specified account is a personal account, not a team account.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The team's username or UUID.", + "name": "username", + "in": "path" + } + ], + "tags": [ + "teams" + ] + } + }, + "/user/emails/{email}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "email", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "email" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns details about a specific one of the authenticated user's\nemail addresses.\n\nDetails describe whether the address has been confirmed by the user and\nwhether it is the user's primary address or not.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "users" + ] + } + }, + "/repositories/{username}/{repo_slug}/pullrequests/{pull_request_id}/approve": { + "post": { + "security": [ + { + "oauth2": [ + "pullrequest:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Approve the specified pull request as the authenticated user.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "pullrequests" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "pull_request_id", + "in": "path" + } + ], + "delete": { + "security": [ + { + "oauth2": [ + "pullrequest:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Redact the authenticated user's approval of the specified pull\nrequest.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "pullrequests" + ] + } + }, + "/repositories/{username}/{repo_slug}/patch/{spec}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "spec", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "commits" + ] + } + }, + "/snippets/{username}/{encoded_id}/{node_id}/diff": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "encoded_id", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "node_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "snippet" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the diff of the specified commit against its first parent.\n\nNote that this resource is different in functionality from the `patch`\nresource.\n\nThe differences between a diff and a patch are:\n\n* patches have a commit header with the username, message, etc\n* diffs support the optional `path=foo/bar.py` query param to filter the\n diff to just that one file diff (not supported for patches)\n* for a merge, the diff will show the diff between the merge commit and\n its first parent (identical to how PRs work), while patch returns a\n response containing separate patches for each commit on the second\n parent's ancestry, up to the oldest common ancestor (identical to\n its reachability).\n\nNote that the character encoding of the contents of the diff is\nunspecified as Git and Mercurial do not track this, making it hard for\nBitbucket to reliably determine this.", + "responses": { + "200": { + "description": "The raw diff contents." + }, + "403": { + "description": "If the authenticated user does not have access to the snippet.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "type": "string", + "description": "When used, only one the diff of the specified file will be returned.", + "name": "path", + "in": "query" + }, + { + "required": true, + "type": "string", + "description": "The snippet id.", + "name": "encoded_id", + "in": "path" + } + ], + "tags": [ + "snippets" + ] + } + }, + "/repositories/{username}/{repo_slug}/forks": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns a paginated list of all the forks of the specified\nrepository.", + "responses": { + "200": { + "description": "All forks.", + "schema": { + "$ref": "#/definitions/paginated_repositories" + } + } + }, + "parameters": [], + "tags": [ + "repositories" + ] + } + }, + "/repositories/{username}/{repo_slug}/issues": { + "post": { + "security": [ + { + "oauth2": [ + "issue:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Creates a new issue.\n\nThis call requires authentication. Private repositories or private\nissue trackers require the caller to authenticate with an account that\nhas appropriate authorisation.\n\nThe authenticated user is used for the issue's `reporter` field.", + "responses": { + "201": { + "headers": { + "Location": { + "type": "string", + "description": "The (absolute) URL of the newly created issue." + } + }, + "description": "The newly created issue.", + "schema": { + "$ref": "#/definitions/issue" + } + }, + "403": { + "description": "When the authenticated user lacks the privilege to create issues in the issue tracker.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the specified repository or version does not exist, or if the repository doesn't have the issue tracker enabled.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "401": { + "description": "When the request wasn't authenticated.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "schema": { + "$ref": "#/definitions/issue" + }, + "required": true, + "description": "The new issue. Note that the only required element is `title`. All other elements can be omitted from the body.", + "name": "_body", + "in": "body" + } + ], + "tags": [ + "issue_tracker" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "issue" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the issues in the issue tracker.", + "responses": { + "200": { + "description": "A paginated list of the issues matching any filter criteria that were provided.", + "schema": { + "$ref": "#/definitions/paginated_issues" + } + }, + "404": { + "description": "If the specified repository or version does not exist, or if the repository doesn't have the issue tracker enabled.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "issue_tracker" + ] + } + }, + "/repositories/{username}/{repo_slug}/issues/{issue_id}/attachments": { + "post": { + "security": [ + { + "oauth2": [ + "issue:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Upload new issue attachments.\n\nTo upload files, perform a `multipart/form-data` POST containing one\nor more file fields.\n\nWhen a file is uploaded with the same name as an existing attachment,\nthen the existing file will be replaced.", + "responses": { + "400": { + "description": "If no files were uploaded, or if the wrong `Content-Type` was used." + }, + "201": { + "headers": { + "Location": { + "type": "string", + "description": "The URL to the issue's collection of attachments." + } + }, + "description": "An empty response document." + }, + "404": { + "description": "If the specified repository or issue does not exist, or if the repository doesn't have the issue tracker enabled.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "401": { + "description": "If the issue tracker is private and the request was not authenticated." + } + }, + "parameters": [ + { + "required": true, + "type": "integer", + "description": "The issue's id", + "name": "issue_id", + "in": "path" + } + ], + "tags": [ + "issue_tracker" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "issue_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "issue" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns all attachments for this issue.\n\nThis returns the files' meta data. This does not return the files'\nactual contents.\n\nThe files are always ordered by their upload date.", + "responses": { + "200": { + "description": "A paginated list of all attachments for this issue.", + "schema": { + "$ref": "#/definitions/paginated_issue_attachments" + } + }, + "401": { + "description": "If the issue tracker is private and the request was not authenticated." + }, + "404": { + "description": "If the specified repository or version does not exist, or if the repository doesn't have the issue tracker enabled.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "integer", + "description": "The issue's id", + "name": "issue_id", + "in": "path" + } + ], + "tags": [ + "issue_tracker" + ] + } + }, + "/repositories/{username}/{repo_slug}/versions": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "issue" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the versions that have been defined in the issue tracker.\n\nThis resource is only available on repositories that have the issue\ntracker enabled.", + "responses": { + "200": { + "description": "The versions that have been defined in the issue tracker.", + "schema": { + "$ref": "#/definitions/paginated_versions" + } + }, + "404": { + "description": "If the specified repository does not exist, or if the repository doesn't have the issue tracker enabled.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "issue_tracker" + ] + } + }, + "/repositories/{username}/{repo_slug}/refs/tags/{name}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "name", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "refs" + ] + } + }, + "/snippets/{username}/{encoded_id}/watch": { + "put": { + "security": [ + { + "oauth2": [ + "snippet:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Used to start watching a specific snippet. Returns 204 (No Content).", + "responses": { + "401": { + "description": "If the request was not authenticated.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "204": { + "description": "Indicates the authenticated user is now watching the snippet.", + "schema": { + "$ref": "#/definitions/paginated_users" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The snippet id.", + "name": "encoded_id", + "in": "path" + } + ], + "tags": [ + "snippets" + ] + }, + "delete": { + "security": [ + { + "oauth2": [ + "snippet:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Used to stop watching a specific snippet. Returns 204 (No Content)\nto indicate success.", + "responses": { + "401": { + "description": "If the request was not authenticated.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "204": { + "description": "Indicates the user stopped watching the snippet successfully.", + "schema": { + "$ref": "#/definitions/paginated_users" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The snippet id.", + "name": "encoded_id", + "in": "path" + } + ], + "tags": [ + "snippets" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "encoded_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "snippet" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Used to check if the current user is watching a specific snippet.\n\nReturns 204 (No Content) if the user is watching the snippet and 404 if\nnot.\n\nHitting this endpoint anonymously always returns a 404.", + "responses": { + "204": { + "description": "If the authenticated user is watching the snippet.", + "schema": { + "$ref": "#/definitions/paginated_users" + } + }, + "404": { + "description": "If the snippet does not exist, or if the authenticated user is not watching the snippet.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The snippet id.", + "name": "encoded_id", + "in": "path" + } + ], + "tags": [ + "snippets" + ] + } + }, + "/repositories/{username}/{repo_slug}/pullrequests/{pull_request_id}/diff": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "pull_request_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "pullrequest" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "pullrequests" + ] + } + }, + "/snippets": { + "post": { + "security": [ + { + "oauth2": [ + "snippet:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Creates a new snippet under the authenticated user's account.\n\nSnippets can contain multiple files. Both text and binary files are\nsupported.\n\nThe simplest way to create a new snippet from a local file:\n\n $ curl -u username:password -X POST https://api.bitbucket.org/2.0/snippets -F file=@image.png\n\nCreating snippets through curl has a few limitations and so let's look\nat a more complicated scenario.\n\nSnippets are created with a multipart POST. Both `multipart/form-data`\nand `multipart/related` are supported. Both allow the creation of\nsnippets with both meta data (title, etc), as well as multiple text\nand binary files.\n\nThe main difference is that `multipart/related` can use rich encoding\nfor the meta data (currently JSON).\n\n\nmultipart/related (RFC-2387)\n----------------------------\n\nThis is the most advanced and efficient way to create a paste.\n\n POST /2.0/snippets/evzijst HTTP/1.1\n Content-Length: 1188\n Content-Type: multipart/related; start=\"snippet\"; boundary=\"===============1438169132528273974==\"\n MIME-Version: 1.0\n\n --===============1438169132528273974==\n Content-Type: application/json; charset=\"utf-8\"\n MIME-Version: 1.0\n Content-ID: snippet\n\n {\n \"title\": \"My snippet\",\n \"is_private\": true,\n \"scm\": \"hg\",\n \"files\": {\n \"foo.txt\": {},\n \"image.png\": {}\n }\n }\n\n --===============1438169132528273974==\n Content-Type: text/plain; charset=\"us-ascii\"\n MIME-Version: 1.0\n Content-Transfer-Encoding: 7bit\n Content-ID: \"foo.txt\"\n Content-Disposition: attachment; filename=\"foo.txt\"\n\n foo\n\n --===============1438169132528273974==\n Content-Type: image/png\n MIME-Version: 1.0\n Content-Transfer-Encoding: base64\n Content-ID: \"image.png\"\n Content-Disposition: attachment; filename=\"image.png\"\n\n iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAABD0lEQVR4Ae3VMUoDQRTG8ccUaW2m\n TKONFxArJYJamCvkCnZTaa+VnQdJSBFl2SMsLFrEWNjZBZs0JgiL/+KrhhVmJRbCLPx4O+/DT2TB\n cbblJxf+UWFVVRNsEGAtgvJxnLm2H+A5RQ93uIl+3632PZyl/skjfOn9Gvdwmlcw5aPUwimG+NT5\n EnNN036IaZePUuIcK533NVfal7/5yjWeot2z9ta1cAczHEf7I+3J0ws9Cgx0fsOFpmlfwKcWPuBQ\n 73Oc4FHzBaZ8llq4q1mr5B2mOUCt815qYR8eB1hG2VJ7j35q4RofaH7IG+Xrf/PfJhfmwtfFYoIN\n AqxFUD6OMxcvkO+UfKfkOyXfKdsv/AYCHMLVkHAFWgAAAABJRU5ErkJggg==\n --===============1438169132528273974==--\n\nThe request contains multiple parts and is structured as follows.\n\nThe first part is the JSON document that describes the snippet's\nproperties or meta data. It either has to be the first part, or the\nrequest's `Content-Type` header must contain the `start` parameter to\npoint to it.\n\nThe remaining parts are the files of which there can be zero or more.\nEach file part should contain the `Content-ID` MIME header through\nwhich the JSON meta data's `files` element addresses it. The value\nshould be the name of the file.\n\n`Content-Disposition` is an optional MIME header. The header's\noptional `filename` parameter can be used to specify the file name\nthat Bitbucket should use when writing the file to disk. When present,\n`filename` takes precedence over the value of `Content-ID`.\n\nWhen the JSON body omits the `files` element, the remaining parts are\nnot ignored. Instead, each file is added to the new snippet as if its\nname was explicitly linked (the use of the `files` elements is\nmandatory for some operations like deleting or renaming files).\n\n\nmultipart/form-data\n-------------------\n\nThe use of JSON for the snippet's meta data is optional. Meta data can\nalso be supplied as regular form fields in a more conventional\n`multipart/form-data` request:\n\n $ curl -X POST -u credentials https://api.bitbucket.org/2.0/snippets -F title=\"My snippet\" -F file=@foo.txt -F file=@image.png\n\n POST /2.0/snippets HTTP/1.1\n Content-Length: 951\n Content-Type: multipart/form-data; boundary=----------------------------63a4b224c59f\n\n ------------------------------63a4b224c59f\n Content-Disposition: form-data; name=\"file\"; filename=\"foo.txt\"\n Content-Type: text/plain\n\n foo\n\n ------------------------------63a4b224c59f\n Content-Disposition: form-data; name=\"file\"; filename=\"image.png\"\n Content-Type: application/octet-stream\n\n ?PNG\n\n IHDR?1??I.....\n ------------------------------63a4b224c59f\n Content-Disposition: form-data; name=\"title\"\n\n My snippet\n ------------------------------63a4b224c59f--\n\nHere the meta data properties are included as flat, top-level form\nfields. The file attachments use the `file` field name. To attach\nmultiple files, simply repeat the field.\n\nThe advantage of `multipart/form-data` over `multipart/related` is\nthat it can be easier to build clients.\n\nEssentially all properties are optional, `title` and `files` included.\n\n\nSharing and Visibility\n----------------------\n\nSnippets can be either public (visible to anyone on Bitbucket, as well\nas anonymous users), or private (visible only to the owner, creator\nand members of the team in case the snippet is owned by a team). This\nis controlled through the snippet's `is_private` element:\n\n* **is_private=false** -- everyone, including anonymous users can view\n the snippet\n* **is_private=true** -- only the owner and team members (for team\n snippets) can view it\n\nTo create the snippet under a team account, just append the team name\nto the URL (see `/2.0/snippets/{username}`).", + "responses": { + "201": { + "headers": { + "Location": { + "type": "string", + "description": "The URL of the newly created snippet." + } + }, + "description": "The newly created snippet object.", + "schema": { + "$ref": "#/definitions/snippet" + } + }, + "401": { + "description": "If the request was not authenticated", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "schema": { + "$ref": "#/definitions/snippet" + }, + "required": true, + "description": "The new snippet object.", + "name": "_body", + "in": "body" + } + ], + "tags": [ + "snippets" + ] + }, + "parameters": [], + "get": { + "security": [ + { + "oauth2": [ + "snippet" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns all snippets. Like pull requests, repositories and teams, the\nfull set of snippets is defined by what the current user has access to.\n\nThis includes all snippets owned by the current user, but also all snippets\nowned by any of the teams the user is a member of, or snippets by other\nusers that the current user is either watching or has collaborated on (for\ninstance by commenting on it).\n\nTo limit the set of returned snippets, apply the\n`?role=[owner|contributor|member]` query parameter where the roles are\ndefined as follows:\n\n* `owner`: all snippets owned by the current user\n* `contributor`: all snippets owned by, or watched by the current user\n* `member`: owned by the user, their teams, or watched by the current user\n\nWhen no role is specified, all public snippets are returned, as well as all\nprivately owned snippets watched or commented on.\n\nThe returned response is a normal paginated JSON list. This endpoint\nonly supports `application/json` responses and no\n`multipart/form-data` or `multipart/related`. As a result, it is not\npossible to include the file contents.", + "responses": { + "200": { + "description": "A paginated list of snippets.", + "schema": { + "$ref": "#/definitions/paginated_snippets" + } + }, + "404": { + "description": "If the snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "enum": [ + "owner", + "contributor", + "member" + ], + "name": "role", + "required": false, + "in": "query", + "type": "string", + "description": "Filter down the result based on the authenticated user's role (`owner`, `contributor`, or `member`)." + } + ], + "tags": [ + "snippets" + ] + } + }, + "/repositories/{username}/{repo_slug}/pullrequests/{pull_request_id}": { + "put": { + "security": [ + { + "oauth2": [ + "pullrequest:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Mutates the specified pull request.\n\nThis can be used to change the pull request's branches or description.\n\nOnly open pull requests can be mutated.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "pullrequests" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "pull_request_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "pullrequest" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the specified pull request.", + "responses": { + "200": { + "description": "The pull request object", + "schema": { + "$ref": "#/definitions/pullrequest" + } + } + }, + "parameters": [], + "tags": [ + "pullrequests" + ] + } + }, + "/repositories/{username}/{repo_slug}/pullrequests/{pull_request_id}/comments": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "pull_request_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "pullrequest" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns all the pull request's comments.\n\nThis includes both global, inline comments and replies.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "pullrequests" + ] + } + }, + "/account/{username}/addons/{encoded_context_id}": { + "put": { + "security": [ + { + "oauth2": [ + "account:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "addon" + ] + }, + "delete": { + "security": [ + { + "oauth2": [ + "account:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "addon" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "encoded_context_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "account:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "addon" + ] + } + }, + "/repositories/{username}/{repo_slug}/pullrequests/{pull_request_id}/decline": { + "post": { + "security": [ + { + "oauth2": [ + "pullrequest:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "pullrequests" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "pull_request_id", + "in": "path" + } + ] + }, + "/user/emails": { + "parameters": [], + "get": { + "security": [ + { + "oauth2": [ + "email" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns all the authenticated user's email addresses. Both\nconfirmed and unconfirmed.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "users" + ] + } + }, + "/repositories/{username}/{repo_slug}/pullrequests": { + "post": { + "security": [ + { + "oauth2": [ + "pullrequest:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Creates a new pull request.", + "responses": { + "201": { + "headers": { + "Location": { + "type": "string", + "description": "The URL of new newly created pull request." + } + }, + "description": "The newly created pull request.", + "schema": { + "$ref": "#/definitions/pullrequest" + } + } + }, + "parameters": [ + { + "schema": { + "$ref": "#/definitions/pullrequest" + }, + "required": false, + "description": "The new pull request.\n\nThe request URL you POST to becomes the destination repository URL. For this reason, you must specify an explicit source repository in the request object if you want to pull from a different repository (fork).\n\nSince not all elements are required or even mutable, you only need to include the elements you want to initialize, such as the source branch and the title.", + "name": "_body", + "in": "body" + } + ], + "tags": [ + "pullrequests" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "pullrequest" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns all pull requests on the specified repository.\n\nBy default only open pull requests are returned. This can be controlled\nusing the `state` query parameter. To retrieve pull requests that are\nin one of multiple states, repeat the `state` parameter for each\nindividual state.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "enum": [ + "MERGED", + "SUPERSEDED", + "OPEN", + "DECLINED" + ], + "type": "string", + "description": "Only return pull requests that in this state. This parameter can be repeated.", + "name": "state", + "in": "query" + } + ], + "tags": [ + "pullrequests" + ] + } + }, + "/repositories/{username}/{repo_slug}/commits": { + "post": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Identical to `GET /repositories/{username}/{repo_slug}/commits`,\nexcept that POST allows clients to place the include and exclude\nparameters in the request body to avoid URL length issues.\n\n**Note that this resource does NOT support new commit creation.**", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "commits" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "These are the repository's commits. They are paginated and returned\nin reverse chronological order, similar to the output of `git log` and\n`hg log`. Like these tools, the DAG can be filtered.\n\n## GET /repositories/{username}/{repo_slug}/commits/\n\nReturns all commits in the repo in topological order (newest commit\nfirst). All branches and tags are included (similar to\n`git log --all` and `hg log`).\n\n## GET /repositories/{username}/{repo_slug}/commits/master\n\nReturns all commits on rev `master` (similar to `git log master`,\n`hg log master`).\n\n## GET /repositories/{username}/{repo_slug}/commits/dev?exclude=master\n\nReturns all commits on ref `dev`, except those that are reachable on\n`master` (similar to `git log dev ^master`).\n\n## GET /repositories/{username}/{repo_slug}/commits/?exclude=master\n\nReturns all commits in the repo that are not on master\n(similar to `git log --all ^master`).\n\n## GET /repositories/{username}/{repo_slug}/commits/?include=foo&include=bar&exclude=fu&exclude=fubar\n\nReturns all commits that are on refs `foo` or `bar`, but not on `fu` or\n`fubar` (similar to `git log foo bar ^fu ^fubar`).\n\nBecause the response could include a very large number of commits, it\nis paginated. Follow the 'next' link in the response to navigate to the\nnext page of commits. As with other paginated resources, do not\nconstruct your own links.\n\nWhen the include and exclude parameters are more than ca fit in a\nquery string, clients can use a `x-www-form-urlencoded` POST instead.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "commits" + ] + } + }, + "/repositories/{username}/{repo_slug}/commit/{sha}/comments": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "sha", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the commit's comments.\n\nThis includes both global and inline comments.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "commits" + ] + } + }, + "/repositories/{username}/{repo_slug}/commit/{revision}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "revision", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the specified commit.", + "responses": { + "200": { + "description": "The commit object", + "schema": { + "$ref": "#/definitions/commit" + } + }, + "404": { + "description": "If the specified commit or repository does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The commit's SHA1.", + "name": "revision", + "in": "path" + } + ], + "tags": [ + "commits" + ] + } + }, + "/snippets/{username}": { + "post": { + "security": [ + { + "oauth2": [ + "snippet:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Identical to `/snippets`, except that the new snippet will be\ncreated under the account specified in the path parameter `{username}`.", + "responses": { + "201": { + "headers": { + "Location": { + "type": "string", + "description": "The URL of the newly created snippet." + } + }, + "description": "The newly created snippet object.", + "schema": { + "$ref": "#/definitions/snippet" + } + }, + "403": { + "description": "If the authenticated user does not have permission to create snippets under the specified account.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "401": { + "description": "If the request was not authenticated", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "schema": { + "$ref": "#/definitions/snippet" + }, + "required": true, + "description": "The new snippet object.", + "name": "_body", + "in": "body" + } + ], + "tags": [ + "snippets" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "snippet" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Identical to `/snippets`, except that the result is further filtered\nby the snippet owner and only those that are owned by `{username}` are\nreturned.", + "responses": { + "200": { + "description": "A paginated list of snippets.", + "schema": { + "$ref": "#/definitions/paginated_snippets" + } + }, + "404": { + "description": "If the user does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "enum": [ + "owner", + "contributor", + "member" + ], + "name": "role", + "required": false, + "in": "query", + "type": "string", + "description": "Filter down the result based on the authenticated user's role (`owner`, `contributor`, or `member`)." + }, + { + "required": true, + "type": "string", + "description": "Limits the result to snippets owned by this user.", + "name": "username", + "in": "path" + } + ], + "tags": [ + "snippets" + ] + } + }, + "/repositories/{username}/{repo_slug}/issues/{issue_id}/watch": { + "put": { + "security": [ + { + "oauth2": [ + "issue", + "account:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Start watching this issue.\n\nTo start watching this issue, do an empty PUT. The 204 status code\nindicates that the operation was successful.", + "responses": { + "401": { + "description": "When the request wasn't authenticated.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the authenticated user is not watching this issue, or when the repo does not exist, or does not have an issue tracker.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "204": { + "description": "Indicates that the authenticated user successfully started watching this issue.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "integer", + "description": "The issue's id", + "name": "issue_id", + "in": "path" + } + ], + "tags": [ + "issue_tracker" + ] + }, + "delete": { + "security": [ + { + "oauth2": [ + "issue:write", + "account:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Stop watching this issue.", + "responses": { + "401": { + "description": "When the request wasn't authenticated.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the issue or the repo does not exist, or the repository does not have an issue tracker.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "204": { + "description": "Indicates that the authenticated user successfully stopped watching this issue.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "integer", + "description": "The issue's id", + "name": "issue_id", + "in": "path" + } + ], + "tags": [ + "issue_tracker" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "issue_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "issue", + "account" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Indicated whether or not the authenticated user is watching this\nissue.", + "responses": { + "401": { + "description": "When the request wasn't authenticated.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the authenticated user is not watching this issue, or when the repo does not exist, or does not have an issue tracker.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "204": { + "description": "If the authenticated user is watching this issue.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "integer", + "description": "The issue's id", + "name": "issue_id", + "in": "path" + } + ], + "tags": [ + "issue_tracker" + ] + } + }, + "/repositories/{username}/{repo_slug}/milestones/{milestone_id}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "milestone_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "issue" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the specified issue tracker milestone object.", + "responses": { + "200": { + "description": "The specified milestone object.", + "schema": { + "$ref": "#/definitions/milestone" + } + }, + "404": { + "description": "If the specified repository or milestone does not exist, or if the repository doesn't have the issue tracker enabled.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "integer", + "description": "The milestone's id", + "name": "milestone_id", + "in": "path" + } + ], + "tags": [ + "issue_tracker" + ] + } + }, + "/teams": { + "parameters": [], + "get": { + "security": [ + { + "oauth2": [ + "team" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns all the teams that the authenticated user is associated\nwith.", + "responses": { + "200": { + "description": "A paginated list of teams.", + "schema": { + "$ref": "#/definitions/paginated_teams" + } + }, + "401": { + "description": "When the request wasn't authenticated.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "enum": [ + "admin", + "contributor", + "member" + ], + "name": "role", + "required": false, + "in": "query", + "type": "string", + "description": "\nFilters the teams based on the authenticated user's role on each team.\n\n* **member**: returns a list of all the teams which the caller is a member of\n at least one team group or repository owned by the team\n* **contributor**: returns a list of teams which the caller has write access\n to at least one repository owned by the team\n* **admin**: returns a list teams which the caller has team administrator access\n" + } + ], + "tags": [ + "teams" + ] + } + }, + "/user": { + "parameters": [], + "get": { + "security": [ + { + "oauth2": [ + "account" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the currently logged in user.", + "responses": { + "200": { + "description": "The current user.", + "schema": { + "$ref": "#/definitions/user" + } + }, + "401": { + "description": "When the request wasn't authenticated.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "users" + ] + } + }, + "/repositories/{username}/{repo_slug}/commits/{revision}": { + "post": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Identical to `GET /repositories/{username}/{repo_slug}/commits`,\nexcept that POST allows clients to place the include and exclude\nparameters in the request body to avoid URL length issues.\n\n**Note that this resource does NOT support new commit creation.**", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "commits" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "revision", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "These are the repository's commits. They are paginated and returned\nin reverse chronological order, similar to the output of `git log` and\n`hg log`. Like these tools, the DAG can be filtered.\n\n## GET /repositories/{username}/{repo_slug}/commits/\n\nReturns all commits in the repo in topological order (newest commit\nfirst). All branches and tags are included (similar to\n`git log --all` and `hg log`).\n\n## GET /repositories/{username}/{repo_slug}/commits/master\n\nReturns all commits on rev `master` (similar to `git log master`,\n`hg log master`).\n\n## GET /repositories/{username}/{repo_slug}/commits/dev?exclude=master\n\nReturns all commits on ref `dev`, except those that are reachable on\n`master` (similar to `git log dev ^master`).\n\n## GET /repositories/{username}/{repo_slug}/commits/?exclude=master\n\nReturns all commits in the repo that are not on master\n(similar to `git log --all ^master`).\n\n## GET /repositories/{username}/{repo_slug}/commits/?include=foo&include=bar&exclude=fu&exclude=fubar\n\nReturns all commits that are on refs `foo` or `bar`, but not on `fu` or\n`fubar` (similar to `git log foo bar ^fu ^fubar`).\n\nBecause the response could include a very large number of commits, it\nis paginated. Follow the 'next' link in the response to navigate to the\nnext page of commits. As with other paginated resources, do not\nconstruct your own links.\n\nWhen the include and exclude parameters are more than ca fit in a\nquery string, clients can use a `x-www-form-urlencoded` POST instead.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "commits" + ] + } + }, + "/snippets/{username}/{encoded_id}/comments": { + "post": { + "security": [ + { + "oauth2": [ + "snippet" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Creates a new comment.\n\nThe only required field in the body is `content.raw`.\n\nTo create a threaded reply to an existing comment, include `parent.id`.", + "responses": { + "201": { + "headers": { + "Location": { + "type": "string", + "description": "The URL of the new comment" + } + }, + "description": "The newly created comment.", + "schema": { + "$ref": "#/definitions/snippet" + } + }, + "403": { + "description": "If the authenticated user does not have access to the snippet.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "schema": { + "$ref": "#/definitions/snippet" + }, + "required": true, + "description": "The contents of the new comment.", + "name": "_body", + "in": "body" + } + ], + "tags": [ + "snippets" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "encoded_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "snippet" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Used to retrieve a paginated list of all comments for a specific\nsnippet.\n\nThis resource works identical to commit and pull request comments.", + "responses": { + "200": { + "description": "A paginated list of snippet comments, ordered by creation date.", + "schema": { + "$ref": "#/definitions/paginated_snippet_comments" + } + }, + "403": { + "description": "If the authenticated user does not have access to the snippet.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "snippets" + ] + } + }, + "/repositories/{username}/{repo_slug}/pullrequests/{pull_request_id}/activity": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "pull_request_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "pullrequest" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the pull request's activity log. This includes comments that\nwere made by the reviewers, updates and approvals.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "pullrequests" + ] + } + }, + "/repositories/{username}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns all repositories owned by the specified account.\n\nThe result can be narrowed down based on the authenticated user's role.\n\nE.g. with `?role=contributor`, only those repositories that the\nauthenticated user has write access to are returned (this includes any\nrepo the user is an admin on, as that implies write access).", + "responses": { + "200": { + "description": "The repositories owned by the specified account.", + "schema": { + "$ref": "#/definitions/paginated_repositories" + } + }, + "404": { + "description": "If the specified account does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "enum": [ + "admin", + "contributor", + "member", + "owner" + ], + "name": "role", + "required": false, + "in": "query", + "type": "string", + "description": "\nFilters the result based on the authenticated user's role on each repository.\n\n* **member**: returns repositories to which the user has explicit read access\n* **contributor**: returns repositories to which the user has explicit write access\n* **admin**: returns repositories to which the user has explicit administrator access\n* **owner**: returns all repositories owned by the current user\n" + } + ], + "tags": [ + "repositories" + ] + } + }, + "/repositories/{username}/{repo_slug}/pullrequests/{pull_request_id}/merge": { + "post": { + "security": [ + { + "oauth2": [ + "pullrequest:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "pullrequests" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "pull_request_id", + "in": "path" + } + ] + }, + "/snippets/{username}/{encoded_id}/commits/": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "encoded_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "snippet" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "200": { + "description": "The specified snippet commit.", + "schema": { + "$ref": "#/definitions/snippet_commit" + } + }, + "403": { + "description": "If the authenticated user does not have access to the snippet.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the commit or the snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "snippets" + ] + } + }, + "/snippets/{username}/{encoded_id}/{node_id}/patch": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "encoded_id", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "node_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "snippet" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the patch of the specified commit against its first\nparent.\n\nNote that this resource is different in functionality from the `diff`\nresource.\n\nThe differences between a diff and a patch are:\n\n* patches have a commit header with the username, message, etc\n* diffs support the optional `path=foo/bar.py` query param to filter the\n diff to just that one file diff (not supported for patches)\n* for a merge, the diff will show the diff between the merge commit and\n its first parent (identical to how PRs work), while patch returns a\n response containing separate patches for each commit on the second\n parent's ancestry, up to the oldest common ancestor (identical to\n its reachability).\n\nNote that the character encoding of the contents of the patch is\nunspecified as Git and Mercurial do not track this, making it hard for\nBitbucket to reliably determine this.", + "responses": { + "200": { + "description": "The raw patch contents." + }, + "403": { + "description": "If the authenticated user does not have access to the snippet.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The snippet id.", + "name": "encoded_id", + "in": "path" + } + ], + "tags": [ + "snippets" + ] + } + }, + "/teams/{username}/followers": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the list of accounts that are following this team.", + "responses": { + "200": { + "description": "A paginated list of user objects.", + "schema": { + "$ref": "#/definitions/paginated_users" + } + }, + "404": { + "description": "If no team exists for the specified name, or if the specified account is a personal account, not a team account.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The team's username", + "name": "username", + "in": "path" + } + ], + "tags": [ + "teams" + ] + } + }, + "/snippets/{username}/{encoded_id}/{node_id}/files/{path}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "encoded_id", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "node_id", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "path", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "snippet" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Retrieves the raw contents of a specific file in the snippet. The\n`Content-Disposition` header will be \"attachment\" to avoid issues with\nmalevolent executable files.\n\nThe file's mime type is derived from its filename and returned in the\n`Content-Type` header.\n\nNote that for text files, no character encoding is included as part of\nthe content type.", + "responses": { + "200": { + "headers": { + "Content-Type": { + "type": "string", + "description": "The mime type as derived from the filename" + }, + "Content-Disposition": { + "type": "string", + "description": "attachment" + } + }, + "description": "Returns the contents of the specified file." + }, + "403": { + "description": "If the authenticated user does not have access to the snippet.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the file or snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "snippets" + ] + } + }, + "/addon/linkers/{linker_key}": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "linker_key", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "addon" + ] + } + }, + "/repositories/{username}/{repo_slug}/refs/tags": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "refs" + ] + } + }, + "/repositories/{username}/{repo_slug}/commit/{node}/approve": { + "post": { + "security": [ + { + "oauth2": [ + "repository:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Approve the specified commit as the authenticated user.\n\nThis operation is only available to users that have explicit access to\nthe repository. In contrast, just the fact that a repository is\npublicly accessible to users does not give them the ability to approve\ncommits.", + "responses": { + "200": { + "description": "The `participant` object recording that the authenticated user approved the commit.", + "schema": { + "$ref": "#/definitions/participant" + } + }, + "404": { + "description": "If the specified commit, or the repository does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The commit's SHA1.", + "name": "node", + "in": "path" + } + ], + "tags": [ + "commits" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "node", + "in": "path" + } + ], + "delete": { + "security": [ + { + "oauth2": [ + "repository:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Redact the authenticated user's approval of the specified commit.\n\nThis operation is only available to users that have explicit access to\nthe repository. In contrast, just the fact that a repository is\npublicly accessible to users does not give them the ability to approve\ncommits.", + "responses": { + "204": { + "description": "An empty response indicating the authenticated user's approval has been withdrawn." + }, + "404": { + "description": "If the specified commit, or the repository does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The commit's SHA1.", + "name": "node", + "in": "path" + } + ], + "tags": [ + "commits" + ] + } + }, + "/account/{username}/addons": { + "post": { + "security": [ + { + "oauth2": [ + "account:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "addon" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "account:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "addon" + ] + } + }, + "/repositories/{username}/{repo_slug}/pullrequests/{pull_request_id}/commits": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "pull_request_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "pullrequest" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the pull request's commits.\n\nThese are the commits that are being merged into the destination\nbranch when the pull requests gets accepted.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "pullrequests" + ] + } + }, + "/snippets/{username}/{encoded_id}/watchers": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "encoded_id", + "in": "path" + } + ], + "get": { + "responses": { + "200": { + "description": "The paginated list of users watching this snippet", + "schema": { + "$ref": "#/definitions/paginated_users" + } + }, + "404": { + "description": "If the snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The snippet id.", + "name": "encoded_id", + "in": "path" + } + ], + "tags": [ + "snippets" + ], + "deprecated": true, + "security": [ + { + "oauth2": [ + "snippet" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns a paginated list of all users watching a specific snippet." + } + }, + "/repositories/{username}/{repo_slug}/branch-restrictions/{id}": { + "put": { + "security": [ + { + "oauth2": [ + "repository:admin" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "branch_restrictions" + ] + }, + "delete": { + "security": [ + { + "oauth2": [ + "repository:admin" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "branch_restrictions" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository:admin" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "branch_restrictions" + ] + } + }, + "/repositories/{username}/{repo_slug}/commit/{node}/statuses/build": { + "post": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "node", + "in": "path" + } + ] + }, + "/repositories/{username}/{repo_slug}": { + "post": { + "security": [ + { + "oauth2": [ + "repository:admin" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Creates a new repository.", + "responses": { + "200": { + "description": "The newly created repository.", + "schema": { + "$ref": "#/definitions/repository" + } + }, + "401": { + "description": "If the request was not authenticated.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "400": { + "description": "If the input document was invalid, or if the caller lacks the privilege to create repositories under the targeted account.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "schema": { + "$ref": "#/definitions/repository" + }, + "required": false, + "description": "The repository that is to be created. Note that most object elements are optional. Elements \"owner\" and \"full_name\" are ignored as the URL implies them.", + "name": "_body", + "in": "body" + } + ], + "tags": [ + "repositories" + ] + }, + "delete": { + "security": [ + { + "oauth2": [ + "repository:admin" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Deletes the repository. This is an irreversible operation.\n\nThis does not affect its forks.", + "responses": { + "204": { + "description": "Indicates successful deletion." + }, + "403": { + "description": "If the caller either does not have admin access to the repository, or the repository is set to read-only.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the repository does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "repositories" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the object describing this repository.", + "responses": { + "200": { + "description": "The repository object.", + "schema": { + "$ref": "#/definitions/repository" + } + }, + "403": { + "description": "If the repository is private and the authenticated user does not have access to it.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If no repository exists at this location.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "repositories" + ] + } + }, + "/repositories/{username}/{repo_slug}/default-reviewers/{target_username}": { + "put": { + "security": [ + { + "oauth2": [ + "repository:admin" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Adds the specified user to the repository's list of default\nreviewers.\n\nThis method is idempotent. Adding a user a second time has no effect.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "pullrequests" + ] + }, + "delete": { + "security": [ + { + "oauth2": [ + "repository:admin" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Removes a default reviewer from the repository.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "pullrequests" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "target_username", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "repository:admin" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns the specified reviewer.\n\nThis can be used to test whether a user is among the repository's\ndefault reviewers list. A 404 indicates that that specified user is not\na default reviewer.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "pullrequests" + ] + } + }, + "/repositories/{username}/{repo_slug}/issues/{issue_id}/comments": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "issue_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "issue" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns all comments that were made on the specified issue.", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "issue_tracker" + ] + } + }, + "/snippets/{username}/{encoded_id}/{node_id}": { + "put": { + "responses": { + "200": { + "description": "The updated snippet object.", + "schema": { + "$ref": "#/definitions/snippet" + } + }, + "401": { + "description": "If the snippet is private and the request was not authenticated.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "403": { + "description": "If authenticated user does not have permission to update the private snippet.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the snippet or the revision does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "405": { + "description": "If `{node_id}` is not the latest revision.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The snippet's id.", + "name": "encoded_id", + "in": "path" + }, + { + "required": true, + "type": "string", + "description": "A commit revision (SHA1).", + "name": "node_id", + "in": "path" + } + ], + "tags": [ + "snippets" + ], + "produces": [ + "application/json", + "multipart/related", + "multipart/form-data" + ], + "security": [ + { + "oauth2": [ + "snippet:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "consumes": [ + "application/json", + "multipart/related", + "multipart/form-data" + ], + "description": "Identical to `UPDATE /snippets/encoded_id`, except that this endpoint\ntakes an explicit commit revision. Only the snippet's \"HEAD\"/\"tip\"\n(most recent) version can be updated and requests on all other,\nolder revisions fail by returning a 405 status.\n\nUsage of this endpoint over the unrestricted `/snippets/encoded_id`\ncould be desired if the caller wants to be sure no concurrent\nmodifications have taken place between the moment of the UPDATE\nrequest and the original GET.\n\nThis can be considered a so-called \"Compare And Swap\", or CAS\noperation.\n\nOther than that, the two endpoints are identical in behavior." + }, + "delete": { + "security": [ + { + "oauth2": [ + "snippet:write" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Deletes the snippet.\n\nNote that this only works for versioned URLs that point to the latest\ncommit of the snippet. Pointing to an older commit results in a 405\nstatus code.\n\nTo delete a snippet, regardless of whether or not concurrent changes\nare being made to it, use `DELETE /snippets/{encoded_id}` instead.", + "responses": { + "401": { + "description": "If the snippet is private and the request was not authenticated.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "403": { + "description": "If authenticated user does not have permission to delete the private snippet.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the snippet does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "204": { + "description": "If the snippet was deleted successfully." + }, + "405": { + "description": "If `{node_id}` is not the latest revision.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The snippet's id.", + "name": "encoded_id", + "in": "path" + } + ], + "tags": [ + "snippets" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "encoded_id", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "node_id", + "in": "path" + } + ], + "get": { + "responses": { + "200": { + "description": "The snippet object.", + "schema": { + "$ref": "#/definitions/snippet" + } + }, + "401": { + "description": "If the snippet is private and the request was not authenticated.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "403": { + "description": "If authenticated user does not have access to the private snippet.", + "schema": { + "$ref": "#/definitions/error" + } + }, + "404": { + "description": "If the snippet, or the revision does not exist.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [ + { + "required": true, + "type": "string", + "description": "The snippet's id.", + "name": "encoded_id", + "in": "path" + }, + { + "required": true, + "type": "string", + "description": "A commit revision (SHA1).", + "name": "node_id", + "in": "path" + } + ], + "produces": [ + "application/json", + "multipart/related", + "multipart/form-data" + ], + "tags": [ + "snippets" + ], + "security": [ + { + "oauth2": [ + "snippet" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Identical to `GET /snippets/encoded_id`, except that this endpoint\ncan be used to retrieve the contents of the snippet as it was at an\nolder revision, while `/snippets/encoded_id` always returns the\nsnippet's current revision.\n\nNote that only the snippet's file contents are versioned, not its\nmeta data properties like the title.\n\nOther than that, the two endpoints are identical in behavior." + } + }, + "/repositories/{username}/{repo_slug}/pullrequests/{pull_request_id}/patch": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "repo_slug", + "in": "path" + }, + { + "required": true, + "type": "string", + "name": "pull_request_id", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "pullrequest" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "pullrequests" + ] + } + }, + "/addon/linkers/{linker_key}/values/": { + "delete": { + "security": [ + { + "oauth2": [] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "addon" + ] + }, + "parameters": [ + { + "required": true, + "type": "string", + "name": "linker_key", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "", + "responses": { + "default": { + "description": "Unexpected error.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "addon" + ] + } + }, + "/repositories": { + "parameters": [], + "get": { + "security": [ + { + "oauth2": [ + "repository" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "Returns all public repositories.", + "responses": { + "200": { + "description": "All public repositories.", + "schema": { + "$ref": "#/definitions/paginated_repositories" + } + } + }, + "parameters": [], + "tags": [ + "repositories" + ] + } + }, + "/teams/{username}/members": { + "parameters": [ + { + "required": true, + "type": "string", + "name": "username", + "in": "path" + } + ], + "get": { + "security": [ + { + "oauth2": [ + "account" + ] + }, + { + "basic": [] + }, + { + "api_key": [] + } + ], + "description": "All members of a team.\n\nReturns all members of the specified team. Any member of any of the\nteam's groups is considered a member of the team. This includes users\nin groups that may not actually have access to any of the team's\nrepositories.\n\nNote that members using the \"private profile\" feature are not included.", + "responses": { + "200": { + "description": "All members", + "schema": { + "$ref": "#/definitions/user" + } + }, + "404": { + "description": "When the team does not exist, or multiple teams with the same name exist that differ only in casing and the URL did not match the exact casing of a particular one.", + "schema": { + "$ref": "#/definitions/error" + } + } + }, + "parameters": [], + "tags": [ + "teams" + ] + } + } + }, + "schemes": [ + "https" + ], + "tags": [ + { + "name": "users", + "description": "" + }, + { + "name": "teams", + "description": "" + }, + { + "name": "repositories", + "description": "" + }, + { + "name": "refs", + "description": "" + }, + { + "name": "commits", + "description": "" + }, + { + "name": "pullrequests", + "description": "" + }, + { + "name": "issue_tracker", + "description": "The issues resource provides functionality for getting information on\nissues in an issue tracker, creating new issues, updating them and deleting\nthem.\n\nYou can access public issues without authentication, but you can't gain access\nto private repositories' issues. By authenticating, you will get the ability\nto create issues, as well as access to updating data or deleting issues you\nhave access to." + }, + { + "name": "wiki", + "description": "" + }, + { + "name": "downloads", + "description": "" + }, + { + "name": "snippets", + "description": "" + }, + { + "name": "webhooks", + "description": "Webhooks provide a way to configure Bitbucket Cloud to make requests to\nyour server (or another external service) whenever certain events occur in\nBitbucket Cloud.\n\nA webhook consists of:\n\n* A subject -- The resource that generates the events. Currently, this resource\n is the repository, user account, or team where you create the webhook.\n* One or more event -- The default event is a repository push, but you can\n select multiple events that can trigger the webhook.\n* A URL -- The endpoint where you want Bitbucket to send the event payloads\n when a matching event happens.\n\nThere are two parts to getting a webhook to work: creating the webhook and\ntriggering the webhook. After you create a webhook for an event, every time\nthat event occurs, Bitbucket sends a payload request that describes the event\nto the specified URL. Thus, you can think of webhooks as a kind of\nnotification system.\n\nUse webhooks to integrate applications with Bitbucket Cloud. The following\nuse cases provides examples of when you would want to use webhooks:\n\n* Every time a user pushes commits in a repository, you may want to notify\n your CI server to start a build.\n* Every time a user pushes commits or creates a pull request, you may want to\n display a notification in your application.\n" + } + ], + "basePath": "/2.0", + "produces": [ + "application/json" + ], + "securityDefinitions": { + "oauth2": { + "scopes": { + "wiki": "Read and write to your repositories' wikis", + "snippet": "Read your snippets", + "account": "Read your account information", + "repository:admin": "Administer your repositories", + "repository": "Read your repositories", + "snippet:write": "Read and write to your snippets", + "issue:write": "Read and write to your repositories' issues", + "pullrequest": "Read your repositories and their pull requests", + "webhook": "Read and write to your repositories' webhooks", + "pullrequest:write": "Read and write to your repositories and their pull requests", + "project": "Read your team's projects", + "project:write": "Read and write to your team's projects and move repositories between them", + "team": "Read your team membership information", + "repository:write": "Read and write to your repositories", + "team:write": "Read and write to your team membership information", + "account:write": "Read and write to your account information", + "issue": "Read your repositories' issues", + "email": "Read your account's primary email address" + }, + "tokenUrl": "http://dev.bitbucket.org:8000/site/oauth2/access_token", + "description": "OAuth 2 as per [RFC-6749](https://tools.ietf.org/html/rfc6749).", + "flow": "accessCode", + "type": "oauth2", + "authorizationUrl": "http://dev.bitbucket.org:8000/site/oauth2/authorize" + }, + "api_key": { + "in": "header", + "type": "apiKey", + "description": "API Keys can be used as Basic HTTP Authentication credentials and provide a substitute for the account's actual username and password. API Keys are only available to team accounts and there is only 1 key per account. API Keys do not support scopes and have therefore access to all contents of the account.", + "name": "Authorization" + }, + "basic": { + "type": "basic", + "description": "Basic HTTP Authentication as per [RFC-2617](https://tools.ietf.org/html/rfc2617) (Digest not supported). Note that Basic Auth with username and password as credentials is only available on accounts that have 2-factor-auth / 2-step-verification disabled. If you use 2fa, you should authenticate using OAuth2 instead." + } + }, + "x-revision": "dev-1452122794", + "host": "api.dev.bitbucket.org:8000", + "definitions": { + "paginated_repositories": { + "allOf": [ + { + "$ref": "#/definitions/page" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A paginated list of repositories.", + "properties": { + "values": { + "minItems": 0, + "items": { + "$ref": "#/definitions/repository" + }, + "uniqueItems": true, + "type": "array" + } + } + } + ] + }, + "subject_types": { + "additionalProperties": false, + "type": "object", + "description": "The mapping of resource/subject types pointing to their individual event types.", + "properties": { + "user": { + "additionalProperties": false, + "type": "object", + "properties": { + "events": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + } + } + }, + "repository": { + "additionalProperties": false, + "type": "object", + "properties": { + "events": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + } + } + }, + "team": { + "additionalProperties": false, + "type": "object", + "properties": { + "events": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + } + } + } + } + }, + "paginated_hook_events": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A paginated list of webhook types available to subscribe on.", + "properties": { + "next": { + "type": "string", + "description": "Link to the next page if it exists. The last page of a collection does not have this value. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + }, + "values": { + "minItems": 0, + "items": { + "$ref": "#/definitions/hook_event" + }, + "uniqueItems": true, + "type": "array" + }, + "pagelen": { + "minimum": 1, + "type": "integer", + "description": "Current number of objects on the existing page. The default value is 10 with 100 being the maximum allowed value. Individual APIs may enforce different values." + }, + "size": { + "minimum": 0, + "type": "integer", + "description": "Total number of objects in the response. This is an optional element that is not provided in all responses, as it can be expensive to compute." + }, + "page": { + "minimum": 1, + "type": "integer", + "description": "Page number of the current results. This is an optional element that is not provided in all responses." + }, + "previous": { + "type": "string", + "description": "Link to previous page if it exists. A collections first page does not have this value. This is an optional element that is not provided in all responses. Some result sets strictly support forward navigation and never provide previous links. Clients must anticipate that backwards navigation is not always available. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + } + } + } + ] + }, + "base_commit": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "The common base type for both repository and snippet commits.", + "properties": { + "date": { + "type": "string", + "format": "date-time" + }, + "parents": { + "minItems": 0, + "items": { + "$ref": "#/definitions/base_commit" + }, + "type": "array" + }, + "message": { + "type": "string" + }, + "hash": { + "pattern": "[0-9a-f]{7,}?", + "type": "string" + }, + "author": { + "$ref": "#/definitions/account" + } + } + } + ] + }, + "error": { + "additionalProperties": false, + "type": "object", + "properties": { + "error": { + "additionalProperties": false, + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "detail": { + "type": "string" + } + } + } + } + }, + "participant": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "Object describing a user's role on resources like commits or pull requests.", + "properties": { + "role": { + "enum": [ + "PARTICIPANT", + "REVIEWER" + ], + "type": "string" + }, + "user": { + "$ref": "#/definitions/user" + }, + "approved": { + "type": "boolean" + } + } + } + ] + }, + "paginated_versions": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A paginated list of issue tracker versions.", + "properties": { + "next": { + "type": "string", + "description": "Link to the next page if it exists. The last page of a collection does not have this value. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + }, + "values": { + "minItems": 0, + "items": { + "$ref": "#/definitions/version" + }, + "uniqueItems": true, + "type": "array" + }, + "pagelen": { + "minimum": 1, + "type": "integer", + "description": "Current number of objects on the existing page. The default value is 10 with 100 being the maximum allowed value. Individual APIs may enforce different values." + }, + "size": { + "minimum": 0, + "type": "integer", + "description": "Total number of objects in the response. This is an optional element that is not provided in all responses, as it can be expensive to compute." + }, + "page": { + "minimum": 1, + "type": "integer", + "description": "Page number of the current results. This is an optional element that is not provided in all responses." + }, + "previous": { + "type": "string", + "description": "Link to previous page if it exists. A collections first page does not have this value. This is an optional element that is not provided in all responses. Some result sets strictly support forward navigation and never provide previous links. Clients must anticipate that backwards navigation is not always available. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + } + } + } + ] + }, + "paginated_users": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A paginated list of users.", + "properties": { + "next": { + "type": "string", + "description": "Link to the next page if it exists. The last page of a collection does not have this value. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + }, + "values": { + "minItems": 0, + "items": { + "$ref": "#/definitions/user" + }, + "uniqueItems": true, + "type": "array" + }, + "pagelen": { + "minimum": 1, + "type": "integer", + "description": "Current number of objects on the existing page. The default value is 10 with 100 being the maximum allowed value. Individual APIs may enforce different values." + }, + "size": { + "minimum": 0, + "type": "integer", + "description": "Total number of objects in the response. This is an optional element that is not provided in all responses, as it can be expensive to compute." + }, + "page": { + "minimum": 1, + "type": "integer", + "description": "Page number of the current results. This is an optional element that is not provided in all responses." + }, + "previous": { + "type": "string", + "description": "Link to previous page if it exists. A collections first page does not have this value. This is an optional element that is not provided in all responses. Some result sets strictly support forward navigation and never provide previous links. Clients must anticipate that backwards navigation is not always available. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + } + } + } + ] + }, + "snippet": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A snippet object.", + "properties": { + "scm": { + "enum": [ + "hg", + "git" + ], + "type": "string", + "description": "The DVCS used to store the snippet." + }, + "title": { + "type": "string" + }, + "creator": { + "$ref": "#/definitions/account" + }, + "created_on": { + "type": "string", + "format": "date-time" + }, + "owner": { + "$ref": "#/definitions/account" + }, + "updated_on": { + "type": "string", + "format": "date-time" + }, + "id": { + "minimum": 0, + "type": "integer" + }, + "is_private": { + "type": "boolean" + } + } + } + ] + }, + "hook_event": { + "additionalProperties": false, + "type": "object", + "description": "An event, associated with a resource or subject type.", + "properties": { + "category": { + "type": "string", + "description": "The category this event belongs to." + }, + "event": { + "enum": [ + "pullrequest:updated", + "repo:commit_status_created", + "repo:fork", + "issue:comment_created", + "pullrequest:rejected", + "pullrequest:fulfilled", + "pullrequest:comment_created", + "pullrequest:comment_deleted", + "issue:created", + "repo:commit_comment_created", + "pullrequest:approved", + "repo:commit_status_updated", + "pullrequest:comment_updated", + "issue:updated", + "pullrequest:unapproved", + "pullrequest:created", + "repo:push" + ], + "type": "string", + "description": "The event identifier." + }, + "description": { + "type": "string", + "description": "More detailed description of the webhook event type." + }, + "label": { + "type": "string", + "description": "Summary of the webhook event type." + } + } + }, + "version": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A version as defined in a repository's issue tracker.", + "properties": { + "name": { + "type": "string" + }, + "links": { + "additionalProperties": false, + "type": "object", + "properties": { + "self": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + } + } + }, + "id": { + "type": "integer" + } + } + } + ] + }, + "issue": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "An issue.", + "properties": { + "content": { + "additionalProperties": false, + "type": "object", + "properties": { + "raw": { + "type": "string", + "description": "The text as it was typed by a user." + }, + "markup": { + "enum": [ + "markdown", + "creole" + ], + "type": "string", + "description": "The type of markup language the content is to be interpreted in." + }, + "html": { + "type": "string", + "description": "The user's markup rendered as HTML." + } + } + }, + "kind": { + "enum": [ + "bug", + "enhancement", + "proposal", + "task" + ], + "type": "string" + }, + "repository": { + "$ref": "#/definitions/repository" + }, + "links": { + "additionalProperties": false, + "type": "object", + "properties": { + "attachments": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "self": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "watch": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "comments": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "html": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "vote": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + } + } + }, + "title": { + "type": "string" + }, + "reporter": { + "$ref": "#/definitions/user" + }, + "component": { + "$ref": "#/definitions/component" + }, + "votes": { + "type": "integer" + }, + "priority": { + "enum": [ + "trivial", + "minor", + "major", + "critical", + "blocker" + ], + "type": "string" + }, + "assignee": { + "$ref": "#/definitions/user" + }, + "state": { + "enum": [ + "new", + "open", + "resolved", + "on hold", + "invalid", + "duplicate", + "wontfix", + "closed" + ], + "type": "string" + }, + "version": { + "$ref": "#/definitions/version" + }, + "edited_on": { + "type": "string", + "format": "date-time" + }, + "created_on": { + "type": "string", + "format": "date-time" + }, + "milestone": { + "$ref": "#/definitions/milestone" + }, + "updated_on": { + "type": "string", + "format": "date-time" + }, + "id": { + "type": "integer" + } + } + } + ] + }, + "webhook_subscription": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A Webhook subscription.", + "properties": { + "subject_type": { + "enum": [ + "user", + "repository", + "team" + ], + "type": "string", + "description": "The type of entity, which is `repository` in the case of webhook subscriptions on repositories." + }, + "uuid": { + "type": "string", + "description": "The webhook's id" + }, + "url": { + "type": "string", + "description": "The URL events get delivered to.", + "format": "uri" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "description": { + "type": "string", + "description": "A user-defined description of the webhook." + }, + "active": { + "type": "boolean" + }, + "events": { + "minItems": 1, + "items": { + "enum": [ + "pullrequest:updated", + "repo:commit_status_created", + "repo:fork", + "issue:comment_created", + "pullrequest:rejected", + "pullrequest:fulfilled", + "pullrequest:comment_created", + "pullrequest:comment_deleted", + "issue:created", + "repo:commit_comment_created", + "pullrequest:approved", + "repo:commit_status_updated", + "pullrequest:comment_updated", + "issue:updated", + "pullrequest:unapproved", + "pullrequest:created", + "repo:push" + ], + "type": "string" + }, + "uniqueItems": true, + "description": "The events this webhook is subscribed to.", + "type": "array" + }, + "subject": { + "$ref": "#/definitions/object" + } + } + } + ] + }, + "repository": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A Bitbucket repository.", + "properties": { + "scm": { + "enum": [ + "hg", + "git" + ], + "type": "string" + }, + "has_wiki": { + "type": "boolean" + }, + "uuid": { + "type": "string", + "description": "The repository's immutable id. This can be used as a substitute for the slug segment in URLs. Doing this guarantees your URLs will survive renaming of the repository by its owner, or even transfer of the repository to a different user." + }, + "links": { + "additionalProperties": false, + "type": "object", + "properties": { + "watchers": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "commits": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "downloads": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "self": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "html": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "avatar": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "hooks": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "forks": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "clone": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "pullrequests": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + } + } + }, + "fork_policy": { + "enum": [ + "allow_forks", + "no_public_forks", + "no_forks" + ], + "type": "string", + "description": "\nControls the rules for forking this repository.\n\n* **allow_forks**: unrestricted forking\n* **no_public_forks**: restrict forking to private forks (forks cannot\n be made public later)\n* **no_forks**: deny all forking\n" + }, + "description": { + "type": "string" + }, + "language": { + "type": "string" + }, + "created_on": { + "type": "string", + "format": "date-time" + }, + "parent": { + "$ref": "#/definitions/repository" + }, + "full_name": { + "type": "string", + "description": "The concatenation of the repository owner's username and the slugified name, e.g. \"evzijst/interruptingcow\". This is the same string used in Bitbucket URLs." + }, + "has_issues": { + "type": "boolean" + }, + "owner": { + "$ref": "#/definitions/account" + }, + "updated_on": { + "type": "string", + "format": "date-time" + }, + "size": { + "type": "integer" + }, + "is_private": { + "type": "boolean" + }, + "name": { + "type": "string" + } + } + } + ] + }, + "snippet_commit": { + "allOf": [ + { + "$ref": "#/definitions/base_commit" + }, + { + "additionalProperties": true, + "type": "object", + "description": "", + "properties": { + "snippet": { + "$ref": "#/definitions/snippet" + }, + "links": { + "additionalProperties": false, + "type": "object", + "properties": { + "diff": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "self": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "html": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + } + } + } + } + } + ] + }, + "object": { + "description": "Base type for most resource objects. It defines the common `type` element that identifies an object's type. It also identifies the element as Swagger's `discriminator`.", + "required": [ + "type" + ], + "additionalProperties": true, + "discriminator": "type", + "type": "object", + "properties": { + "type": { + "type": "string" + } + } + }, + "component": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A component as defined in a repository's issue tracker.", + "properties": { + "name": { + "type": "string" + }, + "links": { + "additionalProperties": false, + "type": "object", + "properties": { + "self": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + } + } + }, + "id": { + "type": "integer" + } + } + } + ] + }, + "paginated_issues": { + "allOf": [ + { + "$ref": "#/definitions/page" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A paginated list of issues.", + "properties": { + "values": { + "minItems": 0, + "items": { + "$ref": "#/definitions/issue" + }, + "uniqueItems": true, + "type": "array" + } + } + } + ] + }, + "user": { + "allOf": [ + { + "$ref": "#/definitions/account" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A user object.", + "properties": {} + } + ] + }, + "milestone": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A milestone as defined in a repository's issue tracker.", + "properties": { + "name": { + "type": "string" + }, + "links": { + "additionalProperties": false, + "type": "object", + "properties": { + "self": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + } + } + }, + "id": { + "type": "integer" + } + } + } + ] + }, + "paginated_issue_attachments": { + "allOf": [ + { + "$ref": "#/definitions/page" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A paginated list of issue attachments.", + "properties": { + "values": { + "minItems": 0, + "items": { + "$ref": "#/definitions/issue_attachment" + }, + "type": "array" + } + } + } + ] + }, + "paginated_webhook_subscriptions": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A paginated list of webhook subscriptions", + "properties": { + "next": { + "type": "string", + "description": "Link to the next page if it exists. The last page of a collection does not have this value. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + }, + "values": { + "minItems": 0, + "items": { + "$ref": "#/definitions/webhook_subscription" + }, + "uniqueItems": true, + "type": "array" + }, + "pagelen": { + "minimum": 1, + "type": "integer", + "description": "Current number of objects on the existing page. The default value is 10 with 100 being the maximum allowed value. Individual APIs may enforce different values." + }, + "size": { + "minimum": 0, + "type": "integer", + "description": "Total number of objects in the response. This is an optional element that is not provided in all responses, as it can be expensive to compute." + }, + "page": { + "minimum": 1, + "type": "integer", + "description": "Page number of the current results. This is an optional element that is not provided in all responses." + }, + "previous": { + "type": "string", + "description": "Link to previous page if it exists. A collections first page does not have this value. This is an optional element that is not provided in all responses. Some result sets strictly support forward navigation and never provide previous links. Clients must anticipate that backwards navigation is not always available. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + } + } + } + ] + }, + "snippet_comment": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A comment on a snippet.", + "properties": { + "snippet": { + "$ref": "#/definitions/snippet" + }, + "links": { + "additionalProperties": false, + "type": "object", + "properties": { + "self": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "html": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + } + } + } + } + } + ] + }, + "paginated_milestones": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A paginated list of issue tracker milestones.", + "properties": { + "next": { + "type": "string", + "description": "Link to the next page if it exists. The last page of a collection does not have this value. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + }, + "values": { + "minItems": 0, + "items": { + "$ref": "#/definitions/milestone" + }, + "uniqueItems": true, + "type": "array" + }, + "pagelen": { + "minimum": 1, + "type": "integer", + "description": "Current number of objects on the existing page. The default value is 10 with 100 being the maximum allowed value. Individual APIs may enforce different values." + }, + "size": { + "minimum": 0, + "type": "integer", + "description": "Total number of objects in the response. This is an optional element that is not provided in all responses, as it can be expensive to compute." + }, + "page": { + "minimum": 1, + "type": "integer", + "description": "Page number of the current results. This is an optional element that is not provided in all responses." + }, + "previous": { + "type": "string", + "description": "Link to previous page if it exists. A collections first page does not have this value. This is an optional element that is not provided in all responses. Some result sets strictly support forward navigation and never provide previous links. Clients must anticipate that backwards navigation is not always available. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + } + } + } + ] + }, + "paginated_components": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A paginated list of issue tracker components.", + "properties": { + "next": { + "type": "string", + "description": "Link to the next page if it exists. The last page of a collection does not have this value. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + }, + "values": { + "minItems": 0, + "items": { + "$ref": "#/definitions/component" + }, + "uniqueItems": true, + "type": "array" + }, + "pagelen": { + "minimum": 1, + "type": "integer", + "description": "Current number of objects on the existing page. The default value is 10 with 100 being the maximum allowed value. Individual APIs may enforce different values." + }, + "size": { + "minimum": 0, + "type": "integer", + "description": "Total number of objects in the response. This is an optional element that is not provided in all responses, as it can be expensive to compute." + }, + "page": { + "minimum": 1, + "type": "integer", + "description": "Page number of the current results. This is an optional element that is not provided in all responses." + }, + "previous": { + "type": "string", + "description": "Link to previous page if it exists. A collections first page does not have this value. This is an optional element that is not provided in all responses. Some result sets strictly support forward navigation and never provide previous links. Clients must anticipate that backwards navigation is not always available. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + } + } + } + ] + }, + "account": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "An account object.", + "properties": { + "username": { + "pattern": "^[a-zA-Z0-9_\\-]+$", + "type": "string" + }, + "website": { + "type": "string" + }, + "display_name": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "links": { + "additionalProperties": false, + "type": "object", + "properties": { + "self": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "repositories": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "html": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "followers": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "avatar": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "following": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + } + } + }, + "created_on": { + "type": "string", + "format": "date-time" + } + } + } + ] + }, + "issue_attachment": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "An issue file attachment's meta data. Note this does not contain the file's actual contents.", + "properties": { + "name": { + "type": "string" + }, + "links": { + "additionalProperties": false, + "type": "object", + "properties": { + "self": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + } + } + } + } + } + ] + }, + "paginated_snippet_commit": { + "allOf": [ + { + "$ref": "#/definitions/page" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A paginated list of snippet commits.", + "properties": { + "values": { + "minItems": 0, + "items": { + "$ref": "#/definitions/snippet_commit" + }, + "type": "array" + } + } + } + ] + }, + "pullrequest": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A pull request object.", + "properties": { + "state": { + "enum": [ + "MERGED", + "SUPERSEDED", + "OPEN", + "DECLINED" + ], + "type": "string" + }, + "author": { + "$ref": "#/definitions/account" + }, + "id": { + "type": "integer" + }, + "links": { + "additionalProperties": false, + "type": "object", + "properties": { + "decline": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "commits": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "self": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "comments": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "merge": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "html": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "activity": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "diff": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "approve": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + } + } + }, + "title": { + "type": "string" + } + } + } + ] + }, + "paginated_teams": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A paginated list of teams.", + "properties": { + "next": { + "type": "string", + "description": "Link to the next page if it exists. The last page of a collection does not have this value. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + }, + "values": { + "minItems": 0, + "items": { + "$ref": "#/definitions/team" + }, + "uniqueItems": true, + "type": "array" + }, + "pagelen": { + "minimum": 1, + "type": "integer", + "description": "Current number of objects on the existing page. The default value is 10 with 100 being the maximum allowed value. Individual APIs may enforce different values." + }, + "size": { + "minimum": 0, + "type": "integer", + "description": "Total number of objects in the response. This is an optional element that is not provided in all responses, as it can be expensive to compute." + }, + "page": { + "minimum": 1, + "type": "integer", + "description": "Page number of the current results. This is an optional element that is not provided in all responses." + }, + "previous": { + "type": "string", + "description": "Link to previous page if it exists. A collections first page does not have this value. This is an optional element that is not provided in all responses. Some result sets strictly support forward navigation and never provide previous links. Clients must anticipate that backwards navigation is not always available. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + } + } + } + ] + }, + "paginated_snippet_comments": { + "allOf": [ + { + "$ref": "#/definitions/page" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A paginated list of snippet comments.", + "properties": { + "values": { + "minItems": 0, + "items": { + "$ref": "#/definitions/snippet_comment" + }, + "uniqueItems": true, + "type": "array" + } + } + } + ] + }, + "team": { + "allOf": [ + { + "$ref": "#/definitions/account" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A team object.", + "properties": {} + } + ] + }, + "commit": { + "allOf": [ + { + "$ref": "#/definitions/base_commit" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A repository commit object.", + "properties": { + "participants": { + "minItems": 0, + "items": { + "$ref": "#/definitions/participant" + }, + "type": "array" + }, + "repository": { + "$ref": "#/definitions/repository" + }, + "links": { + "additionalProperties": false, + "type": "object", + "properties": { + "self": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "comments": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "patch": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "html": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "diff": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + }, + "approve": { + "additionalProperties": false, + "type": "object", + "properties": { + "href": { + "type": "string", + "format": "uri" + } + } + } + } + } + } + } + ] + }, + "paginated_snippets": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "A paginated list of snippets.", + "properties": { + "next": { + "type": "string", + "description": "Link to the next page if it exists. The last page of a collection does not have this value. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + }, + "values": { + "minItems": 0, + "items": { + "$ref": "#/definitions/snippet" + }, + "uniqueItems": true, + "type": "array" + }, + "pagelen": { + "minimum": 1, + "type": "integer", + "description": "Current number of objects on the existing page. The default value is 10 with 100 being the maximum allowed value. Individual APIs may enforce different values." + }, + "size": { + "minimum": 0, + "type": "integer", + "description": "Total number of objects in the response. This is an optional element that is not provided in all responses, as it can be expensive to compute." + }, + "page": { + "minimum": 1, + "type": "integer", + "description": "Page number of the current results. This is an optional element that is not provided in all responses." + }, + "previous": { + "type": "string", + "description": "Link to previous page if it exists. A collections first page does not have this value. This is an optional element that is not provided in all responses. Some result sets strictly support forward navigation and never provide previous links. Clients must anticipate that backwards navigation is not always available. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + } + } + } + ] + }, + "page": { + "allOf": [ + { + "$ref": "#/definitions/object" + }, + { + "additionalProperties": true, + "type": "object", + "description": "Base type for most resource objects. It defines the common `type` element that identifies an object's type. It also identifies the element as Swagger's `discriminator`.", + "properties": { + "previous": { + "type": "string", + "description": "Link to previous page if it exists. A collections first page does not have this value. This is an optional element that is not provided in all responses. Some result sets strictly support forward navigation and never provide previous links. Clients must anticipate that backwards navigation is not always available. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + }, + "pagelen": { + "minimum": 1, + "type": "integer", + "description": "Current number of objects on the existing page. The default value is 10 with 100 being the maximum allowed value. Individual APIs may enforce different values." + }, + "next": { + "type": "string", + "description": "Link to the next page if it exists. The last page of a collection does not have this value. Use this link to navigate the result set and refrain from constructing your own URLs.", + "format": "uri" + }, + "page": { + "minimum": 1, + "type": "integer", + "description": "Page number of the current results. This is an optional element that is not provided in all responses." + }, + "size": { + "minimum": 0, + "type": "integer", + "description": "Total number of objects in the response. This is an optional element that is not provided in all responses, as it can be expensive to compute." + } + } + } + ] + } + }, + "swagger": "2.0", + "consumes": [ + "application/json" + ] +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/more_circulars/item.json b/vendor/github.com/go-openapi/spec/fixtures/more_circulars/item.json new file mode 100644 index 0000000000..34504a64d4 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/more_circulars/item.json @@ -0,0 +1,23 @@ +{ + "item": { + "type": "object", + "required": [ + "title" + ], + "properties": { + "id": { + "type": "integer", + "format": "uint64", + "readOnly": true + }, + "title": { + "type": "string", + "minLength": 2, + "maxLength": 80 + }, + "subitem": { + "$ref": "item.json#/item" + } + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/more_circulars/item2.json b/vendor/github.com/go-openapi/spec/fixtures/more_circulars/item2.json new file mode 100644 index 0000000000..99e8820ae3 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/more_circulars/item2.json @@ -0,0 +1,23 @@ +{ + "item": { + "type": "object", + "required": [ + "title" + ], + "properties": { + "id": { + "type": "integer", + "format": "uint64", + "readOnly": true + }, + "title": { + "type": "string", + "minLength": 2, + "maxLength": 80 + }, + "subitem": { + "$ref": "#/item" + } + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/more_circulars/item4.json b/vendor/github.com/go-openapi/spec/fixtures/more_circulars/item4.json new file mode 100644 index 0000000000..a90c371372 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/more_circulars/item4.json @@ -0,0 +1,23 @@ +{ + "item": { + "type": "object", + "required": [ + "title" + ], + "properties": { + "id": { + "type": "integer", + "format": "uint64", + "readOnly": true + }, + "title": { + "type": "string", + "minLength": 2, + "maxLength": 80 + }, + "subitem": { + "$ref": "item4.json#/item" + } + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/more_circulars/spec.json b/vendor/github.com/go-openapi/spec/fixtures/more_circulars/spec.json new file mode 100644 index 0000000000..74756f9b34 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/more_circulars/spec.json @@ -0,0 +1,57 @@ +{ + "swagger": "2.0", + "info": { + "title": "Item API", + "description": "Item API", + "version": "1.0.0" + }, + "host": "item.api.local", + "basePath": "/v1", + "securityDefinitions": { + "key": { + "type": "apiKey", + "name": "x-item-token", + "in": "header" + } + }, + "security": [ + { + "key": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "schemes": [ + "http" + ], + "responses": { + "itemResponse": { + "description": "Item", + "schema": { + "$ref": "item.json#/item" + } + } + }, + "paths": { + "/item": { + "get": { + "operationId": "GetItem", + "responses": { + "200": { + "description": "item detail response", + "schema": { + "$ref": "item.json#/item" + } + }, + "default": { + "$ref": "#/responses/itemResponse" + } + } + } + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/more_circulars/spec2.json b/vendor/github.com/go-openapi/spec/fixtures/more_circulars/spec2.json new file mode 100644 index 0000000000..401383003a --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/more_circulars/spec2.json @@ -0,0 +1,57 @@ +{ + "swagger": "2.0", + "info": { + "title": "Item API", + "description": "Item API", + "version": "1.0.0" + }, + "host": "item.api.local", + "basePath": "/v1", + "securityDefinitions": { + "key": { + "type": "apiKey", + "name": "x-item-token", + "in": "header" + } + }, + "security": [ + { + "key": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "schemes": [ + "http" + ], + "responses": { + "itemResponse": { + "description": "Item", + "schema": { + "$ref": "item2.json#/item" + } + } + }, + "paths": { + "/item": { + "get": { + "operationId": "GetItem", + "responses": { + "200": { + "description": "item detail response", + "schema": { + "$ref": "item2.json#/item" + } + }, + "default": { + "$ref": "#/responses/itemResponse" + } + } + } + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/more_circulars/spec3.json b/vendor/github.com/go-openapi/spec/fixtures/more_circulars/spec3.json new file mode 100644 index 0000000000..3c2f0e9b24 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/more_circulars/spec3.json @@ -0,0 +1,51 @@ +{ + "swagger": "2.0", + "info": { + "title": "Item API", + "description": "Item API", + "version": "1.0.0" + }, + "host": "item.api.local", + "basePath": "/v1", + "securityDefinitions": { + "key": { + "type": "apiKey", + "name": "x-item-token", + "in": "header" + } + }, + "security": [ + { + "key": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "schemes": [ + "http" + ], + "paths": { + "/item": { + "get": { + "operationId": "GetItem", + "responses": { + "200": { + "description": "item detail response", + "schema": { + "$ref": "#/definitions/myItems" + } + } + } + } + } + }, + "definitions": { + "myItems": { + "$ref": "item.json#/item" + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/more_circulars/spec4.json b/vendor/github.com/go-openapi/spec/fixtures/more_circulars/spec4.json new file mode 100644 index 0000000000..9db6ba94b4 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/more_circulars/spec4.json @@ -0,0 +1,59 @@ +{ + "swagger": "2.0", + "info": { + "title": "Item API", + "description": "Item API", + "version": "1.0.0" + }, + "host": "item.api.local", + "basePath": "/v1", + "securityDefinitions": { + "key": { + "type": "apiKey", + "name": "x-item-token", + "in": "header" + } + }, + "security": [ + { + "key": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "schemes": [ + "http" + ], + "parameters": { + "itemParameter": { + "description": "Item", + "schema": { + "$ref": "item4.json#/item" + } + } + }, + "paths": { + "/item": { + "get": { + "operationId": "GetItem", + "parameters": [ + { + "$ref": "#/parameters/itemParameter" + } + ], + "responses": { + "200": { + "description": "item detail response", + "schema": { + "$ref": "item4.json#/item" + } + } + } + } + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/remote/all-the-things.json b/vendor/github.com/go-openapi/spec/fixtures/remote/all-the-things.json new file mode 100644 index 0000000000..f8e615d3b9 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/remote/all-the-things.json @@ -0,0 +1,245 @@ +{ + "swagger": "2.0", + "info": { + "version": "1.0.0", + "title": "Swagger Petstore", + "description": + "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification", + "termsOfService": "http://helloreverb.com/terms/", + "contact": { + "name": "Wordnik API Team" + }, + "license": { + "name": "MIT" + } + }, + "host": "petstore.swagger.wordnik.com", + "basePath": "/api", + "schemes": ["http"], + "consumes": ["application/json"], + "produces": ["application/json"], + "parameters": { + "idParam": { + "name": "id", + "in": "path", + "description": "ID of pet to fetch", + "required": true, + "type": "integer", + "format": "int64" + }, + "tag": { + "type": "string", + "in": "query", + "required": false + }, + "query": { + "$ref": "#/parameters/tag" + } + }, + "responses": { + "petResponse": { + "description": "pet response", + "schema": { + "$ref": "pet/pet.json#/definitions/pet" + } + }, + "stringResponse": { + "descripion": "string response", + "schema": { + "type": "string" + } + }, + "anotherPet": { + "$ref": "pet/pet.json#/responses/anotherPet" + }, + "circularA": { + "$ref": "pet/pet.json#/responses/circularB" + } + }, + "paths": { + "/": { + "get": { + "operationId": "indexStuff", + "responses": { + "default": { + "$ref": "#/responses/stringResponse" + }, + "200": { + "$ref": "#/responses/anotherPet" + } + } + } + }, + "/pets": { + "get": { + "description": + "Returns all pets from the system that the user has access to", + "operationId": "findPets", + "produces": [ + "application/json", + "application/xml", + "text/xml", + "text/html" + ], + "parameters": [ + { + "name": "tags", + "in": "query", + "description": "tags to filter by", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "csv" + }, + { + "name": "limit", + "in": "query", + "description": "maximum number of results to return", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "responses": { + "200": { + "description": "pet response", + "schema": { + "type": "array", + "items": { + "$ref": "pet/pet.json#/definitions/pet" + } + } + }, + "default": { + "description": "unexpected error", + "schema": { + "$ref": "#/definitions/errorModel" + } + } + } + }, + "post": { + "description": + "Creates a new pet in the store. Duplicates are allowed", + "operationId": "addPet", + "produces": ["application/json"], + "parameters": [ + { + "name": "pet", + "in": "body", + "description": "Pet to add to the store", + "required": true, + "schema": { + "$ref": "#/definitions/petInput" + } + } + ], + "responses": { + "200": { "$ref": "#/responses/petResponse" }, + "default": { + "description": "unexpected error", + "schema": { + "$ref": "#/definitions/errorModel" + } + } + } + } + }, + "/pets/{id}": { + "get": { + "description": + "Returns a user based on a single ID, if the user does not have access to the pet", + "operationId": "findPetById", + "produces": [ + "application/json", + "application/xml", + "text/xml", + "text/html" + ], + "parameters": [ + { + "$ref": "#/parameters/idParam" + } + ], + "responses": { + "200": { + "$ref": "#/responses/petResponse" + }, + "default": { + "description": "unexpected error", + "schema": { + "$ref": "#/definitions/errorModel" + } + } + } + }, + "delete": { + "description": "deletes a single pet based on the ID supplied", + "operationId": "deletePet", + "parameters": [ + { + "$ref": "#/parameters/idParam" + } + ], + "responses": { + "204": { + "description": "pet deleted" + }, + "default": { + "description": "unexpected error", + "schema": { + "$ref": "#/definitions/errorModel" + } + } + } + } + } + }, + "definitions": { + "pet": { + "required": ["id", "name"], + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "tag": { + "type": "string" + } + } + }, + "petInput": { + "allOf": [ + { + "$ref": "pet/pet.json#/definitions/pet" + }, + { + "required": ["name"], + "properties": { + "id": { + "type": "integer", + "format": "int64" + } + } + } + ] + }, + "errorModel": { + "required": ["code", "message"], + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + } + } + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/remote/pet/pet.json b/vendor/github.com/go-openapi/spec/fixtures/remote/pet/pet.json new file mode 100644 index 0000000000..7b631f3e59 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/remote/pet/pet.json @@ -0,0 +1,42 @@ +{ + "responses": { + "petResponse": { + "description": "pet response", + "schema": { + "$ref": "#/definitions/pet" + } + }, + "stringResponse": { + "descripion": "string response", + "schema": { + "type": "string" + } + }, + "circularB": { + "$ref": "#/responses/circularC" + }, + "circularC": { + "$ref": "../all-the-things.json#/responses/circularA" + }, + "anotherPet": { + "$ref": "#/responses/petResponse" + } + }, + "definitions": { + "pet": { + "required": ["id", "name"], + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "tag": { + "type": "string" + } + } + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/specs/deeper/arrayProp.json b/vendor/github.com/go-openapi/spec/fixtures/specs/deeper/arrayProp.json new file mode 100644 index 0000000000..8f8dbf6baa --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/specs/deeper/arrayProp.json @@ -0,0 +1,6 @@ +{ + "type":"array", + "items": { + "type": "string" + } +} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/specs/deeper/stringProp.json b/vendor/github.com/go-openapi/spec/fixtures/specs/deeper/stringProp.json new file mode 100644 index 0000000000..169a0d70f6 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/specs/deeper/stringProp.json @@ -0,0 +1,3 @@ +{ + "type": "string" +} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/specs/refed.json b/vendor/github.com/go-openapi/spec/fixtures/specs/refed.json new file mode 100644 index 0000000000..142be8bb96 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/specs/refed.json @@ -0,0 +1,224 @@ +{ + "swagger": "2.0", + "info": { + "version": "1.0.0", + "title": "Swagger Petstore", + "description": "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification", + "termsOfService": "http://helloreverb.com/terms/", + "contact": { + "name": "Wordnik API Team" + }, + "license": { + "name": "MIT" + } + }, + "host": "petstore.swagger.wordnik.com", + "basePath": "/api", + "schemes": [ + "http" + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": { + "idParam": { + "name": "id", + "in": "path", + "description": "ID of pet to fetch", + "required": true, + "type": "integer", + "format": "int64" + } + }, + "responses": { + "petResponse": { + "description": "pet response", + "schema": { + "$ref": "#/definitions/pet" + } + } + }, + "paths": { + "/pets": { + "get": { + "description": "Returns all pets from the system that the user has access to", + "operationId": "findPets", + "produces": [ + "application/json", + "application/xml", + "text/xml", + "text/html" + ], + "parameters": [ + { + "name": "tags", + "in": "query", + "description": "tags to filter by", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "csv" + }, + { + "name": "limit", + "in": "query", + "description": "maximum number of results to return", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "responses": { + "200": { + "description": "pet response", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/pet" + } + } + }, + "default": { + "description": "unexpected error", + "schema": { + "$ref": "#/definitions/errorModel" + } + } + } + }, + "post": { + "description": "Creates a new pet in the store. Duplicates are allowed", + "operationId": "addPet", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "pet", + "in": "body", + "description": "Pet to add to the store", + "required": true, + "schema": { + "$ref": "#/definitions/petInput" + } + } + ], + "responses": { + "200": { "$ref": "#/responses/petResponse" }, + "default": { + "description": "unexpected error", + "schema": { + "$ref": "#/definitions/errorModel" + } + } + } + } + }, + "/pets/{id}": { + "get": { + "description": "Returns a user based on a single ID, if the user does not have access to the pet", + "operationId": "findPetById", + "produces": [ + "application/json", + "application/xml", + "text/xml", + "text/html" + ], + "parameters": [ + { + "$ref": "#/parameters/idParam" + } + ], + "responses": { + "200": { + "$ref": "#/responses/petResponse" + }, + "default": { + "description": "unexpected error", + "schema": { + "$ref": "#/definitions/errorModel" + } + } + } + }, + "delete": { + "description": "deletes a single pet based on the ID supplied", + "operationId": "deletePet", + "parameters": [ + { + "$ref": "#/parameters/idParam" + } + ], + "responses": { + "204": { + "description": "pet deleted" + }, + "default": { + "description": "unexpected error", + "schema": { + "$ref": "#/definitions/errorModel" + } + } + } + } + } + }, + "definitions": { + "pet": { + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "tag": { + "type": "string" + } + } + }, + "petInput": { + "allOf": [ + { + "$ref": "pet" + }, + { + "required": [ + "name" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64" + } + } + } + ] + }, + "errorModel": { + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + } + } + } + } +} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/specs/resolution.json b/vendor/github.com/go-openapi/spec/fixtures/specs/resolution.json new file mode 100644 index 0000000000..43cabe858d --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/specs/resolution.json @@ -0,0 +1,14 @@ +{ + "id": "http://localhost:1234", + "items": { + "id": "deeper/", + "items": { + "$ref": "stringProp.json" + } + }, + "definitions": { + "bool": { + "$ref": "boolProp.json" + } + } +} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/specs/resolution2.json b/vendor/github.com/go-openapi/spec/fixtures/specs/resolution2.json new file mode 100644 index 0000000000..5d7a00560d --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/specs/resolution2.json @@ -0,0 +1,9 @@ +{ + "id": "http://localhost:1234", + "items": { + "id": "deeper/", + "items": { + "$ref": "arrayProp.json#/items" + } + } +} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/specs/todos.common.json b/vendor/github.com/go-openapi/spec/fixtures/specs/todos.common.json new file mode 100644 index 0000000000..1c43908a61 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/specs/todos.common.json @@ -0,0 +1,103 @@ +{ + "swagger": "2.0", + "info": { + "version": "1.0", + "title": "To-do Demo", + "description": + "### Notes:\n\nThis OAS2 (Swagger 2) specification defines common models and responses, that other specifications may reference.\n\nFor example, check out the user poperty in the main.oas2 todo-partial model - it references the user model in this specification!\n\nLikewise, the main.oas2 operations reference the shared error responses in this common specification.", + "contact": { + "name": "Stoplight", + "url": "https://stoplight.io" + }, + "license": { + "name": "MIT" + } + }, + "host": "example.com", + "securityDefinitions": {}, + "paths": {}, + "responses": { + "401": { + "description": "", + "schema": { + "$ref": "#/definitions/error-response" + }, + "examples": { + "application/json": { + "status": "401", + "error": "Not Authorized" + } + } + }, + "403": { + "description": "", + "schema": { + "$ref": "#/definitions/error-response" + }, + "examples": { + "application/json": { + "status": "403", + "error": "Forbbiden" + } + } + }, + "404": { + "description": "", + "schema": { + "$ref": "#/definitions/error-response" + }, + "examples": { + "application/json": { + "status": "404", + "error": "Not Found" + } + } + }, + "500": { + "description": "", + "schema": { + "$ref": "#/definitions/error-response" + }, + "examples": { + "application/json": { + "status": "500", + "error": "Server Error" + } + } + } + }, + "definitions": { + "user": { + "title": "User", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The user's full name." + }, + "age": { + "type": "number", + "minimum": 0, + "maximum": 150 + }, + "error": { + "$ref": "#/definitions/error-response" + } + }, + "required": ["name", "age"] + }, + "error-response": { + "type": "object", + "title": "Error Response", + "properties": { + "status": { + "type": "string" + }, + "error": { + "type": "string" + } + }, + "required": ["status", "error"] + } + } +} diff --git a/vendor/github.com/go-openapi/spec/fixtures/specs/todos.json b/vendor/github.com/go-openapi/spec/fixtures/specs/todos.json new file mode 100644 index 0000000000..b9460bdc4f --- /dev/null +++ b/vendor/github.com/go-openapi/spec/fixtures/specs/todos.json @@ -0,0 +1,346 @@ +{ + "swagger": "2.0", + "info": { + "version": "1.0", + "title": "To-do Demo", + "description": "This OAS2 (Swagger 2) file represents a real API that lives at http://todos.stoplight.io.\n\nFor authentication information, click the apikey security scheme in the editor sidebar.", + "contact": { + "name": "Stoplight", + "url": "https://stoplight.io" + }, + "license": { + "name": "MIT" + } + }, + "host": "todos.stoplight.io", + "schemes": ["http"], + "consumes": ["application/json"], + "produces": ["application/json"], + "securityDefinitions": { + "Basic": { + "type": "basic" + }, + "API Key": { + "type": "apiKey", + "name": "apikey", + "in": "query" + } + }, + "paths": { + "/todos/{todoId}": { + "parameters": [{ + "name": "todoId", + "in": "path", + "required": true, + "type": "string" + }], + "get": { + "operationId": "GET_todo", + "summary": "Get Todo", + "tags": ["Todos"], + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/todo-full" + }, + "examples": { + "application/json": { + "id": 1, + "name": "get food", + "completed": false, + "completed_at": "1955-04-23T13:22:52.685Z", + "created_at": "1994-11-05T03:26:51.471Z", + "updated_at": "1989-07-29T11:30:06.701Z" + }, + "/todos/foobar": "{\n\t\"foo\": \"bar\"\n}\n", + "/todos/chores": { + "id": 9000, + "name": "Do Chores", + "completed": false, + "created_at": "2014-08-28T14:14:28.494Z", + "updated_at": "2014-08-28T14:14:28.494Z" + }, + "new": { + "name": "esse qui proident labore", + "completed": null, + "id": 920778, + "completed_at": "2014-01-07T07:49:55.123Z", + "created_at": "1948-04-21T12:04:21.282Z", + "updated_at": "1951-12-19T11:10:34.039Z", + "user": { + "name": "irure deserunt fugiat", + "age": 121.45395681110494 + }, + "float": -47990796.228164576 + } + } + }, + "404": { + "$ref": "./todos.common.json#/responses/404" + }, + "500": { + "$ref": "./todos.common.json#/responses/500" + } + }, + "parameters": [{ + "in": "query", + "name": "", + "type": "string" + }] + }, + "put": { + "operationId": "PUT_todos", + "summary": "Update Todo", + "tags": ["Todos"], + "parameters": [{ + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/todo-partial", + "example": { + "name": "my todo's new name", + "completed": false + } + } + }], + "responses": { + "200": { + "description": "", + "schema": { + "$ref": "#/definitions/todo-full" + }, + "examples": { + "application/json": { + "id": 9000, + "name": "It's Over 9000!!!", + "completed": true, + "completed_at": null, + "created_at": "2014-08-28T14:14:28.494Z", + "updated_at": "2015-08-28T14:14:28.494Z" + } + } + }, + "401": { + "$ref": "./todos.common.json#/responses/401" + }, + "404": { + "$ref": "./todos.common.json#/responses/404" + }, + "500": { + "$ref": "./todos.common.json#/responses/500" + } + }, + "security": [{ + "Basic": [] + }, + { + "API Key": [] + } + ] + }, + "delete": { + "operationId": "DELETE_todo", + "summary": "Delete Todo", + "tags": ["Todos"], + "responses": { + "204": { + "description": "" + }, + "401": { + "$ref": "./todos.common.json#/responses/401" + }, + "404": { + "$ref": "./todos.common.json#/responses/404" + }, + "500": { + "$ref": "./todos.common.json#/responses/500" + } + }, + "security": [{ + "Basic": [] + }, + { + "API Key": [] + } + ] + } + }, + "/todos": { + "post": { + "operationId": "POST_todos", + "summary": "Create Todo", + "tags": ["Todos"], + "parameters": [{ + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/todo-partial", + "example": { + "name": "my todo's name", + "completed": false + } + } + }], + "responses": { + "201": { + "description": "", + "schema": { + "$ref": "#/definitions/todo-full" + }, + "examples": { + "application/json": { + "id": 9000, + "name": "It's Over 9000!!!", + "completed": null, + "completed_at": null, + "created_at": "2014-08-28T14:14:28.494Z", + "updated_at": "2014-08-28T14:14:28.494Z" + }, + "/todos/chores": { + "id": 9000, + "name": "Do Chores", + "completed": false, + "created_at": "2014-08-28T14:14:28.494Z", + "updated_at": "2014-08-28T14:14:28.494Z" + } + } + }, + "401": { + "$ref": "./todos.common.json#/responses/401" + }, + "500": { + "$ref": "./todos.common.json#/responses/500" + } + }, + "security": [{ + "API Key": [] + }, + { + "Basic": [] + } + ], + "description": "This creates a Todo object.\n\nTesting `inline code`." + }, + "get": { + "operationId": "GET_todos", + "summary": "List Todos", + "tags": ["Todos"], + "parameters": [{ + "$ref": "#/parameters/limit" + }, + { + "$ref": "#/parameters/skip" + } + ], + "responses": { + "200": { + "description": "", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/todo-full" + } + }, + "examples": { + "application/json": [{ + "id": 1, + "name": "design the thingz", + "completed": true + }, + { + "id": 2, + "name": "mock the thingz", + "completed": true + }, + { + "id": 3, + "name": "code the thingz", + "completed": false + } + ], + "empty": [] + }, + "headers": { + "foo": { + "type": "string", + "default": "bar" + } + } + }, + "500": { + "$ref": "./todos.common.json#/responses/500" + } + }, + "description": "​" + } + } + }, + "parameters": { + "limit": { + "name": "limit", + "in": "query", + "description": "This is how it works.", + "required": false, + "type": "integer", + "maximum": 100 + }, + "skip": { + "name": "skip", + "in": "query", + "required": false, + "type": "string" + } + }, + "definitions": { + "todo-partial": { + "title": "Todo Partial", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "completed": { + "type": ["boolean", "null"] + } + }, + "required": ["name", "completed"] + }, + "todo-full": { + "title": "Todo Full", + "allOf": [{ + "$ref": "#/definitions/todo-partial" + }, + { + "type": "object", + "properties": { + "id": { + "type": "integer", + "minimum": 0, + "maximum": 1000000 + }, + "completed_at": { + "type": ["string", "null"], + "format": "date-time" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "user": { + "$ref": "./todos.common.json#/definitions/user" + } + }, + "required": ["id", "user"] + } + ] + } + }, + "tags": [{ + "name": "Todos" + }] +} diff --git a/vendor/github.com/go-openapi/spec/go.mod b/vendor/github.com/go-openapi/spec/go.mod new file mode 100644 index 0000000000..5af64c10b5 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/go.mod @@ -0,0 +1,16 @@ +module github.com/go-openapi/spec + +require ( + github.com/PuerkitoBio/purell v1.1.0 // indirect + github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-openapi/jsonpointer v0.17.0 + github.com/go-openapi/jsonreference v0.17.0 + github.com/go-openapi/swag v0.17.0 + github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/testify v1.2.2 + golang.org/x/net v0.0.0-20181005035420-146acd28ed58 // indirect + golang.org/x/text v0.3.0 // indirect + gopkg.in/yaml.v2 v2.2.1 +) diff --git a/vendor/github.com/go-openapi/spec/go.sum b/vendor/github.com/go-openapi/spec/go.sum new file mode 100644 index 0000000000..ab6bfb6086 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/go.sum @@ -0,0 +1,22 @@ +github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4= +github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-openapi/jsonpointer v0.17.0 h1:Bpl2DtZ6k7wKqfFs7e+4P08+M9I3FQgn09a1UsRUQbk= +github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonreference v0.17.0 h1:d/o7/fsLWWQZACbihvZxcyLQ59jfUVs7WOJv/ak7T7A= +github.com/go-openapi/jsonreference v0.17.0/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/swag v0.17.0 h1:7wu+dZ5k83kvUWeAb+WUkFiUhDzwGqzTR/NhWzeo1JU= +github.com/go-openapi/swag v0.17.0/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58 h1:otZG8yDCO4LVps5+9bxOeNiCvgmOyt96J3roHTYs7oE= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/go-openapi/spec/header.go b/vendor/github.com/go-openapi/spec/header.go new file mode 100644 index 0000000000..82f77f7709 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/header.go @@ -0,0 +1,193 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import ( + "encoding/json" + "strings" + + "github.com/go-openapi/jsonpointer" + "github.com/go-openapi/swag" +) + +// HeaderProps describes a response header +type HeaderProps struct { + Description string `json:"description,omitempty"` +} + +// Header describes a header for a response of the API +// +// For more information: http://goo.gl/8us55a#headerObject +type Header struct { + CommonValidations + SimpleSchema + VendorExtensible + HeaderProps +} + +// ResponseHeader creates a new header instance for use in a response +func ResponseHeader() *Header { + return new(Header) +} + +// WithDescription sets the description on this response, allows for chaining +func (h *Header) WithDescription(description string) *Header { + h.Description = description + return h +} + +// Typed a fluent builder method for the type of parameter +func (h *Header) Typed(tpe, format string) *Header { + h.Type = tpe + h.Format = format + return h +} + +// CollectionOf a fluent builder method for an array item +func (h *Header) CollectionOf(items *Items, format string) *Header { + h.Type = "array" + h.Items = items + h.CollectionFormat = format + return h +} + +// WithDefault sets the default value on this item +func (h *Header) WithDefault(defaultValue interface{}) *Header { + h.Default = defaultValue + return h +} + +// WithMaxLength sets a max length value +func (h *Header) WithMaxLength(max int64) *Header { + h.MaxLength = &max + return h +} + +// WithMinLength sets a min length value +func (h *Header) WithMinLength(min int64) *Header { + h.MinLength = &min + return h +} + +// WithPattern sets a pattern value +func (h *Header) WithPattern(pattern string) *Header { + h.Pattern = pattern + return h +} + +// WithMultipleOf sets a multiple of value +func (h *Header) WithMultipleOf(number float64) *Header { + h.MultipleOf = &number + return h +} + +// WithMaximum sets a maximum number value +func (h *Header) WithMaximum(max float64, exclusive bool) *Header { + h.Maximum = &max + h.ExclusiveMaximum = exclusive + return h +} + +// WithMinimum sets a minimum number value +func (h *Header) WithMinimum(min float64, exclusive bool) *Header { + h.Minimum = &min + h.ExclusiveMinimum = exclusive + return h +} + +// WithEnum sets a the enum values (replace) +func (h *Header) WithEnum(values ...interface{}) *Header { + h.Enum = append([]interface{}{}, values...) + return h +} + +// WithMaxItems sets the max items +func (h *Header) WithMaxItems(size int64) *Header { + h.MaxItems = &size + return h +} + +// WithMinItems sets the min items +func (h *Header) WithMinItems(size int64) *Header { + h.MinItems = &size + return h +} + +// UniqueValues dictates that this array can only have unique items +func (h *Header) UniqueValues() *Header { + h.UniqueItems = true + return h +} + +// AllowDuplicates this array can have duplicates +func (h *Header) AllowDuplicates() *Header { + h.UniqueItems = false + return h +} + +// MarshalJSON marshal this to JSON +func (h Header) MarshalJSON() ([]byte, error) { + b1, err := json.Marshal(h.CommonValidations) + if err != nil { + return nil, err + } + b2, err := json.Marshal(h.SimpleSchema) + if err != nil { + return nil, err + } + b3, err := json.Marshal(h.HeaderProps) + if err != nil { + return nil, err + } + return swag.ConcatJSON(b1, b2, b3), nil +} + +// UnmarshalJSON unmarshals this header from JSON +func (h *Header) UnmarshalJSON(data []byte) error { + if err := json.Unmarshal(data, &h.CommonValidations); err != nil { + return err + } + if err := json.Unmarshal(data, &h.SimpleSchema); err != nil { + return err + } + if err := json.Unmarshal(data, &h.VendorExtensible); err != nil { + return err + } + return json.Unmarshal(data, &h.HeaderProps) +} + +// JSONLookup look up a value by the json property name +func (h Header) JSONLookup(token string) (interface{}, error) { + if ex, ok := h.Extensions[token]; ok { + return &ex, nil + } + + r, _, err := jsonpointer.GetForToken(h.CommonValidations, token) + if err != nil && !strings.HasPrefix(err.Error(), "object has no field") { + return nil, err + } + if r != nil { + return r, nil + } + r, _, err = jsonpointer.GetForToken(h.SimpleSchema, token) + if err != nil && !strings.HasPrefix(err.Error(), "object has no field") { + return nil, err + } + if r != nil { + return r, nil + } + r, _, err = jsonpointer.GetForToken(h.HeaderProps, token) + return r, err +} diff --git a/vendor/github.com/go-openapi/spec/info.go b/vendor/github.com/go-openapi/spec/info.go new file mode 100644 index 0000000000..cfb37ec12a --- /dev/null +++ b/vendor/github.com/go-openapi/spec/info.go @@ -0,0 +1,168 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import ( + "encoding/json" + "strings" + + "github.com/go-openapi/jsonpointer" + "github.com/go-openapi/swag" +) + +// Extensions vendor specific extensions +type Extensions map[string]interface{} + +// Add adds a value to these extensions +func (e Extensions) Add(key string, value interface{}) { + realKey := strings.ToLower(key) + e[realKey] = value +} + +// GetString gets a string value from the extensions +func (e Extensions) GetString(key string) (string, bool) { + if v, ok := e[strings.ToLower(key)]; ok { + str, ok := v.(string) + return str, ok + } + return "", false +} + +// GetBool gets a string value from the extensions +func (e Extensions) GetBool(key string) (bool, bool) { + if v, ok := e[strings.ToLower(key)]; ok { + str, ok := v.(bool) + return str, ok + } + return false, false +} + +// GetStringSlice gets a string value from the extensions +func (e Extensions) GetStringSlice(key string) ([]string, bool) { + if v, ok := e[strings.ToLower(key)]; ok { + arr, isSlice := v.([]interface{}) + if !isSlice { + return nil, false + } + var strs []string + for _, iface := range arr { + str, isString := iface.(string) + if !isString { + return nil, false + } + strs = append(strs, str) + } + return strs, ok + } + return nil, false +} + +// VendorExtensible composition block. +type VendorExtensible struct { + Extensions Extensions +} + +// AddExtension adds an extension to this extensible object +func (v *VendorExtensible) AddExtension(key string, value interface{}) { + if value == nil { + return + } + if v.Extensions == nil { + v.Extensions = make(map[string]interface{}) + } + v.Extensions.Add(key, value) +} + +// MarshalJSON marshals the extensions to json +func (v VendorExtensible) MarshalJSON() ([]byte, error) { + toser := make(map[string]interface{}) + for k, v := range v.Extensions { + lk := strings.ToLower(k) + if strings.HasPrefix(lk, "x-") { + toser[k] = v + } + } + return json.Marshal(toser) +} + +// UnmarshalJSON for this extensible object +func (v *VendorExtensible) UnmarshalJSON(data []byte) error { + var d map[string]interface{} + if err := json.Unmarshal(data, &d); err != nil { + return err + } + for k, vv := range d { + lk := strings.ToLower(k) + if strings.HasPrefix(lk, "x-") { + if v.Extensions == nil { + v.Extensions = map[string]interface{}{} + } + v.Extensions[k] = vv + } + } + return nil +} + +// InfoProps the properties for an info definition +type InfoProps struct { + Description string `json:"description,omitempty"` + Title string `json:"title,omitempty"` + TermsOfService string `json:"termsOfService,omitempty"` + Contact *ContactInfo `json:"contact,omitempty"` + License *License `json:"license,omitempty"` + Version string `json:"version,omitempty"` +} + +// Info object provides metadata about the API. +// The metadata can be used by the clients if needed, and can be presented in the Swagger-UI for convenience. +// +// For more information: http://goo.gl/8us55a#infoObject +type Info struct { + VendorExtensible + InfoProps +} + +// JSONLookup look up a value by the json property name +func (i Info) JSONLookup(token string) (interface{}, error) { + if ex, ok := i.Extensions[token]; ok { + return &ex, nil + } + r, _, err := jsonpointer.GetForToken(i.InfoProps, token) + return r, err +} + +// MarshalJSON marshal this to JSON +func (i Info) MarshalJSON() ([]byte, error) { + b1, err := json.Marshal(i.InfoProps) + if err != nil { + return nil, err + } + b2, err := json.Marshal(i.VendorExtensible) + if err != nil { + return nil, err + } + return swag.ConcatJSON(b1, b2), nil +} + +// UnmarshalJSON marshal this from JSON +func (i *Info) UnmarshalJSON(data []byte) error { + if err := json.Unmarshal(data, &i.InfoProps); err != nil { + return err + } + if err := json.Unmarshal(data, &i.VendorExtensible); err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/go-openapi/spec/items.go b/vendor/github.com/go-openapi/spec/items.go new file mode 100644 index 0000000000..cf42989716 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/items.go @@ -0,0 +1,233 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import ( + "encoding/json" + "strings" + + "github.com/go-openapi/jsonpointer" + "github.com/go-openapi/swag" +) + +// SimpleSchema describe swagger simple schemas for parameters and headers +type SimpleSchema struct { + Type string `json:"type,omitempty"` + Format string `json:"format,omitempty"` + Items *Items `json:"items,omitempty"` + CollectionFormat string `json:"collectionFormat,omitempty"` + Default interface{} `json:"default,omitempty"` + Example interface{} `json:"example,omitempty"` +} + +// TypeName return the type (or format) of a simple schema +func (s *SimpleSchema) TypeName() string { + if s.Format != "" { + return s.Format + } + return s.Type +} + +// ItemsTypeName yields the type of items in a simple schema array +func (s *SimpleSchema) ItemsTypeName() string { + if s.Items == nil { + return "" + } + return s.Items.TypeName() +} + +// CommonValidations describe common JSON-schema validations +type CommonValidations struct { + Maximum *float64 `json:"maximum,omitempty"` + ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"` + Minimum *float64 `json:"minimum,omitempty"` + ExclusiveMinimum bool `json:"exclusiveMinimum,omitempty"` + MaxLength *int64 `json:"maxLength,omitempty"` + MinLength *int64 `json:"minLength,omitempty"` + Pattern string `json:"pattern,omitempty"` + MaxItems *int64 `json:"maxItems,omitempty"` + MinItems *int64 `json:"minItems,omitempty"` + UniqueItems bool `json:"uniqueItems,omitempty"` + MultipleOf *float64 `json:"multipleOf,omitempty"` + Enum []interface{} `json:"enum,omitempty"` +} + +// Items a limited subset of JSON-Schema's items object. +// It is used by parameter definitions that are not located in "body". +// +// For more information: http://goo.gl/8us55a#items-object +type Items struct { + Refable + CommonValidations + SimpleSchema + VendorExtensible +} + +// NewItems creates a new instance of items +func NewItems() *Items { + return &Items{} +} + +// Typed a fluent builder method for the type of item +func (i *Items) Typed(tpe, format string) *Items { + i.Type = tpe + i.Format = format + return i +} + +// CollectionOf a fluent builder method for an array item +func (i *Items) CollectionOf(items *Items, format string) *Items { + i.Type = "array" + i.Items = items + i.CollectionFormat = format + return i +} + +// WithDefault sets the default value on this item +func (i *Items) WithDefault(defaultValue interface{}) *Items { + i.Default = defaultValue + return i +} + +// WithMaxLength sets a max length value +func (i *Items) WithMaxLength(max int64) *Items { + i.MaxLength = &max + return i +} + +// WithMinLength sets a min length value +func (i *Items) WithMinLength(min int64) *Items { + i.MinLength = &min + return i +} + +// WithPattern sets a pattern value +func (i *Items) WithPattern(pattern string) *Items { + i.Pattern = pattern + return i +} + +// WithMultipleOf sets a multiple of value +func (i *Items) WithMultipleOf(number float64) *Items { + i.MultipleOf = &number + return i +} + +// WithMaximum sets a maximum number value +func (i *Items) WithMaximum(max float64, exclusive bool) *Items { + i.Maximum = &max + i.ExclusiveMaximum = exclusive + return i +} + +// WithMinimum sets a minimum number value +func (i *Items) WithMinimum(min float64, exclusive bool) *Items { + i.Minimum = &min + i.ExclusiveMinimum = exclusive + return i +} + +// WithEnum sets a the enum values (replace) +func (i *Items) WithEnum(values ...interface{}) *Items { + i.Enum = append([]interface{}{}, values...) + return i +} + +// WithMaxItems sets the max items +func (i *Items) WithMaxItems(size int64) *Items { + i.MaxItems = &size + return i +} + +// WithMinItems sets the min items +func (i *Items) WithMinItems(size int64) *Items { + i.MinItems = &size + return i +} + +// UniqueValues dictates that this array can only have unique items +func (i *Items) UniqueValues() *Items { + i.UniqueItems = true + return i +} + +// AllowDuplicates this array can have duplicates +func (i *Items) AllowDuplicates() *Items { + i.UniqueItems = false + return i +} + +// UnmarshalJSON hydrates this items instance with the data from JSON +func (i *Items) UnmarshalJSON(data []byte) error { + var validations CommonValidations + if err := json.Unmarshal(data, &validations); err != nil { + return err + } + var ref Refable + if err := json.Unmarshal(data, &ref); err != nil { + return err + } + var simpleSchema SimpleSchema + if err := json.Unmarshal(data, &simpleSchema); err != nil { + return err + } + var vendorExtensible VendorExtensible + if err := json.Unmarshal(data, &vendorExtensible); err != nil { + return err + } + i.Refable = ref + i.CommonValidations = validations + i.SimpleSchema = simpleSchema + i.VendorExtensible = vendorExtensible + return nil +} + +// MarshalJSON converts this items object to JSON +func (i Items) MarshalJSON() ([]byte, error) { + b1, err := json.Marshal(i.CommonValidations) + if err != nil { + return nil, err + } + b2, err := json.Marshal(i.SimpleSchema) + if err != nil { + return nil, err + } + b3, err := json.Marshal(i.Refable) + if err != nil { + return nil, err + } + b4, err := json.Marshal(i.VendorExtensible) + if err != nil { + return nil, err + } + return swag.ConcatJSON(b4, b3, b1, b2), nil +} + +// JSONLookup look up a value by the json property name +func (i Items) JSONLookup(token string) (interface{}, error) { + if token == "$ref" { + return &i.Ref, nil + } + + r, _, err := jsonpointer.GetForToken(i.CommonValidations, token) + if err != nil && !strings.HasPrefix(err.Error(), "object has no field") { + return nil, err + } + if r != nil { + return r, nil + } + r, _, err = jsonpointer.GetForToken(i.SimpleSchema, token) + return r, err +} diff --git a/vendor/github.com/go-openapi/spec/license.go b/vendor/github.com/go-openapi/spec/license.go new file mode 100644 index 0000000000..f20961b4fd --- /dev/null +++ b/vendor/github.com/go-openapi/spec/license.go @@ -0,0 +1,23 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +// License information for the exposed API. +// +// For more information: http://goo.gl/8us55a#licenseObject +type License struct { + Name string `json:"name,omitempty"` + URL string `json:"url,omitempty"` +} diff --git a/vendor/github.com/go-openapi/spec/operation.go b/vendor/github.com/go-openapi/spec/operation.go new file mode 100644 index 0000000000..344e317765 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/operation.go @@ -0,0 +1,390 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import ( + "bytes" + "encoding/gob" + "encoding/json" + + "github.com/go-openapi/jsonpointer" + "github.com/go-openapi/swag" +) + +func init() { + //gob.Register(map[string][]interface{}{}) + gob.Register(map[string]interface{}{}) + gob.Register([]interface{}{}) +} + +// OperationProps describes an operation +type OperationProps struct { + Description string `json:"description,omitempty"` + Consumes []string `json:"consumes,omitempty"` + Produces []string `json:"produces,omitempty"` + Schemes []string `json:"schemes,omitempty"` // the scheme, when present must be from [http, https, ws, wss] + Tags []string `json:"tags,omitempty"` + Summary string `json:"summary,omitempty"` + ExternalDocs *ExternalDocumentation `json:"externalDocs,omitempty"` + ID string `json:"operationId,omitempty"` + Deprecated bool `json:"deprecated,omitempty"` + Security []map[string][]string `json:"security,omitempty"` //Special case, see MarshalJSON function + Parameters []Parameter `json:"parameters,omitempty"` + Responses *Responses `json:"responses,omitempty"` +} + +// MarshalJSON takes care of serializing operation properties to JSON +// +// We use a custom marhaller here to handle a special cases related to +// the Security field. We need to preserve zero length slice +// while omitting the field when the value is nil/unset. +func (op OperationProps) MarshalJSON() ([]byte, error) { + type Alias OperationProps + if op.Security == nil { + return json.Marshal(&struct { + Security []map[string][]string `json:"security,omitempty"` + *Alias + }{ + Security: op.Security, + Alias: (*Alias)(&op), + }) + } + return json.Marshal(&struct { + Security []map[string][]string `json:"security"` + *Alias + }{ + Security: op.Security, + Alias: (*Alias)(&op), + }) +} + +// Operation describes a single API operation on a path. +// +// For more information: http://goo.gl/8us55a#operationObject +type Operation struct { + VendorExtensible + OperationProps +} + +// SuccessResponse gets a success response model +func (o *Operation) SuccessResponse() (*Response, int, bool) { + if o.Responses == nil { + return nil, 0, false + } + + for k, v := range o.Responses.StatusCodeResponses { + if k/100 == 2 { + return &v, k, true + } + } + + return o.Responses.Default, 0, false +} + +// JSONLookup look up a value by the json property name +func (o Operation) JSONLookup(token string) (interface{}, error) { + if ex, ok := o.Extensions[token]; ok { + return &ex, nil + } + r, _, err := jsonpointer.GetForToken(o.OperationProps, token) + return r, err +} + +// UnmarshalJSON hydrates this items instance with the data from JSON +func (o *Operation) UnmarshalJSON(data []byte) error { + if err := json.Unmarshal(data, &o.OperationProps); err != nil { + return err + } + if err := json.Unmarshal(data, &o.VendorExtensible); err != nil { + return err + } + return nil +} + +// MarshalJSON converts this items object to JSON +func (o Operation) MarshalJSON() ([]byte, error) { + b1, err := json.Marshal(o.OperationProps) + if err != nil { + return nil, err + } + b2, err := json.Marshal(o.VendorExtensible) + if err != nil { + return nil, err + } + concated := swag.ConcatJSON(b1, b2) + return concated, nil +} + +// NewOperation creates a new operation instance. +// It expects an ID as parameter but not passing an ID is also valid. +func NewOperation(id string) *Operation { + op := new(Operation) + op.ID = id + return op +} + +// WithID sets the ID property on this operation, allows for chaining. +func (o *Operation) WithID(id string) *Operation { + o.ID = id + return o +} + +// WithDescription sets the description on this operation, allows for chaining +func (o *Operation) WithDescription(description string) *Operation { + o.Description = description + return o +} + +// WithSummary sets the summary on this operation, allows for chaining +func (o *Operation) WithSummary(summary string) *Operation { + o.Summary = summary + return o +} + +// WithExternalDocs sets/removes the external docs for/from this operation. +// When you pass empty strings as params the external documents will be removed. +// When you pass non-empty string as one value then those values will be used on the external docs object. +// So when you pass a non-empty description, you should also pass the url and vice versa. +func (o *Operation) WithExternalDocs(description, url string) *Operation { + if description == "" && url == "" { + o.ExternalDocs = nil + return o + } + + if o.ExternalDocs == nil { + o.ExternalDocs = &ExternalDocumentation{} + } + o.ExternalDocs.Description = description + o.ExternalDocs.URL = url + return o +} + +// Deprecate marks the operation as deprecated +func (o *Operation) Deprecate() *Operation { + o.Deprecated = true + return o +} + +// Undeprecate marks the operation as not deprected +func (o *Operation) Undeprecate() *Operation { + o.Deprecated = false + return o +} + +// WithConsumes adds media types for incoming body values +func (o *Operation) WithConsumes(mediaTypes ...string) *Operation { + o.Consumes = append(o.Consumes, mediaTypes...) + return o +} + +// WithProduces adds media types for outgoing body values +func (o *Operation) WithProduces(mediaTypes ...string) *Operation { + o.Produces = append(o.Produces, mediaTypes...) + return o +} + +// WithTags adds tags for this operation +func (o *Operation) WithTags(tags ...string) *Operation { + o.Tags = append(o.Tags, tags...) + return o +} + +// AddParam adds a parameter to this operation, when a parameter for that location +// and with that name already exists it will be replaced +func (o *Operation) AddParam(param *Parameter) *Operation { + if param == nil { + return o + } + + for i, p := range o.Parameters { + if p.Name == param.Name && p.In == param.In { + params := append(o.Parameters[:i], *param) + params = append(params, o.Parameters[i+1:]...) + o.Parameters = params + return o + } + } + + o.Parameters = append(o.Parameters, *param) + return o +} + +// RemoveParam removes a parameter from the operation +func (o *Operation) RemoveParam(name, in string) *Operation { + for i, p := range o.Parameters { + if p.Name == name && p.In == name { + o.Parameters = append(o.Parameters[:i], o.Parameters[i+1:]...) + return o + } + } + return o +} + +// SecuredWith adds a security scope to this operation. +func (o *Operation) SecuredWith(name string, scopes ...string) *Operation { + o.Security = append(o.Security, map[string][]string{name: scopes}) + return o +} + +// WithDefaultResponse adds a default response to the operation. +// Passing a nil value will remove the response +func (o *Operation) WithDefaultResponse(response *Response) *Operation { + return o.RespondsWith(0, response) +} + +// RespondsWith adds a status code response to the operation. +// When the code is 0 the value of the response will be used as default response value. +// When the value of the response is nil it will be removed from the operation +func (o *Operation) RespondsWith(code int, response *Response) *Operation { + if o.Responses == nil { + o.Responses = new(Responses) + } + if code == 0 { + o.Responses.Default = response + return o + } + if response == nil { + delete(o.Responses.StatusCodeResponses, code) + return o + } + if o.Responses.StatusCodeResponses == nil { + o.Responses.StatusCodeResponses = make(map[int]Response) + } + o.Responses.StatusCodeResponses[code] = *response + return o +} + +type opsAlias OperationProps + +type gobAlias struct { + Security []map[string]struct { + List []string + Pad bool + } + Alias *opsAlias + SecurityIsEmpty bool +} + +// GobEncode provides a safe gob encoder for Operation, including empty security requirements +func (o Operation) GobEncode() ([]byte, error) { + raw := struct { + Ext VendorExtensible + Props OperationProps + }{ + Ext: o.VendorExtensible, + Props: o.OperationProps, + } + var b bytes.Buffer + err := gob.NewEncoder(&b).Encode(raw) + return b.Bytes(), err +} + +// GobDecode provides a safe gob decoder for Operation, including empty security requirements +func (o *Operation) GobDecode(b []byte) error { + var raw struct { + Ext VendorExtensible + Props OperationProps + } + + buf := bytes.NewBuffer(b) + err := gob.NewDecoder(buf).Decode(&raw) + if err != nil { + return err + } + o.VendorExtensible = raw.Ext + o.OperationProps = raw.Props + return nil +} + +// GobEncode provides a safe gob encoder for Operation, including empty security requirements +func (op OperationProps) GobEncode() ([]byte, error) { + raw := gobAlias{ + Alias: (*opsAlias)(&op), + } + + var b bytes.Buffer + if op.Security == nil { + // nil security requirement + err := gob.NewEncoder(&b).Encode(raw) + return b.Bytes(), err + } + + if len(op.Security) == 0 { + // empty, but non-nil security requirement + raw.SecurityIsEmpty = true + raw.Alias.Security = nil + err := gob.NewEncoder(&b).Encode(raw) + return b.Bytes(), err + } + + raw.Security = make([]map[string]struct { + List []string + Pad bool + }, 0, len(op.Security)) + for _, req := range op.Security { + v := make(map[string]struct { + List []string + Pad bool + }, len(req)) + for k, val := range req { + v[k] = struct { + List []string + Pad bool + }{ + List: val, + } + } + raw.Security = append(raw.Security, v) + } + + err := gob.NewEncoder(&b).Encode(raw) + return b.Bytes(), err +} + +// GobDecode provides a safe gob decoder for Operation, including empty security requirements +func (op *OperationProps) GobDecode(b []byte) error { + var raw gobAlias + + buf := bytes.NewBuffer(b) + err := gob.NewDecoder(buf).Decode(&raw) + if err != nil { + return err + } + if raw.Alias == nil { + return nil + } + + switch { + case raw.SecurityIsEmpty: + // empty, but non-nil security requirement + raw.Alias.Security = []map[string][]string{} + case len(raw.Alias.Security) == 0: + // nil security requirement + raw.Alias.Security = nil + default: + raw.Alias.Security = make([]map[string][]string, 0, len(raw.Security)) + for _, req := range raw.Security { + v := make(map[string][]string, len(req)) + for k, val := range req { + v[k] = make([]string, 0, len(val.List)) + v[k] = append(v[k], val.List...) + } + raw.Alias.Security = append(raw.Alias.Security, v) + } + } + + *op = *(*OperationProps)(raw.Alias) + return nil +} diff --git a/vendor/github.com/go-openapi/spec/parameter.go b/vendor/github.com/go-openapi/spec/parameter.go new file mode 100644 index 0000000000..cb1a88d252 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/parameter.go @@ -0,0 +1,302 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import ( + "encoding/json" + "strings" + + "github.com/go-openapi/jsonpointer" + "github.com/go-openapi/swag" +) + +// QueryParam creates a query parameter +func QueryParam(name string) *Parameter { + return &Parameter{ParamProps: ParamProps{Name: name, In: "query"}} +} + +// HeaderParam creates a header parameter, this is always required by default +func HeaderParam(name string) *Parameter { + return &Parameter{ParamProps: ParamProps{Name: name, In: "header", Required: true}} +} + +// PathParam creates a path parameter, this is always required +func PathParam(name string) *Parameter { + return &Parameter{ParamProps: ParamProps{Name: name, In: "path", Required: true}} +} + +// BodyParam creates a body parameter +func BodyParam(name string, schema *Schema) *Parameter { + return &Parameter{ParamProps: ParamProps{Name: name, In: "body", Schema: schema}, SimpleSchema: SimpleSchema{Type: "object"}} +} + +// FormDataParam creates a body parameter +func FormDataParam(name string) *Parameter { + return &Parameter{ParamProps: ParamProps{Name: name, In: "formData"}} +} + +// FileParam creates a body parameter +func FileParam(name string) *Parameter { + return &Parameter{ParamProps: ParamProps{Name: name, In: "formData"}, SimpleSchema: SimpleSchema{Type: "file"}} +} + +// SimpleArrayParam creates a param for a simple array (string, int, date etc) +func SimpleArrayParam(name, tpe, fmt string) *Parameter { + return &Parameter{ParamProps: ParamProps{Name: name}, SimpleSchema: SimpleSchema{Type: "array", CollectionFormat: "csv", Items: &Items{SimpleSchema: SimpleSchema{Type: "string", Format: fmt}}}} +} + +// ParamRef creates a parameter that's a json reference +func ParamRef(uri string) *Parameter { + p := new(Parameter) + p.Ref = MustCreateRef(uri) + return p +} + +// ParamProps describes the specific attributes of an operation parameter +type ParamProps struct { + Description string `json:"description,omitempty"` + Name string `json:"name,omitempty"` + In string `json:"in,omitempty"` + Required bool `json:"required,omitempty"` + Schema *Schema `json:"schema,omitempty"` // when in == "body" + AllowEmptyValue bool `json:"allowEmptyValue,omitempty"` // when in == "query" || "formData" +} + +// Parameter a unique parameter is defined by a combination of a [name](#parameterName) and [location](#parameterIn). +// +// There are five possible parameter types. +// * Path - Used together with [Path Templating](#pathTemplating), where the parameter value is actually part of the operation's URL. This does not include the host or base path of the API. For example, in `/items/{itemId}`, the path parameter is `itemId`. +// * Query - Parameters that are appended to the URL. For example, in `/items?id=###`, the query parameter is `id`. +// * Header - Custom headers that are expected as part of the request. +// * Body - The payload that's appended to the HTTP request. Since there can only be one payload, there can only be *one* body parameter. The name of the body parameter has no effect on the parameter itself and is used for documentation purposes only. Since Form parameters are also in the payload, body and form parameters cannot exist together for the same operation. +// * Form - Used to describe the payload of an HTTP request when either `application/x-www-form-urlencoded` or `multipart/form-data` are used as the content type of the request (in Swagger's definition, the [`consumes`](#operationConsumes) property of an operation). This is the only parameter type that can be used to send files, thus supporting the `file` type. Since form parameters are sent in the payload, they cannot be declared together with a body parameter for the same operation. Form parameters have a different format based on the content-type used (for further details, consult http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4): +// * `application/x-www-form-urlencoded` - Similar to the format of Query parameters but as a payload. For example, `foo=1&bar=swagger` - both `foo` and `bar` are form parameters. This is normally used for simple parameters that are being transferred. +// * `multipart/form-data` - each parameter takes a section in the payload with an internal header. For example, for the header `Content-Disposition: form-data; name="submit-name"` the name of the parameter is `submit-name`. This type of form parameters is more commonly used for file transfers. +// +// For more information: http://goo.gl/8us55a#parameterObject +type Parameter struct { + Refable + CommonValidations + SimpleSchema + VendorExtensible + ParamProps +} + +// JSONLookup look up a value by the json property name +func (p Parameter) JSONLookup(token string) (interface{}, error) { + if ex, ok := p.Extensions[token]; ok { + return &ex, nil + } + if token == "$ref" { + return &p.Ref, nil + } + + r, _, err := jsonpointer.GetForToken(p.CommonValidations, token) + if err != nil && !strings.HasPrefix(err.Error(), "object has no field") { + return nil, err + } + if r != nil { + return r, nil + } + r, _, err = jsonpointer.GetForToken(p.SimpleSchema, token) + if err != nil && !strings.HasPrefix(err.Error(), "object has no field") { + return nil, err + } + if r != nil { + return r, nil + } + r, _, err = jsonpointer.GetForToken(p.ParamProps, token) + return r, err +} + +// WithDescription a fluent builder method for the description of the parameter +func (p *Parameter) WithDescription(description string) *Parameter { + p.Description = description + return p +} + +// Named a fluent builder method to override the name of the parameter +func (p *Parameter) Named(name string) *Parameter { + p.Name = name + return p +} + +// WithLocation a fluent builder method to override the location of the parameter +func (p *Parameter) WithLocation(in string) *Parameter { + p.In = in + return p +} + +// Typed a fluent builder method for the type of the parameter value +func (p *Parameter) Typed(tpe, format string) *Parameter { + p.Type = tpe + p.Format = format + return p +} + +// CollectionOf a fluent builder method for an array parameter +func (p *Parameter) CollectionOf(items *Items, format string) *Parameter { + p.Type = "array" + p.Items = items + p.CollectionFormat = format + return p +} + +// WithDefault sets the default value on this parameter +func (p *Parameter) WithDefault(defaultValue interface{}) *Parameter { + p.AsOptional() // with default implies optional + p.Default = defaultValue + return p +} + +// AllowsEmptyValues flags this parameter as being ok with empty values +func (p *Parameter) AllowsEmptyValues() *Parameter { + p.AllowEmptyValue = true + return p +} + +// NoEmptyValues flags this parameter as not liking empty values +func (p *Parameter) NoEmptyValues() *Parameter { + p.AllowEmptyValue = false + return p +} + +// AsOptional flags this parameter as optional +func (p *Parameter) AsOptional() *Parameter { + p.Required = false + return p +} + +// AsRequired flags this parameter as required +func (p *Parameter) AsRequired() *Parameter { + if p.Default != nil { // with a default required makes no sense + return p + } + p.Required = true + return p +} + +// WithMaxLength sets a max length value +func (p *Parameter) WithMaxLength(max int64) *Parameter { + p.MaxLength = &max + return p +} + +// WithMinLength sets a min length value +func (p *Parameter) WithMinLength(min int64) *Parameter { + p.MinLength = &min + return p +} + +// WithPattern sets a pattern value +func (p *Parameter) WithPattern(pattern string) *Parameter { + p.Pattern = pattern + return p +} + +// WithMultipleOf sets a multiple of value +func (p *Parameter) WithMultipleOf(number float64) *Parameter { + p.MultipleOf = &number + return p +} + +// WithMaximum sets a maximum number value +func (p *Parameter) WithMaximum(max float64, exclusive bool) *Parameter { + p.Maximum = &max + p.ExclusiveMaximum = exclusive + return p +} + +// WithMinimum sets a minimum number value +func (p *Parameter) WithMinimum(min float64, exclusive bool) *Parameter { + p.Minimum = &min + p.ExclusiveMinimum = exclusive + return p +} + +// WithEnum sets a the enum values (replace) +func (p *Parameter) WithEnum(values ...interface{}) *Parameter { + p.Enum = append([]interface{}{}, values...) + return p +} + +// WithMaxItems sets the max items +func (p *Parameter) WithMaxItems(size int64) *Parameter { + p.MaxItems = &size + return p +} + +// WithMinItems sets the min items +func (p *Parameter) WithMinItems(size int64) *Parameter { + p.MinItems = &size + return p +} + +// UniqueValues dictates that this array can only have unique items +func (p *Parameter) UniqueValues() *Parameter { + p.UniqueItems = true + return p +} + +// AllowDuplicates this array can have duplicates +func (p *Parameter) AllowDuplicates() *Parameter { + p.UniqueItems = false + return p +} + +// UnmarshalJSON hydrates this items instance with the data from JSON +func (p *Parameter) UnmarshalJSON(data []byte) error { + if err := json.Unmarshal(data, &p.CommonValidations); err != nil { + return err + } + if err := json.Unmarshal(data, &p.Refable); err != nil { + return err + } + if err := json.Unmarshal(data, &p.SimpleSchema); err != nil { + return err + } + if err := json.Unmarshal(data, &p.VendorExtensible); err != nil { + return err + } + if err := json.Unmarshal(data, &p.ParamProps); err != nil { + return err + } + return nil +} + +// MarshalJSON converts this items object to JSON +func (p Parameter) MarshalJSON() ([]byte, error) { + b1, err := json.Marshal(p.CommonValidations) + if err != nil { + return nil, err + } + b2, err := json.Marshal(p.SimpleSchema) + if err != nil { + return nil, err + } + b3, err := json.Marshal(p.Refable) + if err != nil { + return nil, err + } + b4, err := json.Marshal(p.VendorExtensible) + if err != nil { + return nil, err + } + b5, err := json.Marshal(p.ParamProps) + if err != nil { + return nil, err + } + return swag.ConcatJSON(b3, b1, b2, b4, b5), nil +} diff --git a/vendor/github.com/go-openapi/spec/path_item.go b/vendor/github.com/go-openapi/spec/path_item.go new file mode 100644 index 0000000000..a8ae63ece5 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/path_item.go @@ -0,0 +1,90 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import ( + "encoding/json" + + "github.com/go-openapi/jsonpointer" + "github.com/go-openapi/swag" +) + +// PathItemProps the path item specific properties +type PathItemProps struct { + Get *Operation `json:"get,omitempty"` + Put *Operation `json:"put,omitempty"` + Post *Operation `json:"post,omitempty"` + Delete *Operation `json:"delete,omitempty"` + Options *Operation `json:"options,omitempty"` + Head *Operation `json:"head,omitempty"` + Patch *Operation `json:"patch,omitempty"` + Parameters []Parameter `json:"parameters,omitempty"` +} + +// PathItem describes the operations available on a single path. +// A Path Item may be empty, due to [ACL constraints](http://goo.gl/8us55a#securityFiltering). +// The path itself is still exposed to the documentation viewer but they will +// not know which operations and parameters are available. +// +// For more information: http://goo.gl/8us55a#pathItemObject +type PathItem struct { + Refable + VendorExtensible + PathItemProps +} + +// JSONLookup look up a value by the json property name +func (p PathItem) JSONLookup(token string) (interface{}, error) { + if ex, ok := p.Extensions[token]; ok { + return &ex, nil + } + if token == "$ref" { + return &p.Ref, nil + } + r, _, err := jsonpointer.GetForToken(p.PathItemProps, token) + return r, err +} + +// UnmarshalJSON hydrates this items instance with the data from JSON +func (p *PathItem) UnmarshalJSON(data []byte) error { + if err := json.Unmarshal(data, &p.Refable); err != nil { + return err + } + if err := json.Unmarshal(data, &p.VendorExtensible); err != nil { + return err + } + if err := json.Unmarshal(data, &p.PathItemProps); err != nil { + return err + } + return nil +} + +// MarshalJSON converts this items object to JSON +func (p PathItem) MarshalJSON() ([]byte, error) { + b3, err := json.Marshal(p.Refable) + if err != nil { + return nil, err + } + b4, err := json.Marshal(p.VendorExtensible) + if err != nil { + return nil, err + } + b5, err := json.Marshal(p.PathItemProps) + if err != nil { + return nil, err + } + concated := swag.ConcatJSON(b3, b4, b5) + return concated, nil +} diff --git a/vendor/github.com/go-openapi/spec/paths.go b/vendor/github.com/go-openapi/spec/paths.go new file mode 100644 index 0000000000..9dc82a2901 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/paths.go @@ -0,0 +1,97 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import ( + "encoding/json" + "fmt" + "strings" + + "github.com/go-openapi/swag" +) + +// Paths holds the relative paths to the individual endpoints. +// The path is appended to the [`basePath`](http://goo.gl/8us55a#swaggerBasePath) in order +// to construct the full URL. +// The Paths may be empty, due to [ACL constraints](http://goo.gl/8us55a#securityFiltering). +// +// For more information: http://goo.gl/8us55a#pathsObject +type Paths struct { + VendorExtensible + Paths map[string]PathItem `json:"-"` // custom serializer to flatten this, each entry must start with "/" +} + +// JSONLookup look up a value by the json property name +func (p Paths) JSONLookup(token string) (interface{}, error) { + if pi, ok := p.Paths[token]; ok { + return &pi, nil + } + if ex, ok := p.Extensions[token]; ok { + return &ex, nil + } + return nil, fmt.Errorf("object has no field %q", token) +} + +// UnmarshalJSON hydrates this items instance with the data from JSON +func (p *Paths) UnmarshalJSON(data []byte) error { + var res map[string]json.RawMessage + if err := json.Unmarshal(data, &res); err != nil { + return err + } + for k, v := range res { + if strings.HasPrefix(strings.ToLower(k), "x-") { + if p.Extensions == nil { + p.Extensions = make(map[string]interface{}) + } + var d interface{} + if err := json.Unmarshal(v, &d); err != nil { + return err + } + p.Extensions[k] = d + } + if strings.HasPrefix(k, "/") { + if p.Paths == nil { + p.Paths = make(map[string]PathItem) + } + var pi PathItem + if err := json.Unmarshal(v, &pi); err != nil { + return err + } + p.Paths[k] = pi + } + } + return nil +} + +// MarshalJSON converts this items object to JSON +func (p Paths) MarshalJSON() ([]byte, error) { + b1, err := json.Marshal(p.VendorExtensible) + if err != nil { + return nil, err + } + + pths := make(map[string]PathItem) + for k, v := range p.Paths { + if strings.HasPrefix(k, "/") { + pths[k] = v + } + } + b2, err := json.Marshal(pths) + if err != nil { + return nil, err + } + concated := swag.ConcatJSON(b1, b2) + return concated, nil +} diff --git a/vendor/github.com/go-openapi/spec/ref.go b/vendor/github.com/go-openapi/spec/ref.go new file mode 100644 index 0000000000..08ff869b2f --- /dev/null +++ b/vendor/github.com/go-openapi/spec/ref.go @@ -0,0 +1,191 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import ( + "bytes" + "encoding/gob" + "encoding/json" + "net/http" + "os" + "path/filepath" + + "github.com/go-openapi/jsonreference" +) + +// Refable is a struct for things that accept a $ref property +type Refable struct { + Ref Ref +} + +// MarshalJSON marshals the ref to json +func (r Refable) MarshalJSON() ([]byte, error) { + return r.Ref.MarshalJSON() +} + +// UnmarshalJSON unmarshalss the ref from json +func (r *Refable) UnmarshalJSON(d []byte) error { + return json.Unmarshal(d, &r.Ref) +} + +// Ref represents a json reference that is potentially resolved +type Ref struct { + jsonreference.Ref +} + +// RemoteURI gets the remote uri part of the ref +func (r *Ref) RemoteURI() string { + if r.String() == "" { + return r.String() + } + + u := *r.GetURL() + u.Fragment = "" + return u.String() +} + +// IsValidURI returns true when the url the ref points to can be found +func (r *Ref) IsValidURI(basepaths ...string) bool { + if r.String() == "" { + return true + } + + v := r.RemoteURI() + if v == "" { + return true + } + + if r.HasFullURL { + rr, err := http.Get(v) + if err != nil { + return false + } + + return rr.StatusCode/100 == 2 + } + + if !(r.HasFileScheme || r.HasFullFilePath || r.HasURLPathOnly) { + return false + } + + // check for local file + pth := v + if r.HasURLPathOnly { + base := "." + if len(basepaths) > 0 { + base = filepath.Dir(filepath.Join(basepaths...)) + } + p, e := filepath.Abs(filepath.ToSlash(filepath.Join(base, pth))) + if e != nil { + return false + } + pth = p + } + + fi, err := os.Stat(filepath.ToSlash(pth)) + if err != nil { + return false + } + + return !fi.IsDir() +} + +// Inherits creates a new reference from a parent and a child +// If the child cannot inherit from the parent, an error is returned +func (r *Ref) Inherits(child Ref) (*Ref, error) { + ref, err := r.Ref.Inherits(child.Ref) + if err != nil { + return nil, err + } + return &Ref{Ref: *ref}, nil +} + +// NewRef creates a new instance of a ref object +// returns an error when the reference uri is an invalid uri +func NewRef(refURI string) (Ref, error) { + ref, err := jsonreference.New(refURI) + if err != nil { + return Ref{}, err + } + return Ref{Ref: ref}, nil +} + +// MustCreateRef creates a ref object but panics when refURI is invalid. +// Use the NewRef method for a version that returns an error. +func MustCreateRef(refURI string) Ref { + return Ref{Ref: jsonreference.MustCreateRef(refURI)} +} + +// MarshalJSON marshals this ref into a JSON object +func (r Ref) MarshalJSON() ([]byte, error) { + str := r.String() + if str == "" { + if r.IsRoot() { + return []byte(`{"$ref":""}`), nil + } + return []byte("{}"), nil + } + v := map[string]interface{}{"$ref": str} + return json.Marshal(v) +} + +// UnmarshalJSON unmarshals this ref from a JSON object +func (r *Ref) UnmarshalJSON(d []byte) error { + var v map[string]interface{} + if err := json.Unmarshal(d, &v); err != nil { + return err + } + return r.fromMap(v) +} + +// GobEncode provides a safe gob encoder for Ref +func (r Ref) GobEncode() ([]byte, error) { + var b bytes.Buffer + raw, err := r.MarshalJSON() + if err != nil { + return nil, err + } + err = gob.NewEncoder(&b).Encode(raw) + return b.Bytes(), err +} + +// GobDecode provides a safe gob decoder for Ref +func (r *Ref) GobDecode(b []byte) error { + var raw []byte + buf := bytes.NewBuffer(b) + err := gob.NewDecoder(buf).Decode(&raw) + if err != nil { + return err + } + return json.Unmarshal(raw, r) +} + +func (r *Ref) fromMap(v map[string]interface{}) error { + if v == nil { + return nil + } + + if vv, ok := v["$ref"]; ok { + if str, ok := vv.(string); ok { + ref, err := jsonreference.New(str) + if err != nil { + return err + } + *r = Ref{Ref: ref} + } + } + + return nil +} diff --git a/vendor/github.com/go-openapi/spec/response.go b/vendor/github.com/go-openapi/spec/response.go new file mode 100644 index 0000000000..586db0d780 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/response.go @@ -0,0 +1,134 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import ( + "encoding/json" + + "github.com/go-openapi/jsonpointer" + "github.com/go-openapi/swag" +) + +// ResponseProps properties specific to a response +type ResponseProps struct { + Description string `json:"description,omitempty"` + Schema *Schema `json:"schema,omitempty"` + Headers map[string]Header `json:"headers,omitempty"` + Examples map[string]interface{} `json:"examples,omitempty"` +} + +// Response describes a single response from an API Operation. +// +// For more information: http://goo.gl/8us55a#responseObject +type Response struct { + Refable + ResponseProps + VendorExtensible +} + +// JSONLookup look up a value by the json property name +func (r Response) JSONLookup(token string) (interface{}, error) { + if ex, ok := r.Extensions[token]; ok { + return &ex, nil + } + if token == "$ref" { + return &r.Ref, nil + } + ptr, _, err := jsonpointer.GetForToken(r.ResponseProps, token) + return ptr, err +} + +// UnmarshalJSON hydrates this items instance with the data from JSON +func (r *Response) UnmarshalJSON(data []byte) error { + if err := json.Unmarshal(data, &r.ResponseProps); err != nil { + return err + } + if err := json.Unmarshal(data, &r.Refable); err != nil { + return err + } + if err := json.Unmarshal(data, &r.VendorExtensible); err != nil { + return err + } + return nil +} + +// MarshalJSON converts this items object to JSON +func (r Response) MarshalJSON() ([]byte, error) { + b1, err := json.Marshal(r.ResponseProps) + if err != nil { + return nil, err + } + b2, err := json.Marshal(r.Refable) + if err != nil { + return nil, err + } + b3, err := json.Marshal(r.VendorExtensible) + if err != nil { + return nil, err + } + return swag.ConcatJSON(b1, b2, b3), nil +} + +// NewResponse creates a new response instance +func NewResponse() *Response { + return new(Response) +} + +// ResponseRef creates a response as a json reference +func ResponseRef(url string) *Response { + resp := NewResponse() + resp.Ref = MustCreateRef(url) + return resp +} + +// WithDescription sets the description on this response, allows for chaining +func (r *Response) WithDescription(description string) *Response { + r.Description = description + return r +} + +// WithSchema sets the schema on this response, allows for chaining. +// Passing a nil argument removes the schema from this response +func (r *Response) WithSchema(schema *Schema) *Response { + r.Schema = schema + return r +} + +// AddHeader adds a header to this response +func (r *Response) AddHeader(name string, header *Header) *Response { + if header == nil { + return r.RemoveHeader(name) + } + if r.Headers == nil { + r.Headers = make(map[string]Header) + } + r.Headers[name] = *header + return r +} + +// RemoveHeader removes a header from this response +func (r *Response) RemoveHeader(name string) *Response { + delete(r.Headers, name) + return r +} + +// AddExample adds an example to this response +func (r *Response) AddExample(mediaType string, example interface{}) *Response { + if r.Examples == nil { + r.Examples = make(map[string]interface{}) + } + r.Examples[mediaType] = example + return r +} diff --git a/vendor/github.com/go-openapi/spec/responses.go b/vendor/github.com/go-openapi/spec/responses.go new file mode 100644 index 0000000000..4efb6f868b --- /dev/null +++ b/vendor/github.com/go-openapi/spec/responses.go @@ -0,0 +1,127 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import ( + "encoding/json" + "fmt" + "reflect" + "strconv" + + "github.com/go-openapi/swag" +) + +// Responses is a container for the expected responses of an operation. +// The container maps a HTTP response code to the expected response. +// It is not expected from the documentation to necessarily cover all possible HTTP response codes, +// since they may not be known in advance. However, it is expected from the documentation to cover +// a successful operation response and any known errors. +// +// The `default` can be used a default response object for all HTTP codes that are not covered +// individually by the specification. +// +// The `Responses Object` MUST contain at least one response code, and it SHOULD be the response +// for a successful operation call. +// +// For more information: http://goo.gl/8us55a#responsesObject +type Responses struct { + VendorExtensible + ResponsesProps +} + +// JSONLookup implements an interface to customize json pointer lookup +func (r Responses) JSONLookup(token string) (interface{}, error) { + if token == "default" { + return r.Default, nil + } + if ex, ok := r.Extensions[token]; ok { + return &ex, nil + } + if i, err := strconv.Atoi(token); err == nil { + if scr, ok := r.StatusCodeResponses[i]; ok { + return scr, nil + } + } + return nil, fmt.Errorf("object has no field %q", token) +} + +// UnmarshalJSON hydrates this items instance with the data from JSON +func (r *Responses) UnmarshalJSON(data []byte) error { + if err := json.Unmarshal(data, &r.ResponsesProps); err != nil { + return err + } + if err := json.Unmarshal(data, &r.VendorExtensible); err != nil { + return err + } + if reflect.DeepEqual(ResponsesProps{}, r.ResponsesProps) { + r.ResponsesProps = ResponsesProps{} + } + return nil +} + +// MarshalJSON converts this items object to JSON +func (r Responses) MarshalJSON() ([]byte, error) { + b1, err := json.Marshal(r.ResponsesProps) + if err != nil { + return nil, err + } + b2, err := json.Marshal(r.VendorExtensible) + if err != nil { + return nil, err + } + concated := swag.ConcatJSON(b1, b2) + return concated, nil +} + +// ResponsesProps describes all responses for an operation. +// It tells what is the default response and maps all responses with a +// HTTP status code. +type ResponsesProps struct { + Default *Response + StatusCodeResponses map[int]Response +} + +// MarshalJSON marshals responses as JSON +func (r ResponsesProps) MarshalJSON() ([]byte, error) { + toser := map[string]Response{} + if r.Default != nil { + toser["default"] = *r.Default + } + for k, v := range r.StatusCodeResponses { + toser[strconv.Itoa(k)] = v + } + return json.Marshal(toser) +} + +// UnmarshalJSON unmarshals responses from JSON +func (r *ResponsesProps) UnmarshalJSON(data []byte) error { + var res map[string]Response + if err := json.Unmarshal(data, &res); err != nil { + return nil + } + if v, ok := res["default"]; ok { + r.Default = &v + delete(res, "default") + } + for k, v := range res { + if nk, err := strconv.Atoi(k); err == nil { + if r.StatusCodeResponses == nil { + r.StatusCodeResponses = map[int]Response{} + } + r.StatusCodeResponses[nk] = v + } + } + return nil +} diff --git a/vendor/github.com/go-openapi/spec/schema.go b/vendor/github.com/go-openapi/spec/schema.go new file mode 100644 index 0000000000..b9481e29bc --- /dev/null +++ b/vendor/github.com/go-openapi/spec/schema.go @@ -0,0 +1,636 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import ( + "encoding/json" + "fmt" + "net/url" + "strings" + + "github.com/go-openapi/jsonpointer" + "github.com/go-openapi/swag" +) + +// BooleanProperty creates a boolean property +func BooleanProperty() *Schema { + return &Schema{SchemaProps: SchemaProps{Type: []string{"boolean"}}} +} + +// BoolProperty creates a boolean property +func BoolProperty() *Schema { return BooleanProperty() } + +// StringProperty creates a string property +func StringProperty() *Schema { + return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}}} +} + +// CharProperty creates a string property +func CharProperty() *Schema { + return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}}} +} + +// Float64Property creates a float64/double property +func Float64Property() *Schema { + return &Schema{SchemaProps: SchemaProps{Type: []string{"number"}, Format: "double"}} +} + +// Float32Property creates a float32/float property +func Float32Property() *Schema { + return &Schema{SchemaProps: SchemaProps{Type: []string{"number"}, Format: "float"}} +} + +// Int8Property creates an int8 property +func Int8Property() *Schema { + return &Schema{SchemaProps: SchemaProps{Type: []string{"integer"}, Format: "int8"}} +} + +// Int16Property creates an int16 property +func Int16Property() *Schema { + return &Schema{SchemaProps: SchemaProps{Type: []string{"integer"}, Format: "int16"}} +} + +// Int32Property creates an int32 property +func Int32Property() *Schema { + return &Schema{SchemaProps: SchemaProps{Type: []string{"integer"}, Format: "int32"}} +} + +// Int64Property creates an int64 property +func Int64Property() *Schema { + return &Schema{SchemaProps: SchemaProps{Type: []string{"integer"}, Format: "int64"}} +} + +// StrFmtProperty creates a property for the named string format +func StrFmtProperty(format string) *Schema { + return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}, Format: format}} +} + +// DateProperty creates a date property +func DateProperty() *Schema { + return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}, Format: "date"}} +} + +// DateTimeProperty creates a date time property +func DateTimeProperty() *Schema { + return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}, Format: "date-time"}} +} + +// MapProperty creates a map property +func MapProperty(property *Schema) *Schema { + return &Schema{SchemaProps: SchemaProps{Type: []string{"object"}, AdditionalProperties: &SchemaOrBool{Allows: true, Schema: property}}} +} + +// RefProperty creates a ref property +func RefProperty(name string) *Schema { + return &Schema{SchemaProps: SchemaProps{Ref: MustCreateRef(name)}} +} + +// RefSchema creates a ref property +func RefSchema(name string) *Schema { + return &Schema{SchemaProps: SchemaProps{Ref: MustCreateRef(name)}} +} + +// ArrayProperty creates an array property +func ArrayProperty(items *Schema) *Schema { + if items == nil { + return &Schema{SchemaProps: SchemaProps{Type: []string{"array"}}} + } + return &Schema{SchemaProps: SchemaProps{Items: &SchemaOrArray{Schema: items}, Type: []string{"array"}}} +} + +// ComposedSchema creates a schema with allOf +func ComposedSchema(schemas ...Schema) *Schema { + s := new(Schema) + s.AllOf = schemas + return s +} + +// SchemaURL represents a schema url +type SchemaURL string + +// MarshalJSON marshal this to JSON +func (r SchemaURL) MarshalJSON() ([]byte, error) { + if r == "" { + return []byte("{}"), nil + } + v := map[string]interface{}{"$schema": string(r)} + return json.Marshal(v) +} + +// UnmarshalJSON unmarshal this from JSON +func (r *SchemaURL) UnmarshalJSON(data []byte) error { + var v map[string]interface{} + if err := json.Unmarshal(data, &v); err != nil { + return err + } + return r.fromMap(v) +} + +func (r *SchemaURL) fromMap(v map[string]interface{}) error { + if v == nil { + return nil + } + if vv, ok := v["$schema"]; ok { + if str, ok := vv.(string); ok { + u, err := url.Parse(str) + if err != nil { + return err + } + + *r = SchemaURL(u.String()) + } + } + return nil +} + +// type ExtraSchemaProps map[string]interface{} + +// // JSONSchema represents a structure that is a json schema draft 04 +// type JSONSchema struct { +// SchemaProps +// ExtraSchemaProps +// } + +// // MarshalJSON marshal this to JSON +// func (s JSONSchema) MarshalJSON() ([]byte, error) { +// b1, err := json.Marshal(s.SchemaProps) +// if err != nil { +// return nil, err +// } +// b2, err := s.Ref.MarshalJSON() +// if err != nil { +// return nil, err +// } +// b3, err := s.Schema.MarshalJSON() +// if err != nil { +// return nil, err +// } +// b4, err := json.Marshal(s.ExtraSchemaProps) +// if err != nil { +// return nil, err +// } +// return swag.ConcatJSON(b1, b2, b3, b4), nil +// } + +// // UnmarshalJSON marshal this from JSON +// func (s *JSONSchema) UnmarshalJSON(data []byte) error { +// var sch JSONSchema +// if err := json.Unmarshal(data, &sch.SchemaProps); err != nil { +// return err +// } +// if err := json.Unmarshal(data, &sch.Ref); err != nil { +// return err +// } +// if err := json.Unmarshal(data, &sch.Schema); err != nil { +// return err +// } +// if err := json.Unmarshal(data, &sch.ExtraSchemaProps); err != nil { +// return err +// } +// *s = sch +// return nil +// } + +// SchemaProps describes a JSON schema (draft 4) +type SchemaProps struct { + ID string `json:"id,omitempty"` + Ref Ref `json:"-"` + Schema SchemaURL `json:"-"` + Description string `json:"description,omitempty"` + Type StringOrArray `json:"type,omitempty"` + Format string `json:"format,omitempty"` + Title string `json:"title,omitempty"` + Default interface{} `json:"default,omitempty"` + Maximum *float64 `json:"maximum,omitempty"` + ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"` + Minimum *float64 `json:"minimum,omitempty"` + ExclusiveMinimum bool `json:"exclusiveMinimum,omitempty"` + MaxLength *int64 `json:"maxLength,omitempty"` + MinLength *int64 `json:"minLength,omitempty"` + Pattern string `json:"pattern,omitempty"` + MaxItems *int64 `json:"maxItems,omitempty"` + MinItems *int64 `json:"minItems,omitempty"` + UniqueItems bool `json:"uniqueItems,omitempty"` + MultipleOf *float64 `json:"multipleOf,omitempty"` + Enum []interface{} `json:"enum,omitempty"` + MaxProperties *int64 `json:"maxProperties,omitempty"` + MinProperties *int64 `json:"minProperties,omitempty"` + Required []string `json:"required,omitempty"` + Items *SchemaOrArray `json:"items,omitempty"` + AllOf []Schema `json:"allOf,omitempty"` + OneOf []Schema `json:"oneOf,omitempty"` + AnyOf []Schema `json:"anyOf,omitempty"` + Not *Schema `json:"not,omitempty"` + Properties map[string]Schema `json:"properties,omitempty"` + AdditionalProperties *SchemaOrBool `json:"additionalProperties,omitempty"` + PatternProperties map[string]Schema `json:"patternProperties,omitempty"` + Dependencies Dependencies `json:"dependencies,omitempty"` + AdditionalItems *SchemaOrBool `json:"additionalItems,omitempty"` + Definitions Definitions `json:"definitions,omitempty"` +} + +// SwaggerSchemaProps are additional properties supported by swagger schemas, but not JSON-schema (draft 4) +type SwaggerSchemaProps struct { + Discriminator string `json:"discriminator,omitempty"` + ReadOnly bool `json:"readOnly,omitempty"` + XML *XMLObject `json:"xml,omitempty"` + ExternalDocs *ExternalDocumentation `json:"externalDocs,omitempty"` + Example interface{} `json:"example,omitempty"` +} + +// Schema the schema object allows the definition of input and output data types. +// These types can be objects, but also primitives and arrays. +// This object is based on the [JSON Schema Specification Draft 4](http://json-schema.org/) +// and uses a predefined subset of it. +// On top of this subset, there are extensions provided by this specification to allow for more complete documentation. +// +// For more information: http://goo.gl/8us55a#schemaObject +type Schema struct { + VendorExtensible + SchemaProps + SwaggerSchemaProps + ExtraProps map[string]interface{} `json:"-"` +} + +// JSONLookup implements an interface to customize json pointer lookup +func (s Schema) JSONLookup(token string) (interface{}, error) { + if ex, ok := s.Extensions[token]; ok { + return &ex, nil + } + + if ex, ok := s.ExtraProps[token]; ok { + return &ex, nil + } + + r, _, err := jsonpointer.GetForToken(s.SchemaProps, token) + if r != nil || (err != nil && !strings.HasPrefix(err.Error(), "object has no field")) { + return r, err + } + r, _, err = jsonpointer.GetForToken(s.SwaggerSchemaProps, token) + return r, err +} + +// WithID sets the id for this schema, allows for chaining +func (s *Schema) WithID(id string) *Schema { + s.ID = id + return s +} + +// WithTitle sets the title for this schema, allows for chaining +func (s *Schema) WithTitle(title string) *Schema { + s.Title = title + return s +} + +// WithDescription sets the description for this schema, allows for chaining +func (s *Schema) WithDescription(description string) *Schema { + s.Description = description + return s +} + +// WithProperties sets the properties for this schema +func (s *Schema) WithProperties(schemas map[string]Schema) *Schema { + s.Properties = schemas + return s +} + +// SetProperty sets a property on this schema +func (s *Schema) SetProperty(name string, schema Schema) *Schema { + if s.Properties == nil { + s.Properties = make(map[string]Schema) + } + s.Properties[name] = schema + return s +} + +// WithAllOf sets the all of property +func (s *Schema) WithAllOf(schemas ...Schema) *Schema { + s.AllOf = schemas + return s +} + +// WithMaxProperties sets the max number of properties an object can have +func (s *Schema) WithMaxProperties(max int64) *Schema { + s.MaxProperties = &max + return s +} + +// WithMinProperties sets the min number of properties an object must have +func (s *Schema) WithMinProperties(min int64) *Schema { + s.MinProperties = &min + return s +} + +// Typed sets the type of this schema for a single value item +func (s *Schema) Typed(tpe, format string) *Schema { + s.Type = []string{tpe} + s.Format = format + return s +} + +// AddType adds a type with potential format to the types for this schema +func (s *Schema) AddType(tpe, format string) *Schema { + s.Type = append(s.Type, tpe) + if format != "" { + s.Format = format + } + return s +} + +// CollectionOf a fluent builder method for an array parameter +func (s *Schema) CollectionOf(items Schema) *Schema { + s.Type = []string{"array"} + s.Items = &SchemaOrArray{Schema: &items} + return s +} + +// WithDefault sets the default value on this parameter +func (s *Schema) WithDefault(defaultValue interface{}) *Schema { + s.Default = defaultValue + return s +} + +// WithRequired flags this parameter as required +func (s *Schema) WithRequired(items ...string) *Schema { + s.Required = items + return s +} + +// AddRequired adds field names to the required properties array +func (s *Schema) AddRequired(items ...string) *Schema { + s.Required = append(s.Required, items...) + return s +} + +// WithMaxLength sets a max length value +func (s *Schema) WithMaxLength(max int64) *Schema { + s.MaxLength = &max + return s +} + +// WithMinLength sets a min length value +func (s *Schema) WithMinLength(min int64) *Schema { + s.MinLength = &min + return s +} + +// WithPattern sets a pattern value +func (s *Schema) WithPattern(pattern string) *Schema { + s.Pattern = pattern + return s +} + +// WithMultipleOf sets a multiple of value +func (s *Schema) WithMultipleOf(number float64) *Schema { + s.MultipleOf = &number + return s +} + +// WithMaximum sets a maximum number value +func (s *Schema) WithMaximum(max float64, exclusive bool) *Schema { + s.Maximum = &max + s.ExclusiveMaximum = exclusive + return s +} + +// WithMinimum sets a minimum number value +func (s *Schema) WithMinimum(min float64, exclusive bool) *Schema { + s.Minimum = &min + s.ExclusiveMinimum = exclusive + return s +} + +// WithEnum sets a the enum values (replace) +func (s *Schema) WithEnum(values ...interface{}) *Schema { + s.Enum = append([]interface{}{}, values...) + return s +} + +// WithMaxItems sets the max items +func (s *Schema) WithMaxItems(size int64) *Schema { + s.MaxItems = &size + return s +} + +// WithMinItems sets the min items +func (s *Schema) WithMinItems(size int64) *Schema { + s.MinItems = &size + return s +} + +// UniqueValues dictates that this array can only have unique items +func (s *Schema) UniqueValues() *Schema { + s.UniqueItems = true + return s +} + +// AllowDuplicates this array can have duplicates +func (s *Schema) AllowDuplicates() *Schema { + s.UniqueItems = false + return s +} + +// AddToAllOf adds a schema to the allOf property +func (s *Schema) AddToAllOf(schemas ...Schema) *Schema { + s.AllOf = append(s.AllOf, schemas...) + return s +} + +// WithDiscriminator sets the name of the discriminator field +func (s *Schema) WithDiscriminator(discriminator string) *Schema { + s.Discriminator = discriminator + return s +} + +// AsReadOnly flags this schema as readonly +func (s *Schema) AsReadOnly() *Schema { + s.ReadOnly = true + return s +} + +// AsWritable flags this schema as writeable (not read-only) +func (s *Schema) AsWritable() *Schema { + s.ReadOnly = false + return s +} + +// WithExample sets the example for this schema +func (s *Schema) WithExample(example interface{}) *Schema { + s.Example = example + return s +} + +// WithExternalDocs sets/removes the external docs for/from this schema. +// When you pass empty strings as params the external documents will be removed. +// When you pass non-empty string as one value then those values will be used on the external docs object. +// So when you pass a non-empty description, you should also pass the url and vice versa. +func (s *Schema) WithExternalDocs(description, url string) *Schema { + if description == "" && url == "" { + s.ExternalDocs = nil + return s + } + + if s.ExternalDocs == nil { + s.ExternalDocs = &ExternalDocumentation{} + } + s.ExternalDocs.Description = description + s.ExternalDocs.URL = url + return s +} + +// WithXMLName sets the xml name for the object +func (s *Schema) WithXMLName(name string) *Schema { + if s.XML == nil { + s.XML = new(XMLObject) + } + s.XML.Name = name + return s +} + +// WithXMLNamespace sets the xml namespace for the object +func (s *Schema) WithXMLNamespace(namespace string) *Schema { + if s.XML == nil { + s.XML = new(XMLObject) + } + s.XML.Namespace = namespace + return s +} + +// WithXMLPrefix sets the xml prefix for the object +func (s *Schema) WithXMLPrefix(prefix string) *Schema { + if s.XML == nil { + s.XML = new(XMLObject) + } + s.XML.Prefix = prefix + return s +} + +// AsXMLAttribute flags this object as xml attribute +func (s *Schema) AsXMLAttribute() *Schema { + if s.XML == nil { + s.XML = new(XMLObject) + } + s.XML.Attribute = true + return s +} + +// AsXMLElement flags this object as an xml node +func (s *Schema) AsXMLElement() *Schema { + if s.XML == nil { + s.XML = new(XMLObject) + } + s.XML.Attribute = false + return s +} + +// AsWrappedXML flags this object as wrapped, this is mostly useful for array types +func (s *Schema) AsWrappedXML() *Schema { + if s.XML == nil { + s.XML = new(XMLObject) + } + s.XML.Wrapped = true + return s +} + +// AsUnwrappedXML flags this object as an xml node +func (s *Schema) AsUnwrappedXML() *Schema { + if s.XML == nil { + s.XML = new(XMLObject) + } + s.XML.Wrapped = false + return s +} + +// MarshalJSON marshal this to JSON +func (s Schema) MarshalJSON() ([]byte, error) { + b1, err := json.Marshal(s.SchemaProps) + if err != nil { + return nil, fmt.Errorf("schema props %v", err) + } + b2, err := json.Marshal(s.VendorExtensible) + if err != nil { + return nil, fmt.Errorf("vendor props %v", err) + } + b3, err := s.Ref.MarshalJSON() + if err != nil { + return nil, fmt.Errorf("ref prop %v", err) + } + b4, err := s.Schema.MarshalJSON() + if err != nil { + return nil, fmt.Errorf("schema prop %v", err) + } + b5, err := json.Marshal(s.SwaggerSchemaProps) + if err != nil { + return nil, fmt.Errorf("common validations %v", err) + } + var b6 []byte + if s.ExtraProps != nil { + jj, err := json.Marshal(s.ExtraProps) + if err != nil { + return nil, fmt.Errorf("extra props %v", err) + } + b6 = jj + } + return swag.ConcatJSON(b1, b2, b3, b4, b5, b6), nil +} + +// UnmarshalJSON marshal this from JSON +func (s *Schema) UnmarshalJSON(data []byte) error { + props := struct { + SchemaProps + SwaggerSchemaProps + }{} + if err := json.Unmarshal(data, &props); err != nil { + return err + } + + sch := Schema{ + SchemaProps: props.SchemaProps, + SwaggerSchemaProps: props.SwaggerSchemaProps, + } + + var d map[string]interface{} + if err := json.Unmarshal(data, &d); err != nil { + return err + } + + _ = sch.Ref.fromMap(d) + _ = sch.Schema.fromMap(d) + + delete(d, "$ref") + delete(d, "$schema") + for _, pn := range swag.DefaultJSONNameProvider.GetJSONNames(s) { + delete(d, pn) + } + + for k, vv := range d { + lk := strings.ToLower(k) + if strings.HasPrefix(lk, "x-") { + if sch.Extensions == nil { + sch.Extensions = map[string]interface{}{} + } + sch.Extensions[k] = vv + continue + } + if sch.ExtraProps == nil { + sch.ExtraProps = map[string]interface{}{} + } + sch.ExtraProps[k] = vv + } + + *s = sch + + return nil +} diff --git a/vendor/github.com/go-openapi/spec/schemas/jsonschema-draft-04.json b/vendor/github.com/go-openapi/spec/schemas/jsonschema-draft-04.json new file mode 100644 index 0000000000..bcbb84743e --- /dev/null +++ b/vendor/github.com/go-openapi/spec/schemas/jsonschema-draft-04.json @@ -0,0 +1,149 @@ +{ + "id": "http://json-schema.org/draft-04/schema#", + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "Core schema meta-schema", + "definitions": { + "schemaArray": { + "type": "array", + "minItems": 1, + "items": { "$ref": "#" } + }, + "positiveInteger": { + "type": "integer", + "minimum": 0 + }, + "positiveIntegerDefault0": { + "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ] + }, + "simpleTypes": { + "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ] + }, + "stringArray": { + "type": "array", + "items": { "type": "string" }, + "minItems": 1, + "uniqueItems": true + } + }, + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "$schema": { + "type": "string" + }, + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "default": {}, + "multipleOf": { + "type": "number", + "minimum": 0, + "exclusiveMinimum": true + }, + "maximum": { + "type": "number" + }, + "exclusiveMaximum": { + "type": "boolean", + "default": false + }, + "minimum": { + "type": "number" + }, + "exclusiveMinimum": { + "type": "boolean", + "default": false + }, + "maxLength": { "$ref": "#/definitions/positiveInteger" }, + "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "pattern": { + "type": "string", + "format": "regex" + }, + "additionalItems": { + "anyOf": [ + { "type": "boolean" }, + { "$ref": "#" } + ], + "default": {} + }, + "items": { + "anyOf": [ + { "$ref": "#" }, + { "$ref": "#/definitions/schemaArray" } + ], + "default": {} + }, + "maxItems": { "$ref": "#/definitions/positiveInteger" }, + "minItems": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "uniqueItems": { + "type": "boolean", + "default": false + }, + "maxProperties": { "$ref": "#/definitions/positiveInteger" }, + "minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "required": { "$ref": "#/definitions/stringArray" }, + "additionalProperties": { + "anyOf": [ + { "type": "boolean" }, + { "$ref": "#" } + ], + "default": {} + }, + "definitions": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + "properties": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + "patternProperties": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + "dependencies": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { "$ref": "#" }, + { "$ref": "#/definitions/stringArray" } + ] + } + }, + "enum": { + "type": "array", + "minItems": 1, + "uniqueItems": true + }, + "type": { + "anyOf": [ + { "$ref": "#/definitions/simpleTypes" }, + { + "type": "array", + "items": { "$ref": "#/definitions/simpleTypes" }, + "minItems": 1, + "uniqueItems": true + } + ] + }, + "format": { "type": "string" }, + "allOf": { "$ref": "#/definitions/schemaArray" }, + "anyOf": { "$ref": "#/definitions/schemaArray" }, + "oneOf": { "$ref": "#/definitions/schemaArray" }, + "not": { "$ref": "#" } + }, + "dependencies": { + "exclusiveMaximum": [ "maximum" ], + "exclusiveMinimum": [ "minimum" ] + }, + "default": {} +} diff --git a/vendor/github.com/go-openapi/spec/schemas/v2/README.md b/vendor/github.com/go-openapi/spec/schemas/v2/README.md new file mode 100644 index 0000000000..32c1b929b2 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/schemas/v2/README.md @@ -0,0 +1,5 @@ +# Swagger 2.0 specification schema + +This folder contains the Swagger 2.0 specification schema files maintained here: + +https://github.com/reverb/swagger-spec/blob/master/schemas/v2.0 \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/schemas/v2/schema.json b/vendor/github.com/go-openapi/spec/schemas/v2/schema.json new file mode 100644 index 0000000000..4dfccd07be --- /dev/null +++ b/vendor/github.com/go-openapi/spec/schemas/v2/schema.json @@ -0,0 +1,1607 @@ +{ + "title": "A JSON Schema for Swagger 2.0 API.", + "id": "http://swagger.io/v2/schema.json#", + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "required": [ + "swagger", + "info", + "paths" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "swagger": { + "type": "string", + "enum": [ + "2.0" + ], + "description": "The Swagger version of this document." + }, + "info": { + "$ref": "#/definitions/info" + }, + "host": { + "type": "string", + "pattern": "^[^{}/ :\\\\]+(?::\\d+)?$", + "description": "The host (name or ip) of the API. Example: 'swagger.io'" + }, + "basePath": { + "type": "string", + "pattern": "^/", + "description": "The base path to the API. Example: '/api'." + }, + "schemes": { + "$ref": "#/definitions/schemesList" + }, + "consumes": { + "description": "A list of MIME types accepted by the API.", + "allOf": [ + { + "$ref": "#/definitions/mediaTypeList" + } + ] + }, + "produces": { + "description": "A list of MIME types the API can produce.", + "allOf": [ + { + "$ref": "#/definitions/mediaTypeList" + } + ] + }, + "paths": { + "$ref": "#/definitions/paths" + }, + "definitions": { + "$ref": "#/definitions/definitions" + }, + "parameters": { + "$ref": "#/definitions/parameterDefinitions" + }, + "responses": { + "$ref": "#/definitions/responseDefinitions" + }, + "security": { + "$ref": "#/definitions/security" + }, + "securityDefinitions": { + "$ref": "#/definitions/securityDefinitions" + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/definitions/tag" + }, + "uniqueItems": true + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + } + }, + "definitions": { + "info": { + "type": "object", + "description": "General information about the API.", + "required": [ + "version", + "title" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "title": { + "type": "string", + "description": "A unique and precise title of the API." + }, + "version": { + "type": "string", + "description": "A semantic version number of the API." + }, + "description": { + "type": "string", + "description": "A longer description of the API. Should be different from the title. GitHub Flavored Markdown is allowed." + }, + "termsOfService": { + "type": "string", + "description": "The terms of service for the API." + }, + "contact": { + "$ref": "#/definitions/contact" + }, + "license": { + "$ref": "#/definitions/license" + } + } + }, + "contact": { + "type": "object", + "description": "Contact information for the owners of the API.", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "The identifying name of the contact person/organization." + }, + "url": { + "type": "string", + "description": "The URL pointing to the contact information.", + "format": "uri" + }, + "email": { + "type": "string", + "description": "The email address of the contact person/organization.", + "format": "email" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "license": { + "type": "object", + "required": [ + "name" + ], + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "The name of the license type. It's encouraged to use an OSI compatible license." + }, + "url": { + "type": "string", + "description": "The URL pointing to the license.", + "format": "uri" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "paths": { + "type": "object", + "description": "Relative paths to the individual endpoints. They must be relative to the 'basePath'.", + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + }, + "^/": { + "$ref": "#/definitions/pathItem" + } + }, + "additionalProperties": false + }, + "definitions": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schema" + }, + "description": "One or more JSON objects describing the schemas being consumed and produced by the API." + }, + "parameterDefinitions": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/parameter" + }, + "description": "One or more JSON representations for parameters" + }, + "responseDefinitions": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/response" + }, + "description": "One or more JSON representations for parameters" + }, + "externalDocs": { + "type": "object", + "additionalProperties": false, + "description": "information about external documentation", + "required": [ + "url" + ], + "properties": { + "description": { + "type": "string" + }, + "url": { + "type": "string", + "format": "uri" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "examples": { + "type": "object", + "additionalProperties": true + }, + "mimeType": { + "type": "string", + "description": "The MIME type of the HTTP message." + }, + "operation": { + "type": "object", + "required": [ + "responses" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "summary": { + "type": "string", + "description": "A brief summary of the operation." + }, + "description": { + "type": "string", + "description": "A longer description of the operation, GitHub Flavored Markdown is allowed." + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + }, + "operationId": { + "type": "string", + "description": "A unique identifier of the operation." + }, + "produces": { + "description": "A list of MIME types the API can produce.", + "allOf": [ + { + "$ref": "#/definitions/mediaTypeList" + } + ] + }, + "consumes": { + "description": "A list of MIME types the API can consume.", + "allOf": [ + { + "$ref": "#/definitions/mediaTypeList" + } + ] + }, + "parameters": { + "$ref": "#/definitions/parametersList" + }, + "responses": { + "$ref": "#/definitions/responses" + }, + "schemes": { + "$ref": "#/definitions/schemesList" + }, + "deprecated": { + "type": "boolean", + "default": false + }, + "security": { + "$ref": "#/definitions/security" + } + } + }, + "pathItem": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "$ref": { + "type": "string" + }, + "get": { + "$ref": "#/definitions/operation" + }, + "put": { + "$ref": "#/definitions/operation" + }, + "post": { + "$ref": "#/definitions/operation" + }, + "delete": { + "$ref": "#/definitions/operation" + }, + "options": { + "$ref": "#/definitions/operation" + }, + "head": { + "$ref": "#/definitions/operation" + }, + "patch": { + "$ref": "#/definitions/operation" + }, + "parameters": { + "$ref": "#/definitions/parametersList" + } + } + }, + "responses": { + "type": "object", + "description": "Response objects names can either be any valid HTTP status code or 'default'.", + "minProperties": 1, + "additionalProperties": false, + "patternProperties": { + "^([0-9]{3})$|^(default)$": { + "$ref": "#/definitions/responseValue" + }, + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "not": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + } + }, + "responseValue": { + "oneOf": [ + { + "$ref": "#/definitions/response" + }, + { + "$ref": "#/definitions/jsonReference" + } + ] + }, + "response": { + "type": "object", + "required": [ + "description" + ], + "properties": { + "description": { + "type": "string" + }, + "schema": { + "oneOf": [ + { + "$ref": "#/definitions/schema" + }, + { + "$ref": "#/definitions/fileSchema" + } + ] + }, + "headers": { + "$ref": "#/definitions/headers" + }, + "examples": { + "$ref": "#/definitions/examples" + } + }, + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "headers": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/header" + } + }, + "header": { + "type": "object", + "additionalProperties": false, + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "string", + "number", + "integer", + "boolean", + "array" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormat" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "vendorExtension": { + "description": "Any property starting with x- is valid.", + "additionalProperties": true, + "additionalItems": true + }, + "bodyParameter": { + "type": "object", + "required": [ + "name", + "in", + "schema" + ], + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "description": { + "type": "string", + "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." + }, + "name": { + "type": "string", + "description": "The name of the parameter." + }, + "in": { + "type": "string", + "description": "Determines the location of the parameter.", + "enum": [ + "body" + ] + }, + "required": { + "type": "boolean", + "description": "Determines whether or not this parameter is required or optional.", + "default": false + }, + "schema": { + "$ref": "#/definitions/schema" + } + }, + "additionalProperties": false + }, + "headerParameterSubSchema": { + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "required": { + "type": "boolean", + "description": "Determines whether or not this parameter is required or optional.", + "default": false + }, + "in": { + "type": "string", + "description": "Determines the location of the parameter.", + "enum": [ + "header" + ] + }, + "description": { + "type": "string", + "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." + }, + "name": { + "type": "string", + "description": "The name of the parameter." + }, + "type": { + "type": "string", + "enum": [ + "string", + "number", + "boolean", + "integer", + "array" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormat" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + } + } + }, + "queryParameterSubSchema": { + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "required": { + "type": "boolean", + "description": "Determines whether or not this parameter is required or optional.", + "default": false + }, + "in": { + "type": "string", + "description": "Determines the location of the parameter.", + "enum": [ + "query" + ] + }, + "description": { + "type": "string", + "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." + }, + "name": { + "type": "string", + "description": "The name of the parameter." + }, + "allowEmptyValue": { + "type": "boolean", + "default": false, + "description": "allows sending a parameter by name only or with an empty value." + }, + "type": { + "type": "string", + "enum": [ + "string", + "number", + "boolean", + "integer", + "array" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormatWithMulti" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + } + } + }, + "formDataParameterSubSchema": { + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "required": { + "type": "boolean", + "description": "Determines whether or not this parameter is required or optional.", + "default": false + }, + "in": { + "type": "string", + "description": "Determines the location of the parameter.", + "enum": [ + "formData" + ] + }, + "description": { + "type": "string", + "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." + }, + "name": { + "type": "string", + "description": "The name of the parameter." + }, + "allowEmptyValue": { + "type": "boolean", + "default": false, + "description": "allows sending a parameter by name only or with an empty value." + }, + "type": { + "type": "string", + "enum": [ + "string", + "number", + "boolean", + "integer", + "array", + "file" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormatWithMulti" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + } + } + }, + "pathParameterSubSchema": { + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "required": [ + "required" + ], + "properties": { + "required": { + "type": "boolean", + "enum": [ + true + ], + "description": "Determines whether or not this parameter is required or optional." + }, + "in": { + "type": "string", + "description": "Determines the location of the parameter.", + "enum": [ + "path" + ] + }, + "description": { + "type": "string", + "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." + }, + "name": { + "type": "string", + "description": "The name of the parameter." + }, + "type": { + "type": "string", + "enum": [ + "string", + "number", + "boolean", + "integer", + "array" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormat" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + } + } + }, + "nonBodyParameter": { + "type": "object", + "required": [ + "name", + "in", + "type" + ], + "oneOf": [ + { + "$ref": "#/definitions/headerParameterSubSchema" + }, + { + "$ref": "#/definitions/formDataParameterSubSchema" + }, + { + "$ref": "#/definitions/queryParameterSubSchema" + }, + { + "$ref": "#/definitions/pathParameterSubSchema" + } + ] + }, + "parameter": { + "oneOf": [ + { + "$ref": "#/definitions/bodyParameter" + }, + { + "$ref": "#/definitions/nonBodyParameter" + } + ] + }, + "schema": { + "type": "object", + "description": "A deterministic version of a JSON Schema object.", + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "$ref": { + "type": "string" + }, + "format": { + "type": "string" + }, + "title": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/title" + }, + "description": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/description" + }, + "default": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/default" + }, + "multipleOf": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" + }, + "maximum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" + }, + "exclusiveMaximum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" + }, + "minimum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" + }, + "exclusiveMinimum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" + }, + "maxLength": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" + }, + "minLength": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" + }, + "pattern": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" + }, + "maxItems": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" + }, + "minItems": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" + }, + "uniqueItems": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" + }, + "maxProperties": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" + }, + "minProperties": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" + }, + "required": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" + }, + "enum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" + }, + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/definitions/schema" + }, + { + "type": "boolean" + } + ], + "default": {} + }, + "type": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/type" + }, + "items": { + "anyOf": [ + { + "$ref": "#/definitions/schema" + }, + { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/schema" + } + } + ], + "default": {} + }, + "allOf": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/schema" + } + }, + "properties": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schema" + }, + "default": {} + }, + "discriminator": { + "type": "string" + }, + "readOnly": { + "type": "boolean", + "default": false + }, + "xml": { + "$ref": "#/definitions/xml" + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + }, + "example": {} + }, + "additionalProperties": false + }, + "fileSchema": { + "type": "object", + "description": "A deterministic version of a JSON Schema object.", + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "required": [ + "type" + ], + "properties": { + "format": { + "type": "string" + }, + "title": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/title" + }, + "description": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/description" + }, + "default": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/default" + }, + "required": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" + }, + "type": { + "type": "string", + "enum": [ + "file" + ] + }, + "readOnly": { + "type": "boolean", + "default": false + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + }, + "example": {} + }, + "additionalProperties": false + }, + "primitivesItems": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": [ + "string", + "number", + "integer", + "boolean", + "array" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormat" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "security": { + "type": "array", + "items": { + "$ref": "#/definitions/securityRequirement" + }, + "uniqueItems": true + }, + "securityRequirement": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + } + }, + "xml": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "namespace": { + "type": "string" + }, + "prefix": { + "type": "string" + }, + "attribute": { + "type": "boolean", + "default": false + }, + "wrapped": { + "type": "boolean", + "default": false + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "tag": { + "type": "object", + "additionalProperties": false, + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "securityDefinitions": { + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "$ref": "#/definitions/basicAuthenticationSecurity" + }, + { + "$ref": "#/definitions/apiKeySecurity" + }, + { + "$ref": "#/definitions/oauth2ImplicitSecurity" + }, + { + "$ref": "#/definitions/oauth2PasswordSecurity" + }, + { + "$ref": "#/definitions/oauth2ApplicationSecurity" + }, + { + "$ref": "#/definitions/oauth2AccessCodeSecurity" + } + ] + } + }, + "basicAuthenticationSecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "basic" + ] + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "apiKeySecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "name", + "in" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "apiKey" + ] + }, + "name": { + "type": "string" + }, + "in": { + "type": "string", + "enum": [ + "header", + "query" + ] + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "oauth2ImplicitSecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "flow", + "authorizationUrl" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "oauth2" + ] + }, + "flow": { + "type": "string", + "enum": [ + "implicit" + ] + }, + "scopes": { + "$ref": "#/definitions/oauth2Scopes" + }, + "authorizationUrl": { + "type": "string", + "format": "uri" + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "oauth2PasswordSecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "flow", + "tokenUrl" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "oauth2" + ] + }, + "flow": { + "type": "string", + "enum": [ + "password" + ] + }, + "scopes": { + "$ref": "#/definitions/oauth2Scopes" + }, + "tokenUrl": { + "type": "string", + "format": "uri" + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "oauth2ApplicationSecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "flow", + "tokenUrl" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "oauth2" + ] + }, + "flow": { + "type": "string", + "enum": [ + "application" + ] + }, + "scopes": { + "$ref": "#/definitions/oauth2Scopes" + }, + "tokenUrl": { + "type": "string", + "format": "uri" + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "oauth2AccessCodeSecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "flow", + "authorizationUrl", + "tokenUrl" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "oauth2" + ] + }, + "flow": { + "type": "string", + "enum": [ + "accessCode" + ] + }, + "scopes": { + "$ref": "#/definitions/oauth2Scopes" + }, + "authorizationUrl": { + "type": "string", + "format": "uri" + }, + "tokenUrl": { + "type": "string", + "format": "uri" + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "oauth2Scopes": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "mediaTypeList": { + "type": "array", + "items": { + "$ref": "#/definitions/mimeType" + }, + "uniqueItems": true + }, + "parametersList": { + "type": "array", + "description": "The parameters needed to send a valid API call.", + "additionalItems": false, + "items": { + "oneOf": [ + { + "$ref": "#/definitions/parameter" + }, + { + "$ref": "#/definitions/jsonReference" + } + ] + }, + "uniqueItems": true + }, + "schemesList": { + "type": "array", + "description": "The transfer protocol of the API.", + "items": { + "type": "string", + "enum": [ + "http", + "https", + "ws", + "wss" + ] + }, + "uniqueItems": true + }, + "collectionFormat": { + "type": "string", + "enum": [ + "csv", + "ssv", + "tsv", + "pipes" + ], + "default": "csv" + }, + "collectionFormatWithMulti": { + "type": "string", + "enum": [ + "csv", + "ssv", + "tsv", + "pipes", + "multi" + ], + "default": "csv" + }, + "title": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/title" + }, + "description": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/description" + }, + "default": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/default" + }, + "multipleOf": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" + }, + "maximum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" + }, + "exclusiveMaximum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" + }, + "minimum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" + }, + "exclusiveMinimum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" + }, + "maxLength": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" + }, + "minLength": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" + }, + "pattern": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" + }, + "maxItems": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" + }, + "minItems": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" + }, + "uniqueItems": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" + }, + "enum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" + }, + "jsonReference": { + "type": "object", + "required": [ + "$ref" + ], + "additionalProperties": false, + "properties": { + "$ref": { + "type": "string" + } + } + } + } +} diff --git a/vendor/github.com/go-openapi/spec/security_scheme.go b/vendor/github.com/go-openapi/spec/security_scheme.go new file mode 100644 index 0000000000..9f1b454eac --- /dev/null +++ b/vendor/github.com/go-openapi/spec/security_scheme.go @@ -0,0 +1,143 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import ( + "encoding/json" + + "github.com/go-openapi/jsonpointer" + "github.com/go-openapi/swag" +) + +const ( + basic = "basic" + apiKey = "apiKey" + oauth2 = "oauth2" + implicit = "implicit" + password = "password" + application = "application" + accessCode = "accessCode" +) + +// BasicAuth creates a basic auth security scheme +func BasicAuth() *SecurityScheme { + return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{Type: basic}} +} + +// APIKeyAuth creates an api key auth security scheme +func APIKeyAuth(fieldName, valueSource string) *SecurityScheme { + return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{Type: apiKey, Name: fieldName, In: valueSource}} +} + +// OAuth2Implicit creates an implicit flow oauth2 security scheme +func OAuth2Implicit(authorizationURL string) *SecurityScheme { + return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{ + Type: oauth2, + Flow: implicit, + AuthorizationURL: authorizationURL, + }} +} + +// OAuth2Password creates a password flow oauth2 security scheme +func OAuth2Password(tokenURL string) *SecurityScheme { + return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{ + Type: oauth2, + Flow: password, + TokenURL: tokenURL, + }} +} + +// OAuth2Application creates an application flow oauth2 security scheme +func OAuth2Application(tokenURL string) *SecurityScheme { + return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{ + Type: oauth2, + Flow: application, + TokenURL: tokenURL, + }} +} + +// OAuth2AccessToken creates an access token flow oauth2 security scheme +func OAuth2AccessToken(authorizationURL, tokenURL string) *SecurityScheme { + return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{ + Type: oauth2, + Flow: accessCode, + AuthorizationURL: authorizationURL, + TokenURL: tokenURL, + }} +} + +// SecuritySchemeProps describes a swagger security scheme in the securityDefinitions section +type SecuritySchemeProps struct { + Description string `json:"description,omitempty"` + Type string `json:"type"` + Name string `json:"name,omitempty"` // api key + In string `json:"in,omitempty"` // api key + Flow string `json:"flow,omitempty"` // oauth2 + AuthorizationURL string `json:"authorizationUrl,omitempty"` // oauth2 + TokenURL string `json:"tokenUrl,omitempty"` // oauth2 + Scopes map[string]string `json:"scopes,omitempty"` // oauth2 +} + +// AddScope adds a scope to this security scheme +func (s *SecuritySchemeProps) AddScope(scope, description string) { + if s.Scopes == nil { + s.Scopes = make(map[string]string) + } + s.Scopes[scope] = description +} + +// SecurityScheme allows the definition of a security scheme that can be used by the operations. +// Supported schemes are basic authentication, an API key (either as a header or as a query parameter) +// and OAuth2's common flows (implicit, password, application and access code). +// +// For more information: http://goo.gl/8us55a#securitySchemeObject +type SecurityScheme struct { + VendorExtensible + SecuritySchemeProps +} + +// JSONLookup implements an interface to customize json pointer lookup +func (s SecurityScheme) JSONLookup(token string) (interface{}, error) { + if ex, ok := s.Extensions[token]; ok { + return &ex, nil + } + + r, _, err := jsonpointer.GetForToken(s.SecuritySchemeProps, token) + return r, err +} + +// MarshalJSON marshal this to JSON +func (s SecurityScheme) MarshalJSON() ([]byte, error) { + b1, err := json.Marshal(s.SecuritySchemeProps) + if err != nil { + return nil, err + } + b2, err := json.Marshal(s.VendorExtensible) + if err != nil { + return nil, err + } + return swag.ConcatJSON(b1, b2), nil +} + +// UnmarshalJSON marshal this from JSON +func (s *SecurityScheme) UnmarshalJSON(data []byte) error { + if err := json.Unmarshal(data, &s.SecuritySchemeProps); err != nil { + return err + } + if err := json.Unmarshal(data, &s.VendorExtensible); err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/go-openapi/spec/spec.go b/vendor/github.com/go-openapi/spec/spec.go new file mode 100644 index 0000000000..0bb045bc06 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/spec.go @@ -0,0 +1,86 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import "encoding/json" + +//go:generate curl -L --progress -o ./schemas/v2/schema.json http://swagger.io/v2/schema.json +//go:generate curl -L --progress -o ./schemas/jsonschema-draft-04.json http://json-schema.org/draft-04/schema +//go:generate go-bindata -pkg=spec -prefix=./schemas -ignore=.*\.md ./schemas/... +//go:generate perl -pi -e s,Json,JSON,g bindata.go + +const ( + // SwaggerSchemaURL the url for the swagger 2.0 schema to validate specs + SwaggerSchemaURL = "http://swagger.io/v2/schema.json#" + // JSONSchemaURL the url for the json schema schema + JSONSchemaURL = "http://json-schema.org/draft-04/schema#" +) + +var ( + jsonSchema *Schema + swaggerSchema *Schema +) + +func init() { + jsonSchema = MustLoadJSONSchemaDraft04() + swaggerSchema = MustLoadSwagger20Schema() +} + +// MustLoadJSONSchemaDraft04 panics when Swagger20Schema returns an error +func MustLoadJSONSchemaDraft04() *Schema { + d, e := JSONSchemaDraft04() + if e != nil { + panic(e) + } + return d +} + +// JSONSchemaDraft04 loads the json schema document for json shema draft04 +func JSONSchemaDraft04() (*Schema, error) { + b, err := Asset("jsonschema-draft-04.json") + if err != nil { + return nil, err + } + + schema := new(Schema) + if err := json.Unmarshal(b, schema); err != nil { + return nil, err + } + return schema, nil +} + +// MustLoadSwagger20Schema panics when Swagger20Schema returns an error +func MustLoadSwagger20Schema() *Schema { + d, e := Swagger20Schema() + if e != nil { + panic(e) + } + return d +} + +// Swagger20Schema loads the swagger 2.0 schema from the embedded assets +func Swagger20Schema() (*Schema, error) { + + b, err := Asset("v2/schema.json") + if err != nil { + return nil, err + } + + schema := new(Schema) + if err := json.Unmarshal(b, schema); err != nil { + return nil, err + } + return schema, nil +} diff --git a/vendor/github.com/go-openapi/spec/swagger.go b/vendor/github.com/go-openapi/spec/swagger.go new file mode 100644 index 0000000000..4586a21c86 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/swagger.go @@ -0,0 +1,318 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import ( + "encoding/json" + "fmt" + "strconv" + + "github.com/go-openapi/jsonpointer" + "github.com/go-openapi/swag" +) + +// Swagger this is the root document object for the API specification. +// It combines what previously was the Resource Listing and API Declaration (version 1.2 and earlier) together into one document. +// +// For more information: http://goo.gl/8us55a#swagger-object- +type Swagger struct { + VendorExtensible + SwaggerProps +} + +// JSONLookup look up a value by the json property name +func (s Swagger) JSONLookup(token string) (interface{}, error) { + if ex, ok := s.Extensions[token]; ok { + return &ex, nil + } + r, _, err := jsonpointer.GetForToken(s.SwaggerProps, token) + return r, err +} + +// MarshalJSON marshals this swagger structure to json +func (s Swagger) MarshalJSON() ([]byte, error) { + b1, err := json.Marshal(s.SwaggerProps) + if err != nil { + return nil, err + } + b2, err := json.Marshal(s.VendorExtensible) + if err != nil { + return nil, err + } + return swag.ConcatJSON(b1, b2), nil +} + +// UnmarshalJSON unmarshals a swagger spec from json +func (s *Swagger) UnmarshalJSON(data []byte) error { + var sw Swagger + if err := json.Unmarshal(data, &sw.SwaggerProps); err != nil { + return err + } + if err := json.Unmarshal(data, &sw.VendorExtensible); err != nil { + return err + } + *s = sw + return nil +} + +// SwaggerProps captures the top-level properties of an Api specification +type SwaggerProps struct { + ID string `json:"id,omitempty"` + Consumes []string `json:"consumes,omitempty"` + Produces []string `json:"produces,omitempty"` + Schemes []string `json:"schemes,omitempty"` // the scheme, when present must be from [http, https, ws, wss] + Swagger string `json:"swagger,omitempty"` + Info *Info `json:"info,omitempty"` + Host string `json:"host,omitempty"` + BasePath string `json:"basePath,omitempty"` // must start with a leading "/" + Paths *Paths `json:"paths"` // required + Definitions Definitions `json:"definitions,omitempty"` + Parameters map[string]Parameter `json:"parameters,omitempty"` + Responses map[string]Response `json:"responses,omitempty"` + SecurityDefinitions SecurityDefinitions `json:"securityDefinitions,omitempty"` + Security []map[string][]string `json:"security,omitempty"` + Tags []Tag `json:"tags,omitempty"` + ExternalDocs *ExternalDocumentation `json:"externalDocs,omitempty"` +} + +// Dependencies represent a dependencies property +type Dependencies map[string]SchemaOrStringArray + +// SchemaOrBool represents a schema or boolean value, is biased towards true for the boolean property +type SchemaOrBool struct { + Allows bool + Schema *Schema +} + +// JSONLookup implements an interface to customize json pointer lookup +func (s SchemaOrBool) JSONLookup(token string) (interface{}, error) { + if token == "allows" { + return s.Allows, nil + } + r, _, err := jsonpointer.GetForToken(s.Schema, token) + return r, err +} + +var jsTrue = []byte("true") +var jsFalse = []byte("false") + +// MarshalJSON convert this object to JSON +func (s SchemaOrBool) MarshalJSON() ([]byte, error) { + if s.Schema != nil { + return json.Marshal(s.Schema) + } + + if s.Schema == nil && !s.Allows { + return jsFalse, nil + } + return jsTrue, nil +} + +// UnmarshalJSON converts this bool or schema object from a JSON structure +func (s *SchemaOrBool) UnmarshalJSON(data []byte) error { + var nw SchemaOrBool + if len(data) >= 4 { + if data[0] == '{' { + var sch Schema + if err := json.Unmarshal(data, &sch); err != nil { + return err + } + nw.Schema = &sch + } + nw.Allows = !(data[0] == 'f' && data[1] == 'a' && data[2] == 'l' && data[3] == 's' && data[4] == 'e') + } + *s = nw + return nil +} + +// SchemaOrStringArray represents a schema or a string array +type SchemaOrStringArray struct { + Schema *Schema + Property []string +} + +// JSONLookup implements an interface to customize json pointer lookup +func (s SchemaOrStringArray) JSONLookup(token string) (interface{}, error) { + r, _, err := jsonpointer.GetForToken(s.Schema, token) + return r, err +} + +// MarshalJSON converts this schema object or array into JSON structure +func (s SchemaOrStringArray) MarshalJSON() ([]byte, error) { + if len(s.Property) > 0 { + return json.Marshal(s.Property) + } + if s.Schema != nil { + return json.Marshal(s.Schema) + } + return []byte("null"), nil +} + +// UnmarshalJSON converts this schema object or array from a JSON structure +func (s *SchemaOrStringArray) UnmarshalJSON(data []byte) error { + var first byte + if len(data) > 1 { + first = data[0] + } + var nw SchemaOrStringArray + if first == '{' { + var sch Schema + if err := json.Unmarshal(data, &sch); err != nil { + return err + } + nw.Schema = &sch + } + if first == '[' { + if err := json.Unmarshal(data, &nw.Property); err != nil { + return err + } + } + *s = nw + return nil +} + +// Definitions contains the models explicitly defined in this spec +// An object to hold data types that can be consumed and produced by operations. +// These data types can be primitives, arrays or models. +// +// For more information: http://goo.gl/8us55a#definitionsObject +type Definitions map[string]Schema + +// SecurityDefinitions a declaration of the security schemes available to be used in the specification. +// This does not enforce the security schemes on the operations and only serves to provide +// the relevant details for each scheme. +// +// For more information: http://goo.gl/8us55a#securityDefinitionsObject +type SecurityDefinitions map[string]*SecurityScheme + +// StringOrArray represents a value that can either be a string +// or an array of strings. Mainly here for serialization purposes +type StringOrArray []string + +// Contains returns true when the value is contained in the slice +func (s StringOrArray) Contains(value string) bool { + for _, str := range s { + if str == value { + return true + } + } + return false +} + +// JSONLookup implements an interface to customize json pointer lookup +func (s SchemaOrArray) JSONLookup(token string) (interface{}, error) { + if _, err := strconv.Atoi(token); err == nil { + r, _, err := jsonpointer.GetForToken(s.Schemas, token) + return r, err + } + r, _, err := jsonpointer.GetForToken(s.Schema, token) + return r, err +} + +// UnmarshalJSON unmarshals this string or array object from a JSON array or JSON string +func (s *StringOrArray) UnmarshalJSON(data []byte) error { + var first byte + if len(data) > 1 { + first = data[0] + } + + if first == '[' { + var parsed []string + if err := json.Unmarshal(data, &parsed); err != nil { + return err + } + *s = StringOrArray(parsed) + return nil + } + + var single interface{} + if err := json.Unmarshal(data, &single); err != nil { + return err + } + if single == nil { + return nil + } + switch single.(type) { + case string: + *s = StringOrArray([]string{single.(string)}) + return nil + default: + return fmt.Errorf("only string or array is allowed, not %T", single) + } +} + +// MarshalJSON converts this string or array to a JSON array or JSON string +func (s StringOrArray) MarshalJSON() ([]byte, error) { + if len(s) == 1 { + return json.Marshal([]string(s)[0]) + } + return json.Marshal([]string(s)) +} + +// SchemaOrArray represents a value that can either be a Schema +// or an array of Schema. Mainly here for serialization purposes +type SchemaOrArray struct { + Schema *Schema + Schemas []Schema +} + +// Len returns the number of schemas in this property +func (s SchemaOrArray) Len() int { + if s.Schema != nil { + return 1 + } + return len(s.Schemas) +} + +// ContainsType returns true when one of the schemas is of the specified type +func (s *SchemaOrArray) ContainsType(name string) bool { + if s.Schema != nil { + return s.Schema.Type != nil && s.Schema.Type.Contains(name) + } + return false +} + +// MarshalJSON converts this schema object or array into JSON structure +func (s SchemaOrArray) MarshalJSON() ([]byte, error) { + if len(s.Schemas) > 0 { + return json.Marshal(s.Schemas) + } + return json.Marshal(s.Schema) +} + +// UnmarshalJSON converts this schema object or array from a JSON structure +func (s *SchemaOrArray) UnmarshalJSON(data []byte) error { + var nw SchemaOrArray + var first byte + if len(data) > 1 { + first = data[0] + } + if first == '{' { + var sch Schema + if err := json.Unmarshal(data, &sch); err != nil { + return err + } + nw.Schema = &sch + } + if first == '[' { + if err := json.Unmarshal(data, &nw.Schemas); err != nil { + return err + } + } + *s = nw + return nil +} + +// vim:set ft=go noet sts=2 sw=2 ts=2: diff --git a/vendor/github.com/go-openapi/spec/tag.go b/vendor/github.com/go-openapi/spec/tag.go new file mode 100644 index 0000000000..25256c4bec --- /dev/null +++ b/vendor/github.com/go-openapi/spec/tag.go @@ -0,0 +1,74 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import ( + "encoding/json" + + "github.com/go-openapi/jsonpointer" + "github.com/go-openapi/swag" +) + +// TagProps describe a tag entry in the top level tags section of a swagger spec +type TagProps struct { + Description string `json:"description,omitempty"` + Name string `json:"name,omitempty"` + ExternalDocs *ExternalDocumentation `json:"externalDocs,omitempty"` +} + +// NewTag creates a new tag +func NewTag(name, description string, externalDocs *ExternalDocumentation) Tag { + return Tag{TagProps: TagProps{description, name, externalDocs}} +} + +// Tag allows adding meta data to a single tag that is used by the [Operation Object](http://goo.gl/8us55a#operationObject). +// It is not mandatory to have a Tag Object per tag used there. +// +// For more information: http://goo.gl/8us55a#tagObject +type Tag struct { + VendorExtensible + TagProps +} + +// JSONLookup implements an interface to customize json pointer lookup +func (t Tag) JSONLookup(token string) (interface{}, error) { + if ex, ok := t.Extensions[token]; ok { + return &ex, nil + } + + r, _, err := jsonpointer.GetForToken(t.TagProps, token) + return r, err +} + +// MarshalJSON marshal this to JSON +func (t Tag) MarshalJSON() ([]byte, error) { + b1, err := json.Marshal(t.TagProps) + if err != nil { + return nil, err + } + b2, err := json.Marshal(t.VendorExtensible) + if err != nil { + return nil, err + } + return swag.ConcatJSON(b1, b2), nil +} + +// UnmarshalJSON marshal this from JSON +func (t *Tag) UnmarshalJSON(data []byte) error { + if err := json.Unmarshal(data, &t.TagProps); err != nil { + return err + } + return json.Unmarshal(data, &t.VendorExtensible) +} diff --git a/vendor/github.com/go-openapi/spec/xml_object.go b/vendor/github.com/go-openapi/spec/xml_object.go new file mode 100644 index 0000000000..945a46703d --- /dev/null +++ b/vendor/github.com/go-openapi/spec/xml_object.go @@ -0,0 +1,68 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +// XMLObject a metadata object that allows for more fine-tuned XML model definitions. +// +// For more information: http://goo.gl/8us55a#xmlObject +type XMLObject struct { + Name string `json:"name,omitempty"` + Namespace string `json:"namespace,omitempty"` + Prefix string `json:"prefix,omitempty"` + Attribute bool `json:"attribute,omitempty"` + Wrapped bool `json:"wrapped,omitempty"` +} + +// WithName sets the xml name for the object +func (x *XMLObject) WithName(name string) *XMLObject { + x.Name = name + return x +} + +// WithNamespace sets the xml namespace for the object +func (x *XMLObject) WithNamespace(namespace string) *XMLObject { + x.Namespace = namespace + return x +} + +// WithPrefix sets the xml prefix for the object +func (x *XMLObject) WithPrefix(prefix string) *XMLObject { + x.Prefix = prefix + return x +} + +// AsAttribute flags this object as xml attribute +func (x *XMLObject) AsAttribute() *XMLObject { + x.Attribute = true + return x +} + +// AsElement flags this object as an xml node +func (x *XMLObject) AsElement() *XMLObject { + x.Attribute = false + return x +} + +// AsWrapped flags this object as wrapped, this is mostly useful for array types +func (x *XMLObject) AsWrapped() *XMLObject { + x.Wrapped = true + return x +} + +// AsUnwrapped flags this object as an xml node +func (x *XMLObject) AsUnwrapped() *XMLObject { + x.Wrapped = false + return x +} diff --git a/vendor/github.com/go-openapi/swag/.editorconfig b/vendor/github.com/go-openapi/swag/.editorconfig new file mode 100644 index 0000000000..3152da69a5 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/.editorconfig @@ -0,0 +1,26 @@ +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +# Set default charset +[*.{js,py,go,scala,rb,java,html,css,less,sass,md}] +charset = utf-8 + +# Tab indentation (no size specified) +[*.go] +indent_style = tab + +[*.md] +trim_trailing_whitespace = false + +# Matches the exact files either package.json or .travis.yml +[{package.json,.travis.yml}] +indent_style = space +indent_size = 2 diff --git a/vendor/github.com/go-openapi/swag/.github/CONTRIBUTING.md b/vendor/github.com/go-openapi/swag/.github/CONTRIBUTING.md new file mode 100644 index 0000000000..7dea4240d7 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/.github/CONTRIBUTING.md @@ -0,0 +1,117 @@ +## Contribution Guidelines + +### Pull requests are always welcome + +We are always thrilled to receive pull requests, and do our best to +process them as fast as possible. Not sure if that typo is worth a pull +request? Do it! We will appreciate it. + +If your pull request is not accepted on the first try, don't be +discouraged! If there's a problem with the implementation, hopefully you +received feedback on what to improve. + +We're trying very hard to keep go-swagger lean and focused. We don't want it +to do everything for everybody. This means that we might decide against +incorporating a new feature. However, there might be a way to implement +that feature *on top of* go-swagger. + + +### Conventions + +Fork the repo and make changes on your fork in a feature branch: + +- If it's a bugfix branch, name it XXX-something where XXX is the number of the + issue +- If it's a feature branch, create an enhancement issue to announce your + intentions, and name it XXX-something where XXX is the number of the issue. + +Submit unit tests for your changes. Go has a great test framework built in; use +it! Take a look at existing tests for inspiration. Run the full test suite on +your branch before submitting a pull request. + +Update the documentation when creating or modifying features. Test +your documentation changes for clarity, concision, and correctness, as +well as a clean documentation build. See ``docs/README.md`` for more +information on building the docs and how docs get released. + +Write clean code. Universally formatted code promotes ease of writing, reading, +and maintenance. Always run `gofmt -s -w file.go` on each changed file before +committing your changes. Most editors have plugins that do this automatically. + +Pull requests descriptions should be as clear as possible and include a +reference to all the issues that they address. + +Pull requests must not contain commits from other users or branches. + +Commit messages must start with a capitalized and short summary (max. 50 +chars) written in the imperative, followed by an optional, more detailed +explanatory text which is separated from the summary by an empty line. + +Code review comments may be added to your pull request. Discuss, then make the +suggested modifications and push additional commits to your feature branch. Be +sure to post a comment after pushing. The new commits will show up in the pull +request automatically, but the reviewers will not be notified unless you +comment. + +Before the pull request is merged, make sure that you squash your commits into +logical units of work using `git rebase -i` and `git push -f`. After every +commit the test suite should be passing. Include documentation changes in the +same commit so that a revert would remove all traces of the feature or fix. + +Commits that fix or close an issue should include a reference like `Closes #XXX` +or `Fixes #XXX`, which will automatically close the issue when merged. + +### Sign your work + +The sign-off is a simple line at the end of the explanation for the +patch, which certifies that you wrote it or otherwise have the right to +pass it on as an open-source patch. The rules are pretty simple: if you +can certify the below (from +[developercertificate.org](http://developercertificate.org/)): + +``` +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +660 York Street, Suite 102, +San Francisco, CA 94110 USA + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. +``` + +then you just add a line to every git commit message: + + Signed-off-by: Joe Smith + +using your real name (sorry, no pseudonyms or anonymous contributions.) + +You can add the sign off when creating the git commit via `git commit -s`. diff --git a/vendor/github.com/go-openapi/swag/.gitignore b/vendor/github.com/go-openapi/swag/.gitignore new file mode 100644 index 0000000000..5862205eec --- /dev/null +++ b/vendor/github.com/go-openapi/swag/.gitignore @@ -0,0 +1,3 @@ +secrets.yml +vendor +Godeps diff --git a/vendor/github.com/go-openapi/swag/.golangci.yml b/vendor/github.com/go-openapi/swag/.golangci.yml new file mode 100644 index 0000000000..625c3d6aff --- /dev/null +++ b/vendor/github.com/go-openapi/swag/.golangci.yml @@ -0,0 +1,22 @@ +linters-settings: + govet: + check-shadowing: true + golint: + min-confidence: 0 + gocyclo: + min-complexity: 25 + maligned: + suggest-new: true + dupl: + threshold: 100 + goconst: + min-len: 3 + min-occurrences: 2 + +linters: + enable-all: true + disable: + - maligned + - lll + - gochecknoinits + - gochecknoglobals diff --git a/vendor/github.com/go-openapi/swag/.travis.yml b/vendor/github.com/go-openapi/swag/.travis.yml new file mode 100644 index 0000000000..bd3a2e527d --- /dev/null +++ b/vendor/github.com/go-openapi/swag/.travis.yml @@ -0,0 +1,16 @@ +after_success: +- bash <(curl -s https://codecov.io/bash) +go: +- '1.9' +- 1.10.x +- 1.11.x +install: +- go get -u github.com/stretchr/testify +- go get -u github.com/mailru/easyjson +- go get -u gopkg.in/yaml.v2 +language: go +notifications: + slack: + secure: QUWvCkBBK09GF7YtEvHHVt70JOkdlNBG0nIKu/5qc4/nW5HP8I2w0SEf/XR2je0eED1Qe3L/AfMCWwrEj+IUZc3l4v+ju8X8R3Lomhme0Eb0jd1MTMCuPcBT47YCj0M7RON7vXtbFfm1hFJ/jLe5+9FXz0hpXsR24PJc5ZIi/ogNwkaPqG4BmndzecpSh0vc2FJPZUD9LT0I09REY/vXR0oQAalLkW0asGD5taHZTUZq/kBpsNxaAFrLM23i4mUcf33M5fjLpvx5LRICrX/57XpBrDh2TooBU6Qj3CgoY0uPRYUmSNxbVx1czNzl2JtEpb5yjoxfVPQeg0BvQM00G8LJINISR+ohrjhkZmAqchDupAX+yFrxTtORa78CtnIL6z/aTNlgwwVD8kvL/1pFA/JWYmKDmz93mV/+6wubGzNSQCstzjkFA4/iZEKewKUoRIAi/fxyscP6L/rCpmY/4llZZvrnyTqVbt6URWpopUpH4rwYqreXAtJxJsfBJIeSmUIiDIOMGkCTvyTEW3fWGmGoqWtSHLoaWDyAIGb7azb+KvfpWtEcoPFWfSWU+LGee0A/YsUhBl7ADB9A0CJEuR8q4BPpKpfLwPKSiKSAXL7zDkyjExyhtgqbSl2jS+rKIHOZNL8JkCcTP2MKMVd563C5rC5FMKqu3S9m2b6380E= +script: +- go test -v -race -cover -coverprofile=coverage.txt -covermode=atomic ./... diff --git a/vendor/github.com/go-openapi/swag/CODE_OF_CONDUCT.md b/vendor/github.com/go-openapi/swag/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..9322b065e3 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at ivan+abuse@flanders.co.nz. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/go-openapi/swag/LICENSE b/vendor/github.com/go-openapi/swag/LICENSE new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/go-openapi/swag/README.md b/vendor/github.com/go-openapi/swag/README.md new file mode 100644 index 0000000000..459a3e18d7 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/README.md @@ -0,0 +1,23 @@ +# Swag [![Build Status](https://travis-ci.org/go-openapi/swag.svg?branch=master)](https://travis-ci.org/go-openapi/swag) [![codecov](https://codecov.io/gh/go-openapi/swag/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/swag) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) + +[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/swag/master/LICENSE) +[![GoDoc](https://godoc.org/github.com/go-openapi/swag?status.svg)](http://godoc.org/github.com/go-openapi/swag) +[![GolangCI](https://golangci.com/badges/github.com/go-openapi/swag.svg)](https://golangci.com) +[![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/swag)](https://goreportcard.com/report/github.com/go-openapi/swag) + +Contains a bunch of helper functions for go-openapi and go-swagger projects. + +You may also use it standalone for your projects. + +* convert between value and pointers for builtin types +* convert from string to builtin types (wraps strconv) +* fast json concatenation +* search in path +* load from file or http +* name mangling + + +This repo has only few dependencies outside of the standard library: + +* JSON utilities depend on github.com/mailru/easyjson +* YAML utilities depend on gopkg.in/yaml.v2 diff --git a/vendor/github.com/go-openapi/swag/convert.go b/vendor/github.com/go-openapi/swag/convert.go new file mode 100644 index 0000000000..4e446ff703 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/convert.go @@ -0,0 +1,207 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package swag + +import ( + "math" + "strconv" + "strings" +) + +// same as ECMA Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER +const ( + maxJSONFloat = float64(1<<53 - 1) // 9007199254740991.0 2^53 - 1 + minJSONFloat = -float64(1<<53 - 1) //-9007199254740991.0 -2^53 - 1 + epsilon float64 = 1e-9 +) + +// IsFloat64AJSONInteger allow for integers [-2^53, 2^53-1] inclusive +func IsFloat64AJSONInteger(f float64) bool { + if math.IsNaN(f) || math.IsInf(f, 0) || f < minJSONFloat || f > maxJSONFloat { + return false + } + fa := math.Abs(f) + g := float64(uint64(f)) + ga := math.Abs(g) + + diff := math.Abs(f - g) + + // more info: https://floating-point-gui.de/errors/comparison/#look-out-for-edge-cases + if f == g { // best case + return true + } else if f == float64(int64(f)) || f == float64(uint64(f)) { // optimistic case + return true + } else if f == 0 || g == 0 || diff < math.SmallestNonzeroFloat64 { // very close to 0 values + return diff < (epsilon * math.SmallestNonzeroFloat64) + } + // check the relative error + return diff/math.Min(fa+ga, math.MaxFloat64) < epsilon +} + +var evaluatesAsTrue map[string]struct{} + +func init() { + evaluatesAsTrue = map[string]struct{}{ + "true": {}, + "1": {}, + "yes": {}, + "ok": {}, + "y": {}, + "on": {}, + "selected": {}, + "checked": {}, + "t": {}, + "enabled": {}, + } +} + +// ConvertBool turn a string into a boolean +func ConvertBool(str string) (bool, error) { + _, ok := evaluatesAsTrue[strings.ToLower(str)] + return ok, nil +} + +// ConvertFloat32 turn a string into a float32 +func ConvertFloat32(str string) (float32, error) { + f, err := strconv.ParseFloat(str, 32) + if err != nil { + return 0, err + } + return float32(f), nil +} + +// ConvertFloat64 turn a string into a float64 +func ConvertFloat64(str string) (float64, error) { + return strconv.ParseFloat(str, 64) +} + +// ConvertInt8 turn a string into int8 boolean +func ConvertInt8(str string) (int8, error) { + i, err := strconv.ParseInt(str, 10, 8) + if err != nil { + return 0, err + } + return int8(i), nil +} + +// ConvertInt16 turn a string into a int16 +func ConvertInt16(str string) (int16, error) { + i, err := strconv.ParseInt(str, 10, 16) + if err != nil { + return 0, err + } + return int16(i), nil +} + +// ConvertInt32 turn a string into a int32 +func ConvertInt32(str string) (int32, error) { + i, err := strconv.ParseInt(str, 10, 32) + if err != nil { + return 0, err + } + return int32(i), nil +} + +// ConvertInt64 turn a string into a int64 +func ConvertInt64(str string) (int64, error) { + return strconv.ParseInt(str, 10, 64) +} + +// ConvertUint8 turn a string into a uint8 +func ConvertUint8(str string) (uint8, error) { + i, err := strconv.ParseUint(str, 10, 8) + if err != nil { + return 0, err + } + return uint8(i), nil +} + +// ConvertUint16 turn a string into a uint16 +func ConvertUint16(str string) (uint16, error) { + i, err := strconv.ParseUint(str, 10, 16) + if err != nil { + return 0, err + } + return uint16(i), nil +} + +// ConvertUint32 turn a string into a uint32 +func ConvertUint32(str string) (uint32, error) { + i, err := strconv.ParseUint(str, 10, 32) + if err != nil { + return 0, err + } + return uint32(i), nil +} + +// ConvertUint64 turn a string into a uint64 +func ConvertUint64(str string) (uint64, error) { + return strconv.ParseUint(str, 10, 64) +} + +// FormatBool turns a boolean into a string +func FormatBool(value bool) string { + return strconv.FormatBool(value) +} + +// FormatFloat32 turns a float32 into a string +func FormatFloat32(value float32) string { + return strconv.FormatFloat(float64(value), 'f', -1, 32) +} + +// FormatFloat64 turns a float64 into a string +func FormatFloat64(value float64) string { + return strconv.FormatFloat(value, 'f', -1, 64) +} + +// FormatInt8 turns an int8 into a string +func FormatInt8(value int8) string { + return strconv.FormatInt(int64(value), 10) +} + +// FormatInt16 turns an int16 into a string +func FormatInt16(value int16) string { + return strconv.FormatInt(int64(value), 10) +} + +// FormatInt32 turns an int32 into a string +func FormatInt32(value int32) string { + return strconv.Itoa(int(value)) +} + +// FormatInt64 turns an int64 into a string +func FormatInt64(value int64) string { + return strconv.FormatInt(value, 10) +} + +// FormatUint8 turns an uint8 into a string +func FormatUint8(value uint8) string { + return strconv.FormatUint(uint64(value), 10) +} + +// FormatUint16 turns an uint16 into a string +func FormatUint16(value uint16) string { + return strconv.FormatUint(uint64(value), 10) +} + +// FormatUint32 turns an uint32 into a string +func FormatUint32(value uint32) string { + return strconv.FormatUint(uint64(value), 10) +} + +// FormatUint64 turns an uint64 into a string +func FormatUint64(value uint64) string { + return strconv.FormatUint(value, 10) +} diff --git a/vendor/github.com/go-openapi/swag/convert_types.go b/vendor/github.com/go-openapi/swag/convert_types.go new file mode 100644 index 0000000000..c95e4e78bd --- /dev/null +++ b/vendor/github.com/go-openapi/swag/convert_types.go @@ -0,0 +1,595 @@ +package swag + +import "time" + +// This file was taken from the aws go sdk + +// String returns a pointer to of the string value passed in. +func String(v string) *string { + return &v +} + +// StringValue returns the value of the string pointer passed in or +// "" if the pointer is nil. +func StringValue(v *string) string { + if v != nil { + return *v + } + return "" +} + +// StringSlice converts a slice of string values into a slice of +// string pointers +func StringSlice(src []string) []*string { + dst := make([]*string, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// StringValueSlice converts a slice of string pointers into a slice of +// string values +func StringValueSlice(src []*string) []string { + dst := make([]string, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// StringMap converts a string map of string values into a string +// map of string pointers +func StringMap(src map[string]string) map[string]*string { + dst := make(map[string]*string) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// StringValueMap converts a string map of string pointers into a string +// map of string values +func StringValueMap(src map[string]*string) map[string]string { + dst := make(map[string]string) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Bool returns a pointer to of the bool value passed in. +func Bool(v bool) *bool { + return &v +} + +// BoolValue returns the value of the bool pointer passed in or +// false if the pointer is nil. +func BoolValue(v *bool) bool { + if v != nil { + return *v + } + return false +} + +// BoolSlice converts a slice of bool values into a slice of +// bool pointers +func BoolSlice(src []bool) []*bool { + dst := make([]*bool, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// BoolValueSlice converts a slice of bool pointers into a slice of +// bool values +func BoolValueSlice(src []*bool) []bool { + dst := make([]bool, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// BoolMap converts a string map of bool values into a string +// map of bool pointers +func BoolMap(src map[string]bool) map[string]*bool { + dst := make(map[string]*bool) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// BoolValueMap converts a string map of bool pointers into a string +// map of bool values +func BoolValueMap(src map[string]*bool) map[string]bool { + dst := make(map[string]bool) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Int returns a pointer to of the int value passed in. +func Int(v int) *int { + return &v +} + +// IntValue returns the value of the int pointer passed in or +// 0 if the pointer is nil. +func IntValue(v *int) int { + if v != nil { + return *v + } + return 0 +} + +// IntSlice converts a slice of int values into a slice of +// int pointers +func IntSlice(src []int) []*int { + dst := make([]*int, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// IntValueSlice converts a slice of int pointers into a slice of +// int values +func IntValueSlice(src []*int) []int { + dst := make([]int, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// IntMap converts a string map of int values into a string +// map of int pointers +func IntMap(src map[string]int) map[string]*int { + dst := make(map[string]*int) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// IntValueMap converts a string map of int pointers into a string +// map of int values +func IntValueMap(src map[string]*int) map[string]int { + dst := make(map[string]int) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Int32 returns a pointer to of the int64 value passed in. +func Int32(v int32) *int32 { + return &v +} + +// Int32Value returns the value of the int64 pointer passed in or +// 0 if the pointer is nil. +func Int32Value(v *int32) int32 { + if v != nil { + return *v + } + return 0 +} + +// Int32Slice converts a slice of int64 values into a slice of +// int32 pointers +func Int32Slice(src []int32) []*int32 { + dst := make([]*int32, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Int32ValueSlice converts a slice of int32 pointers into a slice of +// int32 values +func Int32ValueSlice(src []*int32) []int32 { + dst := make([]int32, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Int32Map converts a string map of int32 values into a string +// map of int32 pointers +func Int32Map(src map[string]int32) map[string]*int32 { + dst := make(map[string]*int32) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Int32ValueMap converts a string map of int32 pointers into a string +// map of int32 values +func Int32ValueMap(src map[string]*int32) map[string]int32 { + dst := make(map[string]int32) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Int64 returns a pointer to of the int64 value passed in. +func Int64(v int64) *int64 { + return &v +} + +// Int64Value returns the value of the int64 pointer passed in or +// 0 if the pointer is nil. +func Int64Value(v *int64) int64 { + if v != nil { + return *v + } + return 0 +} + +// Int64Slice converts a slice of int64 values into a slice of +// int64 pointers +func Int64Slice(src []int64) []*int64 { + dst := make([]*int64, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Int64ValueSlice converts a slice of int64 pointers into a slice of +// int64 values +func Int64ValueSlice(src []*int64) []int64 { + dst := make([]int64, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Int64Map converts a string map of int64 values into a string +// map of int64 pointers +func Int64Map(src map[string]int64) map[string]*int64 { + dst := make(map[string]*int64) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Int64ValueMap converts a string map of int64 pointers into a string +// map of int64 values +func Int64ValueMap(src map[string]*int64) map[string]int64 { + dst := make(map[string]int64) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Uint returns a pouinter to of the uint value passed in. +func Uint(v uint) *uint { + return &v +} + +// UintValue returns the value of the uint pouinter passed in or +// 0 if the pouinter is nil. +func UintValue(v *uint) uint { + if v != nil { + return *v + } + return 0 +} + +// UintSlice converts a slice of uint values uinto a slice of +// uint pouinters +func UintSlice(src []uint) []*uint { + dst := make([]*uint, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// UintValueSlice converts a slice of uint pouinters uinto a slice of +// uint values +func UintValueSlice(src []*uint) []uint { + dst := make([]uint, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// UintMap converts a string map of uint values uinto a string +// map of uint pouinters +func UintMap(src map[string]uint) map[string]*uint { + dst := make(map[string]*uint) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// UintValueMap converts a string map of uint pouinters uinto a string +// map of uint values +func UintValueMap(src map[string]*uint) map[string]uint { + dst := make(map[string]uint) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Uint32 returns a pouinter to of the uint64 value passed in. +func Uint32(v uint32) *uint32 { + return &v +} + +// Uint32Value returns the value of the uint64 pouinter passed in or +// 0 if the pouinter is nil. +func Uint32Value(v *uint32) uint32 { + if v != nil { + return *v + } + return 0 +} + +// Uint32Slice converts a slice of uint64 values uinto a slice of +// uint32 pouinters +func Uint32Slice(src []uint32) []*uint32 { + dst := make([]*uint32, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Uint32ValueSlice converts a slice of uint32 pouinters uinto a slice of +// uint32 values +func Uint32ValueSlice(src []*uint32) []uint32 { + dst := make([]uint32, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Uint32Map converts a string map of uint32 values uinto a string +// map of uint32 pouinters +func Uint32Map(src map[string]uint32) map[string]*uint32 { + dst := make(map[string]*uint32) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Uint32ValueMap converts a string map of uint32 pouinters uinto a string +// map of uint32 values +func Uint32ValueMap(src map[string]*uint32) map[string]uint32 { + dst := make(map[string]uint32) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Uint64 returns a pouinter to of the uint64 value passed in. +func Uint64(v uint64) *uint64 { + return &v +} + +// Uint64Value returns the value of the uint64 pouinter passed in or +// 0 if the pouinter is nil. +func Uint64Value(v *uint64) uint64 { + if v != nil { + return *v + } + return 0 +} + +// Uint64Slice converts a slice of uint64 values uinto a slice of +// uint64 pouinters +func Uint64Slice(src []uint64) []*uint64 { + dst := make([]*uint64, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Uint64ValueSlice converts a slice of uint64 pouinters uinto a slice of +// uint64 values +func Uint64ValueSlice(src []*uint64) []uint64 { + dst := make([]uint64, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Uint64Map converts a string map of uint64 values uinto a string +// map of uint64 pouinters +func Uint64Map(src map[string]uint64) map[string]*uint64 { + dst := make(map[string]*uint64) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Uint64ValueMap converts a string map of uint64 pouinters uinto a string +// map of uint64 values +func Uint64ValueMap(src map[string]*uint64) map[string]uint64 { + dst := make(map[string]uint64) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Float64 returns a pointer to of the float64 value passed in. +func Float64(v float64) *float64 { + return &v +} + +// Float64Value returns the value of the float64 pointer passed in or +// 0 if the pointer is nil. +func Float64Value(v *float64) float64 { + if v != nil { + return *v + } + return 0 +} + +// Float64Slice converts a slice of float64 values into a slice of +// float64 pointers +func Float64Slice(src []float64) []*float64 { + dst := make([]*float64, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Float64ValueSlice converts a slice of float64 pointers into a slice of +// float64 values +func Float64ValueSlice(src []*float64) []float64 { + dst := make([]float64, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Float64Map converts a string map of float64 values into a string +// map of float64 pointers +func Float64Map(src map[string]float64) map[string]*float64 { + dst := make(map[string]*float64) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Float64ValueMap converts a string map of float64 pointers into a string +// map of float64 values +func Float64ValueMap(src map[string]*float64) map[string]float64 { + dst := make(map[string]float64) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Time returns a pointer to of the time.Time value passed in. +func Time(v time.Time) *time.Time { + return &v +} + +// TimeValue returns the value of the time.Time pointer passed in or +// time.Time{} if the pointer is nil. +func TimeValue(v *time.Time) time.Time { + if v != nil { + return *v + } + return time.Time{} +} + +// TimeSlice converts a slice of time.Time values into a slice of +// time.Time pointers +func TimeSlice(src []time.Time) []*time.Time { + dst := make([]*time.Time, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// TimeValueSlice converts a slice of time.Time pointers into a slice of +// time.Time values +func TimeValueSlice(src []*time.Time) []time.Time { + dst := make([]time.Time, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// TimeMap converts a string map of time.Time values into a string +// map of time.Time pointers +func TimeMap(src map[string]time.Time) map[string]*time.Time { + dst := make(map[string]*time.Time) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// TimeValueMap converts a string map of time.Time pointers into a string +// map of time.Time values +func TimeValueMap(src map[string]*time.Time) map[string]time.Time { + dst := make(map[string]time.Time) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} diff --git a/vendor/github.com/go-openapi/swag/doc.go b/vendor/github.com/go-openapi/swag/doc.go new file mode 100644 index 0000000000..e01e1a0234 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/doc.go @@ -0,0 +1,33 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* +Package swag contains a bunch of helper functions for go-openapi and go-swagger projects. + +You may also use it standalone for your projects. + + * convert between value and pointers for builtin types + * convert from string to builtin types (wraps strconv) + * fast json concatenation + * search in path + * load from file or http + * name mangling + + +This repo has only few dependencies outside of the standard library: + + * JSON utilities depend on github.com/mailru/easyjson + * YAML utilities depend on gopkg.in/yaml.v2 +*/ +package swag diff --git a/vendor/github.com/go-openapi/swag/go.mod b/vendor/github.com/go-openapi/swag/go.mod new file mode 100644 index 0000000000..9eb936a19b --- /dev/null +++ b/vendor/github.com/go-openapi/swag/go.mod @@ -0,0 +1,9 @@ +module github.com/go-openapi/swag + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/testify v1.2.2 + gopkg.in/yaml.v2 v2.2.1 +) diff --git a/vendor/github.com/go-openapi/swag/go.sum b/vendor/github.com/go-openapi/swag/go.sum new file mode 100644 index 0000000000..d6e717bd4e --- /dev/null +++ b/vendor/github.com/go-openapi/swag/go.sum @@ -0,0 +1,9 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/go-openapi/swag/json.go b/vendor/github.com/go-openapi/swag/json.go new file mode 100644 index 0000000000..33da5e4e7d --- /dev/null +++ b/vendor/github.com/go-openapi/swag/json.go @@ -0,0 +1,311 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package swag + +import ( + "bytes" + "encoding/json" + "log" + "reflect" + "strings" + "sync" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// nullJSON represents a JSON object with null type +var nullJSON = []byte("null") + +// DefaultJSONNameProvider the default cache for types +var DefaultJSONNameProvider = NewNameProvider() + +const comma = byte(',') + +var closers map[byte]byte + +func init() { + closers = map[byte]byte{ + '{': '}', + '[': ']', + } +} + +type ejMarshaler interface { + MarshalEasyJSON(w *jwriter.Writer) +} + +type ejUnmarshaler interface { + UnmarshalEasyJSON(w *jlexer.Lexer) +} + +// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaller +// so it takes the fastest option available. +func WriteJSON(data interface{}) ([]byte, error) { + if d, ok := data.(ejMarshaler); ok { + jw := new(jwriter.Writer) + d.MarshalEasyJSON(jw) + return jw.BuildBytes() + } + if d, ok := data.(json.Marshaler); ok { + return d.MarshalJSON() + } + return json.Marshal(data) +} + +// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaller +// so it takes the fastes option available +func ReadJSON(data []byte, value interface{}) error { + if d, ok := value.(ejUnmarshaler); ok { + jl := &jlexer.Lexer{Data: data} + d.UnmarshalEasyJSON(jl) + return jl.Error() + } + if d, ok := value.(json.Unmarshaler); ok { + return d.UnmarshalJSON(data) + } + return json.Unmarshal(data, value) +} + +// DynamicJSONToStruct converts an untyped json structure into a struct +func DynamicJSONToStruct(data interface{}, target interface{}) error { + // TODO: convert straight to a json typed map (mergo + iterate?) + b, err := WriteJSON(data) + if err != nil { + return err + } + return ReadJSON(b, target) +} + +// ConcatJSON concatenates multiple json objects efficiently +func ConcatJSON(blobs ...[]byte) []byte { + if len(blobs) == 0 { + return nil + } + + last := len(blobs) - 1 + for blobs[last] == nil || bytes.Equal(blobs[last], nullJSON) { + // strips trailing null objects + last = last - 1 + if last < 0 { + // there was nothing but "null"s or nil... + return nil + } + } + if last == 0 { + return blobs[0] + } + + var opening, closing byte + var idx, a int + buf := bytes.NewBuffer(nil) + + for i, b := range blobs[:last+1] { + if b == nil || bytes.Equal(b, nullJSON) { + // a null object is in the list: skip it + continue + } + if len(b) > 0 && opening == 0 { // is this an array or an object? + opening, closing = b[0], closers[b[0]] + } + + if opening != '{' && opening != '[' { + continue // don't know how to concatenate non container objects + } + + if len(b) < 3 { // yep empty but also the last one, so closing this thing + if i == last && a > 0 { + if err := buf.WriteByte(closing); err != nil { + log.Println(err) + } + } + continue + } + + idx = 0 + if a > 0 { // we need to join with a comma for everything beyond the first non-empty item + if err := buf.WriteByte(comma); err != nil { + log.Println(err) + } + idx = 1 // this is not the first or the last so we want to drop the leading bracket + } + + if i != last { // not the last one, strip brackets + if _, err := buf.Write(b[idx : len(b)-1]); err != nil { + log.Println(err) + } + } else { // last one, strip only the leading bracket + if _, err := buf.Write(b[idx:]); err != nil { + log.Println(err) + } + } + a++ + } + // somehow it ended up being empty, so provide a default value + if buf.Len() == 0 { + if err := buf.WriteByte(opening); err != nil { + log.Println(err) + } + if err := buf.WriteByte(closing); err != nil { + log.Println(err) + } + } + return buf.Bytes() +} + +// ToDynamicJSON turns an object into a properly JSON typed structure +func ToDynamicJSON(data interface{}) interface{} { + // TODO: convert straight to a json typed map (mergo + iterate?) + b, err := json.Marshal(data) + if err != nil { + log.Println(err) + } + var res interface{} + if err := json.Unmarshal(b, &res); err != nil { + log.Println(err) + } + return res +} + +// FromDynamicJSON turns an object into a properly JSON typed structure +func FromDynamicJSON(data, target interface{}) error { + b, err := json.Marshal(data) + if err != nil { + log.Println(err) + } + return json.Unmarshal(b, target) +} + +// NameProvider represents an object capabale of translating from go property names +// to json property names +// This type is thread-safe. +type NameProvider struct { + lock *sync.Mutex + index map[reflect.Type]nameIndex +} + +type nameIndex struct { + jsonNames map[string]string + goNames map[string]string +} + +// NewNameProvider creates a new name provider +func NewNameProvider() *NameProvider { + return &NameProvider{ + lock: &sync.Mutex{}, + index: make(map[reflect.Type]nameIndex), + } +} + +func buildnameIndex(tpe reflect.Type, idx, reverseIdx map[string]string) { + for i := 0; i < tpe.NumField(); i++ { + targetDes := tpe.Field(i) + + if targetDes.PkgPath != "" { // unexported + continue + } + + if targetDes.Anonymous { // walk embedded structures tree down first + buildnameIndex(targetDes.Type, idx, reverseIdx) + continue + } + + if tag := targetDes.Tag.Get("json"); tag != "" { + + parts := strings.Split(tag, ",") + if len(parts) == 0 { + continue + } + + nm := parts[0] + if nm == "-" { + continue + } + if nm == "" { // empty string means we want to use the Go name + nm = targetDes.Name + } + + idx[nm] = targetDes.Name + reverseIdx[targetDes.Name] = nm + } + } +} + +func newNameIndex(tpe reflect.Type) nameIndex { + var idx = make(map[string]string, tpe.NumField()) + var reverseIdx = make(map[string]string, tpe.NumField()) + + buildnameIndex(tpe, idx, reverseIdx) + return nameIndex{jsonNames: idx, goNames: reverseIdx} +} + +// GetJSONNames gets all the json property names for a type +func (n *NameProvider) GetJSONNames(subject interface{}) []string { + n.lock.Lock() + defer n.lock.Unlock() + tpe := reflect.Indirect(reflect.ValueOf(subject)).Type() + names, ok := n.index[tpe] + if !ok { + names = n.makeNameIndex(tpe) + } + + res := make([]string, 0, len(names.jsonNames)) + for k := range names.jsonNames { + res = append(res, k) + } + return res +} + +// GetJSONName gets the json name for a go property name +func (n *NameProvider) GetJSONName(subject interface{}, name string) (string, bool) { + tpe := reflect.Indirect(reflect.ValueOf(subject)).Type() + return n.GetJSONNameForType(tpe, name) +} + +// GetJSONNameForType gets the json name for a go property name on a given type +func (n *NameProvider) GetJSONNameForType(tpe reflect.Type, name string) (string, bool) { + n.lock.Lock() + defer n.lock.Unlock() + names, ok := n.index[tpe] + if !ok { + names = n.makeNameIndex(tpe) + } + nme, ok := names.goNames[name] + return nme, ok +} + +func (n *NameProvider) makeNameIndex(tpe reflect.Type) nameIndex { + names := newNameIndex(tpe) + n.index[tpe] = names + return names +} + +// GetGoName gets the go name for a json property name +func (n *NameProvider) GetGoName(subject interface{}, name string) (string, bool) { + tpe := reflect.Indirect(reflect.ValueOf(subject)).Type() + return n.GetGoNameForType(tpe, name) +} + +// GetGoNameForType gets the go name for a given type for a json property name +func (n *NameProvider) GetGoNameForType(tpe reflect.Type, name string) (string, bool) { + n.lock.Lock() + defer n.lock.Unlock() + names, ok := n.index[tpe] + if !ok { + names = n.makeNameIndex(tpe) + } + nme, ok := names.jsonNames[name] + return nme, ok +} diff --git a/vendor/github.com/go-openapi/swag/loading.go b/vendor/github.com/go-openapi/swag/loading.go new file mode 100644 index 0000000000..70f4fb361c --- /dev/null +++ b/vendor/github.com/go-openapi/swag/loading.go @@ -0,0 +1,80 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package swag + +import ( + "fmt" + "io/ioutil" + "log" + "net/http" + "path/filepath" + "strings" + "time" +) + +// LoadHTTPTimeout the default timeout for load requests +var LoadHTTPTimeout = 30 * time.Second + +// LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in +func LoadFromFileOrHTTP(path string) ([]byte, error) { + return LoadStrategy(path, ioutil.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(path) +} + +// LoadFromFileOrHTTPWithTimeout loads the bytes from a file or a remote http server based on the path passed in +// timeout arg allows for per request overriding of the request timeout +func LoadFromFileOrHTTPWithTimeout(path string, timeout time.Duration) ([]byte, error) { + return LoadStrategy(path, ioutil.ReadFile, loadHTTPBytes(timeout))(path) +} + +// LoadStrategy returns a loader function for a given path or uri +func LoadStrategy(path string, local, remote func(string) ([]byte, error)) func(string) ([]byte, error) { + if strings.HasPrefix(path, "http") { + return remote + } + return func(pth string) ([]byte, error) { + upth, err := pathUnescape(pth) + if err != nil { + return nil, err + } + return local(filepath.FromSlash(upth)) + } +} + +func loadHTTPBytes(timeout time.Duration) func(path string) ([]byte, error) { + return func(path string) ([]byte, error) { + client := &http.Client{Timeout: timeout} + req, err := http.NewRequest("GET", path, nil) + if err != nil { + return nil, err + } + resp, err := client.Do(req) + defer func() { + if resp != nil { + if e := resp.Body.Close(); e != nil { + log.Println(e) + } + } + }() + if err != nil { + return nil, err + } + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("could not access document at %q [%s] ", path, resp.Status) + } + + return ioutil.ReadAll(resp.Body) + } +} diff --git a/vendor/github.com/go-openapi/swag/net.go b/vendor/github.com/go-openapi/swag/net.go new file mode 100644 index 0000000000..821235f84d --- /dev/null +++ b/vendor/github.com/go-openapi/swag/net.go @@ -0,0 +1,38 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package swag + +import ( + "net" + "strconv" +) + +// SplitHostPort splits a network address into a host and a port. +// The port is -1 when there is no port to be found +func SplitHostPort(addr string) (host string, port int, err error) { + h, p, err := net.SplitHostPort(addr) + if err != nil { + return "", -1, err + } + if p == "" { + return "", -1, &net.AddrError{Err: "missing port in address", Addr: addr} + } + + pi, err := strconv.Atoi(p) + if err != nil { + return "", -1, err + } + return h, pi, nil +} diff --git a/vendor/github.com/go-openapi/swag/path.go b/vendor/github.com/go-openapi/swag/path.go new file mode 100644 index 0000000000..941bd0176b --- /dev/null +++ b/vendor/github.com/go-openapi/swag/path.go @@ -0,0 +1,59 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package swag + +import ( + "os" + "path/filepath" + "runtime" + "strings" +) + +const ( + // GOPATHKey represents the env key for gopath + GOPATHKey = "GOPATH" +) + +// FindInSearchPath finds a package in a provided lists of paths +func FindInSearchPath(searchPath, pkg string) string { + pathsList := filepath.SplitList(searchPath) + for _, path := range pathsList { + if evaluatedPath, err := filepath.EvalSymlinks(filepath.Join(path, "src", pkg)); err == nil { + if _, err := os.Stat(evaluatedPath); err == nil { + return evaluatedPath + } + } + } + return "" +} + +// FindInGoSearchPath finds a package in the $GOPATH:$GOROOT +func FindInGoSearchPath(pkg string) string { + return FindInSearchPath(FullGoSearchPath(), pkg) +} + +// FullGoSearchPath gets the search paths for finding packages +func FullGoSearchPath() string { + allPaths := os.Getenv(GOPATHKey) + if allPaths == "" { + allPaths = filepath.Join(os.Getenv("HOME"), "go") + } + if allPaths != "" { + allPaths = strings.Join([]string{allPaths, runtime.GOROOT()}, ":") + } else { + allPaths = runtime.GOROOT() + } + return allPaths +} diff --git a/vendor/github.com/go-openapi/swag/post_go18.go b/vendor/github.com/go-openapi/swag/post_go18.go new file mode 100644 index 0000000000..c2e686d313 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/post_go18.go @@ -0,0 +1,23 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build go1.8 + +package swag + +import "net/url" + +func pathUnescape(path string) (string, error) { + return url.PathUnescape(path) +} diff --git a/vendor/github.com/go-openapi/swag/post_go19.go b/vendor/github.com/go-openapi/swag/post_go19.go new file mode 100644 index 0000000000..9db23c0950 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/post_go19.go @@ -0,0 +1,67 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build go1.9 + +package swag + +import ( + "sort" + "sync" +) + +// indexOfInitialisms is a thread-safe implementation of the sorted index of initialisms. +// Since go1.9, this may be implemented with sync.Map. +type indexOfInitialisms struct { + sortMutex *sync.Mutex + index *sync.Map +} + +func newIndexOfInitialisms() *indexOfInitialisms { + return &indexOfInitialisms{ + sortMutex: new(sync.Mutex), + index: new(sync.Map), + } +} + +func (m *indexOfInitialisms) load(initial map[string]bool) *indexOfInitialisms { + m.sortMutex.Lock() + defer m.sortMutex.Unlock() + for k, v := range initial { + m.index.Store(k, v) + } + return m +} + +func (m *indexOfInitialisms) isInitialism(key string) bool { + _, ok := m.index.Load(key) + return ok +} + +func (m *indexOfInitialisms) add(key string) *indexOfInitialisms { + m.index.Store(key, true) + return m +} + +func (m *indexOfInitialisms) sorted() (result []string) { + m.sortMutex.Lock() + defer m.sortMutex.Unlock() + m.index.Range(func(key, value interface{}) bool { + k := key.(string) + result = append(result, k) + return true + }) + sort.Sort(sort.Reverse(byLength(result))) + return +} diff --git a/vendor/github.com/go-openapi/swag/pre_go18.go b/vendor/github.com/go-openapi/swag/pre_go18.go new file mode 100644 index 0000000000..6607f33935 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/pre_go18.go @@ -0,0 +1,23 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !go1.8 + +package swag + +import "net/url" + +func pathUnescape(path string) (string, error) { + return url.QueryUnescape(path) +} diff --git a/vendor/github.com/go-openapi/swag/pre_go19.go b/vendor/github.com/go-openapi/swag/pre_go19.go new file mode 100644 index 0000000000..9c96ab90f9 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/pre_go19.go @@ -0,0 +1,69 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !go1.9 + +package swag + +import ( + "sort" + "sync" +) + +// indexOfInitialisms is a thread-safe implementation of the sorted index of initialisms. +// Before go1.9, this may be implemented with a mutex on the map. +type indexOfInitialisms struct { + getMutex *sync.Mutex + index map[string]bool +} + +func newIndexOfInitialisms() *indexOfInitialisms { + return &indexOfInitialisms{ + getMutex: new(sync.Mutex), + index: make(map[string]bool, 50), + } +} + +func (m *indexOfInitialisms) load(initial map[string]bool) *indexOfInitialisms { + m.getMutex.Lock() + defer m.getMutex.Unlock() + for k, v := range initial { + m.index[k] = v + } + return m +} + +func (m *indexOfInitialisms) isInitialism(key string) bool { + m.getMutex.Lock() + defer m.getMutex.Unlock() + _, ok := m.index[key] + return ok +} + +func (m *indexOfInitialisms) add(key string) *indexOfInitialisms { + m.getMutex.Lock() + defer m.getMutex.Unlock() + m.index[key] = true + return m +} + +func (m *indexOfInitialisms) sorted() (result []string) { + m.getMutex.Lock() + defer m.getMutex.Unlock() + for k := range m.index { + result = append(result, k) + } + sort.Sort(sort.Reverse(byLength(result))) + return +} diff --git a/vendor/github.com/go-openapi/swag/util.go b/vendor/github.com/go-openapi/swag/util.go new file mode 100644 index 0000000000..164c96762f --- /dev/null +++ b/vendor/github.com/go-openapi/swag/util.go @@ -0,0 +1,412 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package swag + +import ( + "math" + "reflect" + "regexp" + "strings" + "sync" + "unicode" +) + +// commonInitialisms are common acronyms that are kept as whole uppercased words. +var commonInitialisms *indexOfInitialisms + +// initialisms is a slice of sorted initialisms +var initialisms []string + +var once sync.Once + +var isInitialism func(string) bool + +var ( + splitRex1 *regexp.Regexp + splitRex2 *regexp.Regexp + splitReplacer *strings.Replacer +) + +func init() { + // Taken from https://github.com/golang/lint/blob/3390df4df2787994aea98de825b964ac7944b817/lint.go#L732-L769 + var configuredInitialisms = map[string]bool{ + "ACL": true, + "API": true, + "ASCII": true, + "CPU": true, + "CSS": true, + "DNS": true, + "EOF": true, + "GUID": true, + "HTML": true, + "HTTPS": true, + "HTTP": true, + "ID": true, + "IP": true, + "JSON": true, + "LHS": true, + "OAI": true, + "QPS": true, + "RAM": true, + "RHS": true, + "RPC": true, + "SLA": true, + "SMTP": true, + "SQL": true, + "SSH": true, + "TCP": true, + "TLS": true, + "TTL": true, + "UDP": true, + "UI": true, + "UID": true, + "UUID": true, + "URI": true, + "URL": true, + "UTF8": true, + "VM": true, + "XML": true, + "XMPP": true, + "XSRF": true, + "XSS": true, + } + + // a thread-safe index of initialisms + commonInitialisms = newIndexOfInitialisms().load(configuredInitialisms) + + // a test function + isInitialism = commonInitialisms.isInitialism +} + +func ensureSorted() { + initialisms = commonInitialisms.sorted() +} + +const ( + //collectionFormatComma = "csv" + collectionFormatSpace = "ssv" + collectionFormatTab = "tsv" + collectionFormatPipe = "pipes" + collectionFormatMulti = "multi" +) + +// JoinByFormat joins a string array by a known format (e.g. swagger's collectionFormat attribute): +// ssv: space separated value +// tsv: tab separated value +// pipes: pipe (|) separated value +// csv: comma separated value (default) +func JoinByFormat(data []string, format string) []string { + if len(data) == 0 { + return data + } + var sep string + switch format { + case collectionFormatSpace: + sep = " " + case collectionFormatTab: + sep = "\t" + case collectionFormatPipe: + sep = "|" + case collectionFormatMulti: + return data + default: + sep = "," + } + return []string{strings.Join(data, sep)} +} + +// SplitByFormat splits a string by a known format: +// ssv: space separated value +// tsv: tab separated value +// pipes: pipe (|) separated value +// csv: comma separated value (default) +// +func SplitByFormat(data, format string) []string { + if data == "" { + return nil + } + var sep string + switch format { + case collectionFormatSpace: + sep = " " + case collectionFormatTab: + sep = "\t" + case collectionFormatPipe: + sep = "|" + case collectionFormatMulti: + return nil + default: + sep = "," + } + var result []string + for _, s := range strings.Split(data, sep) { + if ts := strings.TrimSpace(s); ts != "" { + result = append(result, ts) + } + } + return result +} + +type byLength []string + +func (s byLength) Len() int { + return len(s) +} +func (s byLength) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} +func (s byLength) Less(i, j int) bool { + return len(s[i]) < len(s[j]) +} + +// Prepares strings by splitting by caps, spaces, dashes, and underscore +func split(str string) []string { + // check if consecutive single char things make up an initialism + once.Do(func() { + splitRex1 = regexp.MustCompile(`(\p{Lu})`) + splitRex2 = regexp.MustCompile(`(\pL|\pM|\pN|\p{Pc})+`) + splitReplacer = strings.NewReplacer( + "@", "At ", + "&", "And ", + "|", "Pipe ", + "$", "Dollar ", + "!", "Bang ", + "-", " ", + "_", " ", + ) + ensureSorted() + }) + + str = trim(str) + + // Convert dash and underscore to spaces + str = splitReplacer.Replace(str) + + // Split when uppercase is found (needed for Snake) + str = splitRex1.ReplaceAllString(str, " $1") + + for _, k := range initialisms { + str = strings.Replace(str, splitRex1.ReplaceAllString(k, " $1"), " "+k, -1) + } + // Get the final list of words + //words = rex2.FindAllString(str, -1) + return splitRex2.FindAllString(str, -1) +} + +// Removes leading whitespaces +func trim(str string) string { + return strings.Trim(str, " ") +} + +// Shortcut to strings.ToUpper() +func upper(str string) string { + return strings.ToUpper(trim(str)) +} + +// Shortcut to strings.ToLower() +func lower(str string) string { + return strings.ToLower(trim(str)) +} + +// Camelize an uppercased word +func Camelize(word string) (camelized string) { + for pos, ru := range word { + if pos > 0 { + camelized += string(unicode.ToLower(ru)) + } else { + camelized += string(unicode.ToUpper(ru)) + } + } + return +} + +// ToFileName lowercases and underscores a go type name +func ToFileName(name string) string { + in := split(name) + out := make([]string, 0, len(in)) + + for _, w := range in { + out = append(out, lower(w)) + } + + return strings.Join(out, "_") +} + +// ToCommandName lowercases and underscores a go type name +func ToCommandName(name string) string { + in := split(name) + out := make([]string, 0, len(in)) + + for _, w := range in { + out = append(out, lower(w)) + } + return strings.Join(out, "-") +} + +// ToHumanNameLower represents a code name as a human series of words +func ToHumanNameLower(name string) string { + in := split(name) + out := make([]string, 0, len(in)) + + for _, w := range in { + if !isInitialism(upper(w)) { + out = append(out, lower(w)) + } else { + out = append(out, w) + } + } + return strings.Join(out, " ") +} + +// ToHumanNameTitle represents a code name as a human series of words with the first letters titleized +func ToHumanNameTitle(name string) string { + in := split(name) + out := make([]string, 0, len(in)) + + for _, w := range in { + uw := upper(w) + if !isInitialism(uw) { + out = append(out, upper(w[:1])+lower(w[1:])) + } else { + out = append(out, w) + } + } + return strings.Join(out, " ") +} + +// ToJSONName camelcases a name which can be underscored or pascal cased +func ToJSONName(name string) string { + in := split(name) + out := make([]string, 0, len(in)) + + for i, w := range in { + if i == 0 { + out = append(out, lower(w)) + continue + } + out = append(out, upper(w[:1])+lower(w[1:])) + } + return strings.Join(out, "") +} + +// ToVarName camelcases a name which can be underscored or pascal cased +func ToVarName(name string) string { + res := ToGoName(name) + if isInitialism(res) { + return lower(res) + } + if len(res) <= 1 { + return lower(res) + } + return lower(res[:1]) + res[1:] +} + +// ToGoName translates a swagger name which can be underscored or camel cased to a name that golint likes +func ToGoName(name string) string { + in := split(name) + out := make([]string, 0, len(in)) + + for _, w := range in { + uw := upper(w) + mod := int(math.Min(float64(len(uw)), 2)) + if !isInitialism(uw) && !isInitialism(uw[:len(uw)-mod]) { + uw = upper(w[:1]) + lower(w[1:]) + } + out = append(out, uw) + } + + result := strings.Join(out, "") + if len(result) > 0 { + ud := upper(result[:1]) + ru := []rune(ud) + if unicode.IsUpper(ru[0]) { + result = ud + result[1:] + } else { + result = "X" + ud + result[1:] + } + } + return result +} + +// ContainsStrings searches a slice of strings for a case-sensitive match +func ContainsStrings(coll []string, item string) bool { + for _, a := range coll { + if a == item { + return true + } + } + return false +} + +// ContainsStringsCI searches a slice of strings for a case-insensitive match +func ContainsStringsCI(coll []string, item string) bool { + for _, a := range coll { + if strings.EqualFold(a, item) { + return true + } + } + return false +} + +type zeroable interface { + IsZero() bool +} + +// IsZero returns true when the value passed into the function is a zero value. +// This allows for safer checking of interface values. +func IsZero(data interface{}) bool { + // check for things that have an IsZero method instead + if vv, ok := data.(zeroable); ok { + return vv.IsZero() + } + // continue with slightly more complex reflection + v := reflect.ValueOf(data) + switch v.Kind() { + case reflect.String: + return v.Len() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return v.IsNil() + case reflect.Struct, reflect.Array: + return reflect.DeepEqual(data, reflect.Zero(v.Type()).Interface()) + case reflect.Invalid: + return true + } + return false +} + +// AddInitialisms add additional initialisms +func AddInitialisms(words ...string) { + for _, word := range words { + //commonInitialisms[upper(word)] = true + commonInitialisms.add(upper(word)) + } + // sort again + initialisms = commonInitialisms.sorted() +} + +// CommandLineOptionsGroup represents a group of user-defined command line options +type CommandLineOptionsGroup struct { + ShortDescription string + LongDescription string + Options interface{} +} diff --git a/vendor/github.com/go-openapi/swag/yaml.go b/vendor/github.com/go-openapi/swag/yaml.go new file mode 100644 index 0000000000..435e2948eb --- /dev/null +++ b/vendor/github.com/go-openapi/swag/yaml.go @@ -0,0 +1,227 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package swag + +import ( + "encoding/json" + "fmt" + "path/filepath" + "strconv" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" + yaml "gopkg.in/yaml.v2" +) + +// YAMLMatcher matches yaml +func YAMLMatcher(path string) bool { + ext := filepath.Ext(path) + return ext == ".yaml" || ext == ".yml" +} + +// YAMLToJSON converts YAML unmarshaled data into json compatible data +func YAMLToJSON(data interface{}) (json.RawMessage, error) { + jm, err := transformData(data) + if err != nil { + return nil, err + } + b, err := WriteJSON(jm) + return json.RawMessage(b), err +} + +// BytesToYAMLDoc converts a byte slice into a YAML document +func BytesToYAMLDoc(data []byte) (interface{}, error) { + var canary map[interface{}]interface{} // validate this is an object and not a different type + if err := yaml.Unmarshal(data, &canary); err != nil { + return nil, err + } + + var document yaml.MapSlice // preserve order that is present in the document + if err := yaml.Unmarshal(data, &document); err != nil { + return nil, err + } + return document, nil +} + +// JSONMapSlice represent a JSON object, with the order of keys maintained +type JSONMapSlice []JSONMapItem + +// MarshalJSON renders a JSONMapSlice as JSON +func (s JSONMapSlice) MarshalJSON() ([]byte, error) { + w := &jwriter.Writer{Flags: jwriter.NilMapAsEmpty | jwriter.NilSliceAsEmpty} + s.MarshalEasyJSON(w) + return w.BuildBytes() +} + +// MarshalEasyJSON renders a JSONMapSlice as JSON, using easyJSON +func (s JSONMapSlice) MarshalEasyJSON(w *jwriter.Writer) { + w.RawByte('{') + + ln := len(s) + last := ln - 1 + for i := 0; i < ln; i++ { + s[i].MarshalEasyJSON(w) + if i != last { // last item + w.RawByte(',') + } + } + + w.RawByte('}') +} + +// UnmarshalJSON makes a JSONMapSlice from JSON +func (s *JSONMapSlice) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + s.UnmarshalEasyJSON(&l) + return l.Error() +} + +// UnmarshalEasyJSON makes a JSONMapSlice from JSON, using easyJSON +func (s *JSONMapSlice) UnmarshalEasyJSON(in *jlexer.Lexer) { + if in.IsNull() { + in.Skip() + return + } + + var result JSONMapSlice + in.Delim('{') + for !in.IsDelim('}') { + var mi JSONMapItem + mi.UnmarshalEasyJSON(in) + result = append(result, mi) + } + *s = result +} + +// JSONMapItem represents the value of a key in a JSON object held by JSONMapSlice +type JSONMapItem struct { + Key string + Value interface{} +} + +// MarshalJSON renders a JSONMapItem as JSON +func (s JSONMapItem) MarshalJSON() ([]byte, error) { + w := &jwriter.Writer{Flags: jwriter.NilMapAsEmpty | jwriter.NilSliceAsEmpty} + s.MarshalEasyJSON(w) + return w.BuildBytes() +} + +// MarshalEasyJSON renders a JSONMapItem as JSON, using easyJSON +func (s JSONMapItem) MarshalEasyJSON(w *jwriter.Writer) { + w.String(s.Key) + w.RawByte(':') + w.Raw(WriteJSON(s.Value)) +} + +// UnmarshalJSON makes a JSONMapItem from JSON +func (s *JSONMapItem) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + s.UnmarshalEasyJSON(&l) + return l.Error() +} + +// UnmarshalEasyJSON makes a JSONMapItem from JSON, using easyJSON +func (s *JSONMapItem) UnmarshalEasyJSON(in *jlexer.Lexer) { + key := in.UnsafeString() + in.WantColon() + value := in.Interface() + in.WantComma() + s.Key = key + s.Value = value +} + +func transformData(input interface{}) (out interface{}, err error) { + switch in := input.(type) { + case yaml.MapSlice: + + o := make(JSONMapSlice, len(in)) + for i, mi := range in { + var nmi JSONMapItem + switch k := mi.Key.(type) { + case string: + nmi.Key = k + case int: + nmi.Key = strconv.Itoa(k) + default: + return nil, fmt.Errorf("types don't match expect map key string or int got: %T", mi.Key) + } + + v, ert := transformData(mi.Value) + if ert != nil { + return nil, ert + } + nmi.Value = v + o[i] = nmi + } + return o, nil + case map[interface{}]interface{}: + o := make(JSONMapSlice, 0, len(in)) + for ke, va := range in { + var nmi JSONMapItem + switch k := ke.(type) { + case string: + nmi.Key = k + case int: + nmi.Key = strconv.Itoa(k) + default: + return nil, fmt.Errorf("types don't match expect map key string or int got: %T", ke) + } + + v, ert := transformData(va) + if ert != nil { + return nil, ert + } + nmi.Value = v + o = append(o, nmi) + } + return o, nil + case []interface{}: + len1 := len(in) + o := make([]interface{}, len1) + for i := 0; i < len1; i++ { + o[i], err = transformData(in[i]) + if err != nil { + return nil, err + } + } + return o, nil + } + return input, nil +} + +// YAMLDoc loads a yaml document from either http or a file and converts it to json +func YAMLDoc(path string) (json.RawMessage, error) { + yamlDoc, err := YAMLData(path) + if err != nil { + return nil, err + } + + data, err := YAMLToJSON(yamlDoc) + if err != nil { + return nil, err + } + + return data, nil +} + +// YAMLData loads a yaml document from either http or a file +func YAMLData(path string) (interface{}, error) { + data, err := LoadFromFileOrHTTP(path) + if err != nil { + return nil, err + } + + return BytesToYAMLDoc(data) +} diff --git a/vendor/github.com/mailru/easyjson/.gitignore b/vendor/github.com/mailru/easyjson/.gitignore new file mode 100644 index 0000000000..26156fb4b4 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/.gitignore @@ -0,0 +1,5 @@ +.root +*_easyjson.go +*.iml +.idea +*.swp diff --git a/vendor/github.com/mailru/easyjson/.travis.yml b/vendor/github.com/mailru/easyjson/.travis.yml new file mode 100644 index 0000000000..77891411a3 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/.travis.yml @@ -0,0 +1,9 @@ +language: go + +go: + - tip +install: + - go get github.com/ugorji/go/codec + - go get github.com/pquerna/ffjson/fflib/v1 + - go get github.com/json-iterator/go + - go get golang.org/x/lint/golint diff --git a/vendor/github.com/mailru/easyjson/LICENSE b/vendor/github.com/mailru/easyjson/LICENSE new file mode 100644 index 0000000000..fbff658f70 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2016 Mail.Ru Group + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/mailru/easyjson/Makefile b/vendor/github.com/mailru/easyjson/Makefile new file mode 100644 index 0000000000..18c668761e --- /dev/null +++ b/vendor/github.com/mailru/easyjson/Makefile @@ -0,0 +1,63 @@ +PKG=github.com/mailru/easyjson +GOPATH:=$(PWD)/.root:$(GOPATH) +export GOPATH + +all: test + +.root/src/$(PKG): + mkdir -p $@ + for i in $$PWD/* ; do ln -s $$i $@/`basename $$i` ; done + +root: .root/src/$(PKG) + +clean: + rm -rf .root + rm -rf tests/*_easyjson.go + +build: + go build -i -o .root/bin/easyjson $(PKG)/easyjson + +generate: root build + .root/bin/easyjson -stubs \ + .root/src/$(PKG)/tests/snake.go \ + .root/src/$(PKG)/tests/data.go \ + .root/src/$(PKG)/tests/omitempty.go \ + .root/src/$(PKG)/tests/nothing.go \ + .root/src/$(PKG)/tests/named_type.go \ + .root/src/$(PKG)/tests/custom_map_key_type.go \ + .root/src/$(PKG)/tests/embedded_type.go \ + .root/src/$(PKG)/tests/reference_to_pointer.go + + .root/bin/easyjson -all .root/src/$(PKG)/tests/data.go + .root/bin/easyjson -all .root/src/$(PKG)/tests/nothing.go + .root/bin/easyjson -all .root/src/$(PKG)/tests/errors.go + .root/bin/easyjson -snake_case .root/src/$(PKG)/tests/snake.go + .root/bin/easyjson -omit_empty .root/src/$(PKG)/tests/omitempty.go + .root/bin/easyjson -build_tags=use_easyjson .root/src/$(PKG)/benchmark/data.go + .root/bin/easyjson .root/src/$(PKG)/tests/nested_easy.go + .root/bin/easyjson .root/src/$(PKG)/tests/named_type.go + .root/bin/easyjson .root/src/$(PKG)/tests/custom_map_key_type.go + .root/bin/easyjson .root/src/$(PKG)/tests/embedded_type.go + .root/bin/easyjson .root/src/$(PKG)/tests/reference_to_pointer.go + .root/bin/easyjson -disallow_unknown_fields .root/src/$(PKG)/tests/disallow_unknown.go + +test: generate root + go test \ + $(PKG)/tests \ + $(PKG)/jlexer \ + $(PKG)/gen \ + $(PKG)/buffer + go test -benchmem -tags use_easyjson -bench . $(PKG)/benchmark + golint -set_exit_status .root/src/$(PKG)/tests/*_easyjson.go + +bench-other: generate root + @go test -benchmem -bench . $(PKG)/benchmark + @go test -benchmem -tags use_ffjson -bench . $(PKG)/benchmark + @go test -benchmem -tags use_jsoniter -bench . $(PKG)/benchmark + @go test -benchmem -tags use_codec -bench . $(PKG)/benchmark + +bench-python: + benchmark/ujson.sh + + +.PHONY: root clean generate test build diff --git a/vendor/github.com/mailru/easyjson/README.md b/vendor/github.com/mailru/easyjson/README.md new file mode 100644 index 0000000000..7fd7686541 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/README.md @@ -0,0 +1,333 @@ +# easyjson [![Build Status](https://travis-ci.org/mailru/easyjson.svg?branch=master)](https://travis-ci.org/mailru/easyjson) [![Go Report Card](https://goreportcard.com/badge/github.com/mailru/easyjson)](https://goreportcard.com/report/github.com/mailru/easyjson) + +Package easyjson provides a fast and easy way to marshal/unmarshal Go structs +to/from JSON without the use of reflection. In performance tests, easyjson +outperforms the standard `encoding/json` package by a factor of 4-5x, and other +JSON encoding packages by a factor of 2-3x. + +easyjson aims to keep generated Go code simple enough so that it can be easily +optimized or fixed. Another goal is to provide users with the ability to +customize the generated code by providing options not available with the +standard `encoding/json` package, such as generating "snake_case" names or +enabling `omitempty` behavior by default. + +## Usage +```sh +# install +go get -u github.com/mailru/easyjson/... + +# run +easyjson -all .go +``` + +The above will generate `_easyjson.go` containing the appropriate marshaler and +unmarshaler funcs for all structs contained in `.go`. + +Please note that easyjson requires a full Go build environment and the `GOPATH` +environment variable to be set. This is because easyjson code generation +invokes `go run` on a temporary file (an approach to code generation borrowed +from [ffjson](https://github.com/pquerna/ffjson)). + +## Options +```txt +Usage of easyjson: + -all + generate marshaler/unmarshalers for all structs in a file + -build_tags string + build tags to add to generated file + -leave_temps + do not delete temporary files + -no_std_marshalers + don't generate MarshalJSON/UnmarshalJSON funcs + -noformat + do not run 'gofmt -w' on output file + -omit_empty + omit empty fields by default + -output_filename string + specify the filename of the output + -pkg + process the whole package instead of just the given file + -snake_case + use snake_case names instead of CamelCase by default + -lower_camel_case + use lowerCamelCase instead of CamelCase by default + -stubs + only generate stubs for marshaler/unmarshaler funcs + -disallow_unknown_fields + return error if some unknown field in json appeared +``` + +Using `-all` will generate marshalers/unmarshalers for all Go structs in the +file. If `-all` is not provided, then only those structs whose preceding +comment starts with `easyjson:json` will have marshalers/unmarshalers +generated. For example: + +```go +//easyjson:json +type A struct {} +``` + +Additional option notes: + +* `-snake_case` tells easyjson to generate snake\_case field names by default + (unless overridden by a field tag). The CamelCase to snake\_case conversion + algorithm should work in most cases (ie, HTTPVersion will be converted to + "http_version"). + +* `-build_tags` will add the specified build tags to generated Go sources. + +## Generated Marshaler/Unmarshaler Funcs + +For Go struct types, easyjson generates the funcs `MarshalEasyJSON` / +`UnmarshalEasyJSON` for marshaling/unmarshaling JSON. In turn, these satisify +the `easyjson.Marshaler` and `easyjson.Unmarshaler` interfaces and when used in +conjunction with `easyjson.Marshal` / `easyjson.Unmarshal` avoid unnecessary +reflection / type assertions during marshaling/unmarshaling to/from JSON for Go +structs. + +easyjson also generates `MarshalJSON` and `UnmarshalJSON` funcs for Go struct +types compatible with the standard `json.Marshaler` and `json.Unmarshaler` +interfaces. Please be aware that using the standard `json.Marshal` / +`json.Unmarshal` for marshaling/unmarshaling will incur a significant +performance penalty when compared to using `easyjson.Marshal` / +`easyjson.Unmarshal`. + +Additionally, easyjson exposes utility funcs that use the `MarshalEasyJSON` and +`UnmarshalEasyJSON` for marshaling/unmarshaling to and from standard readers +and writers. For example, easyjson provides `easyjson.MarshalToHTTPResponseWriter` +which marshals to the standard `http.ResponseWriter`. Please see the [GoDoc +listing](https://godoc.org/github.com/mailru/easyjson) for the full listing of +utility funcs that are available. + +## Controlling easyjson Marshaling and Unmarshaling Behavior + +Go types can provide their own `MarshalEasyJSON` and `UnmarshalEasyJSON` funcs +that satisify the `easyjson.Marshaler` / `easyjson.Unmarshaler` interfaces. +These will be used by `easyjson.Marshal` and `easyjson.Unmarshal` when defined +for a Go type. + +Go types can also satisify the `easyjson.Optional` interface, which allows the +type to define its own `omitempty` logic. + +## Type Wrappers + +easyjson provides additional type wrappers defined in the `easyjson/opt` +package. These wrap the standard Go primitives and in turn satisify the +easyjson interfaces. + +The `easyjson/opt` type wrappers are useful when needing to distinguish between +a missing value and/or when needing to specifying a default value. Type +wrappers allow easyjson to avoid additional pointers and heap allocations and +can significantly increase performance when used properly. + +## Memory Pooling + +easyjson uses a buffer pool that allocates data in increasing chunks from 128 +to 32768 bytes. Chunks of 512 bytes and larger will be reused with the help of +`sync.Pool`. The maximum size of a chunk is bounded to reduce redundant memory +allocation and to allow larger reusable buffers. + +easyjson's custom allocation buffer pool is defined in the `easyjson/buffer` +package, and the default behavior pool behavior can be modified (if necessary) +through a call to `buffer.Init()` prior to any marshaling or unmarshaling. +Please see the [GoDoc listing](https://godoc.org/github.com/mailru/easyjson/buffer) +for more information. + +## Issues, Notes, and Limitations + +* easyjson is still early in its development. As such, there are likely to be + bugs and missing features when compared to `encoding/json`. In the case of a + missing feature or bug, please create a GitHub issue. Pull requests are + welcome! + +* Unlike `encoding/json`, object keys are case-sensitive. Case-insensitive + matching is not currently provided due to the significant performance hit + when doing case-insensitive key matching. In the future, case-insensitive + object key matching may be provided via an option to the generator. + +* easyjson makes use of `unsafe`, which simplifies the code and + provides significant performance benefits by allowing no-copy + conversion from `[]byte` to `string`. That said, `unsafe` is used + only when unmarshaling and parsing JSON, and any `unsafe` operations + / memory allocations done will be safely deallocated by + easyjson. Set the build tag `easyjson_nounsafe` to compile it + without `unsafe`. + +* easyjson is compatible with Google App Engine. The `appengine` build + tag (set by App Engine's environment) will automatically disable the + use of `unsafe`, which is not allowed in App Engine's Standard + Environment. Note that the use with App Engine is still experimental. + +* Floats are formatted using the default precision from Go's `strconv` package. + As such, easyjson will not correctly handle high precision floats when + marshaling/unmarshaling JSON. Note, however, that there are very few/limited + uses where this behavior is not sufficient for general use. That said, a + different package may be needed if precise marshaling/unmarshaling of high + precision floats to/from JSON is required. + +* While unmarshaling, the JSON parser does the minimal amount of work needed to + skip over unmatching parens, and as such full validation is not done for the + entire JSON value being unmarshaled/parsed. + +* Currently there is no true streaming support for encoding/decoding as + typically for many uses/protocols the final, marshaled length of the JSON + needs to be known prior to sending the data. Currently this is not possible + with easyjson's architecture. + +## Benchmarks + +Most benchmarks were done using the example +[13kB example JSON](https://dev.twitter.com/rest/reference/get/search/tweets) +(9k after eliminating whitespace). This example is similar to real-world data, +is well-structured, and contains a healthy variety of different types, making +it ideal for JSON serialization benchmarks. + +Note: + +* For small request benchmarks, an 80 byte portion of the above example was + used. + +* For large request marshaling benchmarks, a struct containing 50 regular + samples was used, making a ~500kB output JSON. + +* Benchmarks are showing the results of easyjson's default behaviour, + which makes use of `unsafe`. + +Benchmarks are available in the repository and can be run by invoking `make`. + +### easyjson vs. encoding/json + +easyjson is roughly 5-6 times faster than the standard `encoding/json` for +unmarshaling, and 3-4 times faster for non-concurrent marshaling. Concurrent +marshaling is 6-7x faster if marshaling to a writer. + +### easyjson vs. ffjson + +easyjson uses the same approach for JSON marshaling as +[ffjson](https://github.com/pquerna/ffjson), but takes a significantly +different approach to lexing and parsing JSON during unmarshaling. This means +easyjson is roughly 2-3x faster for unmarshaling and 1.5-2x faster for +non-concurrent unmarshaling. + +As of this writing, `ffjson` seems to have issues when used concurrently: +specifically, large request pooling hurts `ffjson`'s performance and causes +scalability issues. These issues with `ffjson` can likely be fixed, but as of +writing remain outstanding/known issues with `ffjson`. + +easyjson and `ffjson` have similar performance for small requests, however +easyjson outperforms `ffjson` by roughly 2-5x times for large requests when +used with a writer. + +### easyjson vs. go/codec + +[go/codec](https://github.com/ugorji/go) provides +compile-time helpers for JSON generation. In this case, helpers do not work +like marshalers as they are encoding-independent. + +easyjson is generally 2x faster than `go/codec` for non-concurrent benchmarks +and about 3x faster for concurrent encoding (without marshaling to a writer). + +In an attempt to measure marshaling performance of `go/codec` (as opposed to +allocations/memcpy/writer interface invocations), a benchmark was done with +resetting length of a byte slice rather than resetting the whole slice to nil. +However, the optimization in this exact form may not be applicable in practice, +since the memory is not freed between marshaling operations. + +### easyjson vs 'ujson' python module + +[ujson](https://github.com/esnme/ultrajson) is using C code for parsing, so it +is interesting to see how plain golang compares to that. It is imporant to note +that the resulting object for python is slower to access, since the library +parses JSON object into dictionaries. + +easyjson is slightly faster for unmarshaling and 2-3x faster than `ujson` for +marshaling. + +### Benchmark Results + +`ffjson` results are from February 4th, 2016, using the latest `ffjson` and go1.6. +`go/codec` results are from March 4th, 2016, using the latest `go/codec` and go1.6. + +#### Unmarshaling + +| lib | json size | MB/s | allocs/op | B/op | +|:---------|:----------|-----:|----------:|------:| +| standard | regular | 22 | 218 | 10229 | +| standard | small | 9.7 | 14 | 720 | +| | | | | | +| easyjson | regular | 125 | 128 | 9794 | +| easyjson | small | 67 | 3 | 128 | +| | | | | | +| ffjson | regular | 66 | 141 | 9985 | +| ffjson | small | 17.6 | 10 | 488 | +| | | | | | +| codec | regular | 55 | 434 | 19299 | +| codec | small | 29 | 7 | 336 | +| | | | | | +| ujson | regular | 103 | N/A | N/A | + +#### Marshaling, one goroutine. + +| lib | json size | MB/s | allocs/op | B/op | +|:----------|:----------|-----:|----------:|------:| +| standard | regular | 75 | 9 | 23256 | +| standard | small | 32 | 3 | 328 | +| standard | large | 80 | 17 | 1.2M | +| | | | | | +| easyjson | regular | 213 | 9 | 10260 | +| easyjson* | regular | 263 | 8 | 742 | +| easyjson | small | 125 | 1 | 128 | +| easyjson | large | 212 | 33 | 490k | +| easyjson* | large | 262 | 25 | 2879 | +| | | | | | +| ffjson | regular | 122 | 153 | 21340 | +| ffjson** | regular | 146 | 152 | 4897 | +| ffjson | small | 36 | 5 | 384 | +| ffjson** | small | 64 | 4 | 128 | +| ffjson | large | 134 | 7317 | 818k | +| ffjson** | large | 125 | 7320 | 827k | +| | | | | | +| codec | regular | 80 | 17 | 33601 | +| codec*** | regular | 108 | 9 | 1153 | +| codec | small | 42 | 3 | 304 | +| codec*** | small | 56 | 1 | 48 | +| codec | large | 73 | 483 | 2.5M | +| codec*** | large | 103 | 451 | 66007 | +| | | | | | +| ujson | regular | 92 | N/A | N/A | + +\* marshaling to a writer, +\*\* using `ffjson.Pool()`, +\*\*\* reusing output slice instead of resetting it to nil + +#### Marshaling, concurrent. + +| lib | json size | MB/s | allocs/op | B/op | +|:----------|:----------|-----:|----------:|------:| +| standard | regular | 252 | 9 | 23257 | +| standard | small | 124 | 3 | 328 | +| standard | large | 289 | 17 | 1.2M | +| | | | | | +| easyjson | regular | 792 | 9 | 10597 | +| easyjson* | regular | 1748 | 8 | 779 | +| easyjson | small | 333 | 1 | 128 | +| easyjson | large | 718 | 36 | 548k | +| easyjson* | large | 2134 | 25 | 4957 | +| | | | | | +| ffjson | regular | 301 | 153 | 21629 | +| ffjson** | regular | 707 | 152 | 5148 | +| ffjson | small | 62 | 5 | 384 | +| ffjson** | small | 282 | 4 | 128 | +| ffjson | large | 438 | 7330 | 1.0M | +| ffjson** | large | 131 | 7319 | 820k | +| | | | | | +| codec | regular | 183 | 17 | 33603 | +| codec*** | regular | 671 | 9 | 1157 | +| codec | small | 147 | 3 | 304 | +| codec*** | small | 299 | 1 | 48 | +| codec | large | 190 | 483 | 2.5M | +| codec*** | large | 752 | 451 | 77574 | + +\* marshaling to a writer, +\*\* using `ffjson.Pool()`, +\*\*\* reusing output slice instead of resetting it to nil diff --git a/vendor/github.com/mailru/easyjson/benchmark/data.go b/vendor/github.com/mailru/easyjson/benchmark/data.go new file mode 100644 index 0000000000..71eb91a94c --- /dev/null +++ b/vendor/github.com/mailru/easyjson/benchmark/data.go @@ -0,0 +1,148 @@ +// Package benchmark provides a simple benchmark for easyjson against default serialization and ffjson. +// The data example is taken from https://dev.twitter.com/rest/reference/get/search/tweets +package benchmark + +import ( + "io/ioutil" +) + +var largeStructText, _ = ioutil.ReadFile("example.json") +var xlStructData XLStruct + +func init() { + for i := 0; i < 50; i++ { + xlStructData.Data = append(xlStructData.Data, largeStructData) + } +} + +var smallStructText = []byte(`{"hashtags":[{"indices":[5, 10],"text":"some-text"}],"urls":[],"user_mentions":[]}`) +var smallStructData = Entities{ + Hashtags: []Hashtag{{Indices: []int{5, 10}, Text: "some-text"}}, + Urls: []*string{}, + UserMentions: []*string{}, +} + +type SearchMetadata struct { + CompletedIn float64 `json:"completed_in"` + Count int `json:"count"` + MaxID int64 `json:"max_id"` + MaxIDStr string `json:"max_id_str"` + NextResults string `json:"next_results"` + Query string `json:"query"` + RefreshURL string `json:"refresh_url"` + SinceID int64 `json:"since_id"` + SinceIDStr string `json:"since_id_str"` +} + +type Hashtag struct { + Indices []int `json:"indices"` + Text string `json:"text"` +} + +//easyjson:json +type Entities struct { + Hashtags []Hashtag `json:"hashtags"` + Urls []*string `json:"urls"` + UserMentions []*string `json:"user_mentions"` +} + +type UserEntityDescription struct { + Urls []*string `json:"urls"` +} + +type URL struct { + ExpandedURL *string `json:"expanded_url"` + Indices []int `json:"indices"` + URL string `json:"url"` +} + +type UserEntityURL struct { + Urls []URL `json:"urls"` +} + +type UserEntities struct { + Description UserEntityDescription `json:"description"` + URL UserEntityURL `json:"url"` +} + +type User struct { + ContributorsEnabled bool `json:"contributors_enabled"` + CreatedAt string `json:"created_at"` + DefaultProfile bool `json:"default_profile"` + DefaultProfileImage bool `json:"default_profile_image"` + Description string `json:"description"` + Entities UserEntities `json:"entities"` + FavouritesCount int `json:"favourites_count"` + FollowRequestSent *string `json:"follow_request_sent"` + FollowersCount int `json:"followers_count"` + Following *string `json:"following"` + FriendsCount int `json:"friends_count"` + GeoEnabled bool `json:"geo_enabled"` + ID int `json:"id"` + IDStr string `json:"id_str"` + IsTranslator bool `json:"is_translator"` + Lang string `json:"lang"` + ListedCount int `json:"listed_count"` + Location string `json:"location"` + Name string `json:"name"` + Notifications *string `json:"notifications"` + ProfileBackgroundColor string `json:"profile_background_color"` + ProfileBackgroundImageURL string `json:"profile_background_image_url"` + ProfileBackgroundImageURLHTTPS string `json:"profile_background_image_url_https"` + ProfileBackgroundTile bool `json:"profile_background_tile"` + ProfileImageURL string `json:"profile_image_url"` + ProfileImageURLHTTPS string `json:"profile_image_url_https"` + ProfileLinkColor string `json:"profile_link_color"` + ProfileSidebarBorderColor string `json:"profile_sidebar_border_color"` + ProfileSidebarFillColor string `json:"profile_sidebar_fill_color"` + ProfileTextColor string `json:"profile_text_color"` + ProfileUseBackgroundImage bool `json:"profile_use_background_image"` + Protected bool `json:"protected"` + ScreenName string `json:"screen_name"` + ShowAllInlineMedia bool `json:"show_all_inline_media"` + StatusesCount int `json:"statuses_count"` + TimeZone string `json:"time_zone"` + URL *string `json:"url"` + UtcOffset int `json:"utc_offset"` + Verified bool `json:"verified"` +} + +type StatusMetadata struct { + IsoLanguageCode string `json:"iso_language_code"` + ResultType string `json:"result_type"` +} + +type Status struct { + Contributors *string `json:"contributors"` + Coordinates *string `json:"coordinates"` + CreatedAt string `json:"created_at"` + Entities Entities `json:"entities"` + Favorited bool `json:"favorited"` + Geo *string `json:"geo"` + ID int64 `json:"id"` + IDStr string `json:"id_str"` + InReplyToScreenName *string `json:"in_reply_to_screen_name"` + InReplyToStatusID *string `json:"in_reply_to_status_id"` + InReplyToStatusIDStr *string `json:"in_reply_to_status_id_str"` + InReplyToUserID *string `json:"in_reply_to_user_id"` + InReplyToUserIDStr *string `json:"in_reply_to_user_id_str"` + Metadata StatusMetadata `json:"metadata"` + Place *string `json:"place"` + RetweetCount int `json:"retweet_count"` + Retweeted bool `json:"retweeted"` + Source string `json:"source"` + Text string `json:"text"` + Truncated bool `json:"truncated"` + User User `json:"user"` +} + +//easyjson:json +type LargeStruct struct { + SearchMetadata SearchMetadata `json:"search_metadata"` + Statuses []Status `json:"statuses"` +} + +//easyjson:json +type XLStruct struct { + Data []LargeStruct +} diff --git a/vendor/github.com/mailru/easyjson/benchmark/data_codec.go b/vendor/github.com/mailru/easyjson/benchmark/data_codec.go new file mode 100644 index 0000000000..d2d83fac63 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/benchmark/data_codec.go @@ -0,0 +1,6914 @@ +//+build use_codec +//+build !easyjson_nounsafe +//+build !appengine + +// ************************************************************ +// DO NOT EDIT. +// THIS FILE IS AUTO-GENERATED BY codecgen. +// ************************************************************ + +package benchmark + +import ( + "errors" + "fmt" + "reflect" + "runtime" + "unsafe" + + codec1978 "github.com/ugorji/go/codec" +) + +const ( + // ----- content types ---- + codecSelferC_UTF89225 = 1 + codecSelferC_RAW9225 = 0 + // ----- value types used ---- + codecSelferValueTypeArray9225 = 10 + codecSelferValueTypeMap9225 = 9 + // ----- containerStateValues ---- + codecSelfer_containerMapKey9225 = 2 + codecSelfer_containerMapValue9225 = 3 + codecSelfer_containerMapEnd9225 = 4 + codecSelfer_containerArrayElem9225 = 6 + codecSelfer_containerArrayEnd9225 = 7 +) + +var ( + codecSelferBitsize9225 = uint8(reflect.TypeOf(uint(0)).Bits()) + codecSelferOnlyMapOrArrayEncodeToStructErr9225 = errors.New(`only encoded map or array can be decoded into a struct`) +) + +type codecSelferUnsafeString9225 struct { + Data uintptr + Len int +} + +type codecSelfer9225 struct{} + +func init() { + if codec1978.GenVersion != 5 { + _, file, _, _ := runtime.Caller(0) + err := fmt.Errorf("codecgen version mismatch: current: %v, need %v. Re-generate file: %v", + 5, codec1978.GenVersion, file) + panic(err) + } + if false { // reference the types, but skip this branch at build/run time + var v0 unsafe.Pointer + _ = v0 + } +} + +func (x *SearchMetadata) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [9]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(9) + } else { + yynn2 = 9 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeFloat64(float64(x.CompletedIn)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("completed_in")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeFloat64(float64(x.CompletedIn)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeInt(int64(x.Count)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("count")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeInt(int64(x.Count)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym10 := z.EncBinary() + _ = yym10 + if false { + } else { + r.EncodeInt(int64(x.MaxID)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("max_id")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym11 := z.EncBinary() + _ = yym11 + if false { + } else { + r.EncodeInt(int64(x.MaxID)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym13 := z.EncBinary() + _ = yym13 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.MaxIDStr)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("max_id_str")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym14 := z.EncBinary() + _ = yym14 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.MaxIDStr)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym16 := z.EncBinary() + _ = yym16 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.NextResults)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("next_results")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym17 := z.EncBinary() + _ = yym17 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.NextResults)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym19 := z.EncBinary() + _ = yym19 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.Query)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("query")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym20 := z.EncBinary() + _ = yym20 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.Query)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym22 := z.EncBinary() + _ = yym22 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.RefreshURL)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("refresh_url")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym23 := z.EncBinary() + _ = yym23 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.RefreshURL)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym25 := z.EncBinary() + _ = yym25 + if false { + } else { + r.EncodeInt(int64(x.SinceID)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("since_id")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym26 := z.EncBinary() + _ = yym26 + if false { + } else { + r.EncodeInt(int64(x.SinceID)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym28 := z.EncBinary() + _ = yym28 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.SinceIDStr)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("since_id_str")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym29 := z.EncBinary() + _ = yym29 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.SinceIDStr)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd9225) + } + } + } +} + +func (x *SearchMetadata) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap9225 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd9225) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray9225 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) + } + } +} + +func (x *SearchMetadata) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey9225) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} + yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) + z.DecSendContainerState(codecSelfer_containerMapValue9225) + switch yys3 { + case "completed_in": + if r.TryDecodeAsNil() { + x.CompletedIn = 0 + } else { + yyv4 := &x.CompletedIn + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*float64)(yyv4)) = float64(r.DecodeFloat(false)) + } + } + case "count": + if r.TryDecodeAsNil() { + x.Count = 0 + } else { + yyv6 := &x.Count + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*int)(yyv6)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + case "max_id": + if r.TryDecodeAsNil() { + x.MaxID = 0 + } else { + yyv8 := &x.MaxID + yym9 := z.DecBinary() + _ = yym9 + if false { + } else { + *((*int)(yyv8)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + case "max_id_str": + if r.TryDecodeAsNil() { + x.MaxIDStr = "" + } else { + yyv10 := &x.MaxIDStr + yym11 := z.DecBinary() + _ = yym11 + if false { + } else { + *((*string)(yyv10)) = r.DecodeString() + } + } + case "next_results": + if r.TryDecodeAsNil() { + x.NextResults = "" + } else { + yyv12 := &x.NextResults + yym13 := z.DecBinary() + _ = yym13 + if false { + } else { + *((*string)(yyv12)) = r.DecodeString() + } + } + case "query": + if r.TryDecodeAsNil() { + x.Query = "" + } else { + yyv14 := &x.Query + yym15 := z.DecBinary() + _ = yym15 + if false { + } else { + *((*string)(yyv14)) = r.DecodeString() + } + } + case "refresh_url": + if r.TryDecodeAsNil() { + x.RefreshURL = "" + } else { + yyv16 := &x.RefreshURL + yym17 := z.DecBinary() + _ = yym17 + if false { + } else { + *((*string)(yyv16)) = r.DecodeString() + } + } + case "since_id": + if r.TryDecodeAsNil() { + x.SinceID = 0 + } else { + yyv18 := &x.SinceID + yym19 := z.DecBinary() + _ = yym19 + if false { + } else { + *((*int)(yyv18)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + case "since_id_str": + if r.TryDecodeAsNil() { + x.SinceIDStr = "" + } else { + yyv20 := &x.SinceIDStr + yym21 := z.DecBinary() + _ = yym21 + if false { + } else { + *((*string)(yyv20)) = r.DecodeString() + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd9225) +} + +func (x *SearchMetadata) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj22 int + var yyb22 bool + var yyhl22 bool = l >= 0 + yyj22++ + if yyhl22 { + yyb22 = yyj22 > l + } else { + yyb22 = r.CheckBreak() + } + if yyb22 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.CompletedIn = 0 + } else { + yyv23 := &x.CompletedIn + yym24 := z.DecBinary() + _ = yym24 + if false { + } else { + *((*float64)(yyv23)) = float64(r.DecodeFloat(false)) + } + } + yyj22++ + if yyhl22 { + yyb22 = yyj22 > l + } else { + yyb22 = r.CheckBreak() + } + if yyb22 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Count = 0 + } else { + yyv25 := &x.Count + yym26 := z.DecBinary() + _ = yym26 + if false { + } else { + *((*int)(yyv25)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + yyj22++ + if yyhl22 { + yyb22 = yyj22 > l + } else { + yyb22 = r.CheckBreak() + } + if yyb22 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.MaxID = 0 + } else { + yyv27 := &x.MaxID + yym28 := z.DecBinary() + _ = yym28 + if false { + } else { + *((*int)(yyv27)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + yyj22++ + if yyhl22 { + yyb22 = yyj22 > l + } else { + yyb22 = r.CheckBreak() + } + if yyb22 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.MaxIDStr = "" + } else { + yyv29 := &x.MaxIDStr + yym30 := z.DecBinary() + _ = yym30 + if false { + } else { + *((*string)(yyv29)) = r.DecodeString() + } + } + yyj22++ + if yyhl22 { + yyb22 = yyj22 > l + } else { + yyb22 = r.CheckBreak() + } + if yyb22 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.NextResults = "" + } else { + yyv31 := &x.NextResults + yym32 := z.DecBinary() + _ = yym32 + if false { + } else { + *((*string)(yyv31)) = r.DecodeString() + } + } + yyj22++ + if yyhl22 { + yyb22 = yyj22 > l + } else { + yyb22 = r.CheckBreak() + } + if yyb22 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Query = "" + } else { + yyv33 := &x.Query + yym34 := z.DecBinary() + _ = yym34 + if false { + } else { + *((*string)(yyv33)) = r.DecodeString() + } + } + yyj22++ + if yyhl22 { + yyb22 = yyj22 > l + } else { + yyb22 = r.CheckBreak() + } + if yyb22 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.RefreshURL = "" + } else { + yyv35 := &x.RefreshURL + yym36 := z.DecBinary() + _ = yym36 + if false { + } else { + *((*string)(yyv35)) = r.DecodeString() + } + } + yyj22++ + if yyhl22 { + yyb22 = yyj22 > l + } else { + yyb22 = r.CheckBreak() + } + if yyb22 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.SinceID = 0 + } else { + yyv37 := &x.SinceID + yym38 := z.DecBinary() + _ = yym38 + if false { + } else { + *((*int)(yyv37)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + yyj22++ + if yyhl22 { + yyb22 = yyj22 > l + } else { + yyb22 = r.CheckBreak() + } + if yyb22 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.SinceIDStr = "" + } else { + yyv39 := &x.SinceIDStr + yym40 := z.DecBinary() + _ = yym40 + if false { + } else { + *((*string)(yyv39)) = r.DecodeString() + } + } + for { + yyj22++ + if yyhl22 { + yyb22 = yyj22 > l + } else { + yyb22 = r.CheckBreak() + } + if yyb22 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + z.DecStructFieldNotFound(yyj22-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) +} + +func (x *Hashtag) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [2]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(2) + } else { + yynn2 = 2 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.Indices == nil { + r.EncodeNil() + } else { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + z.F.EncSliceIntV(x.Indices, false, e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("indices")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.Indices == nil { + r.EncodeNil() + } else { + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + z.F.EncSliceIntV(x.Indices, false, e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.Text)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("text")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.Text)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd9225) + } + } + } +} + +func (x *Hashtag) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap9225 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd9225) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray9225 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) + } + } +} + +func (x *Hashtag) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey9225) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} + yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) + z.DecSendContainerState(codecSelfer_containerMapValue9225) + switch yys3 { + case "indices": + if r.TryDecodeAsNil() { + x.Indices = nil + } else { + yyv4 := &x.Indices + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + z.F.DecSliceIntX(yyv4, false, d) + } + } + case "text": + if r.TryDecodeAsNil() { + x.Text = "" + } else { + yyv6 := &x.Text + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd9225) +} + +func (x *Hashtag) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj8 int + var yyb8 bool + var yyhl8 bool = l >= 0 + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Indices = nil + } else { + yyv9 := &x.Indices + yym10 := z.DecBinary() + _ = yym10 + if false { + } else { + z.F.DecSliceIntX(yyv9, false, d) + } + } + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Text = "" + } else { + yyv11 := &x.Text + yym12 := z.DecBinary() + _ = yym12 + if false { + } else { + *((*string)(yyv11)) = r.DecodeString() + } + } + for { + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + z.DecStructFieldNotFound(yyj8-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) +} + +func (x *Entities) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [3]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(3) + } else { + yynn2 = 3 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.Hashtags == nil { + r.EncodeNil() + } else { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + h.encSliceHashtag(([]Hashtag)(x.Hashtags), e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("hashtags")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.Hashtags == nil { + r.EncodeNil() + } else { + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + h.encSliceHashtag(([]Hashtag)(x.Hashtags), e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.Urls == nil { + r.EncodeNil() + } else { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + h.encSlicePtrtostring(([]*string)(x.Urls), e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("urls")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.Urls == nil { + r.EncodeNil() + } else { + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + h.encSlicePtrtostring(([]*string)(x.Urls), e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.UserMentions == nil { + r.EncodeNil() + } else { + yym10 := z.EncBinary() + _ = yym10 + if false { + } else { + h.encSlicePtrtostring(([]*string)(x.UserMentions), e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("user_mentions")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.UserMentions == nil { + r.EncodeNil() + } else { + yym11 := z.EncBinary() + _ = yym11 + if false { + } else { + h.encSlicePtrtostring(([]*string)(x.UserMentions), e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd9225) + } + } + } +} + +func (x *Entities) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap9225 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd9225) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray9225 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) + } + } +} + +func (x *Entities) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey9225) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} + yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) + z.DecSendContainerState(codecSelfer_containerMapValue9225) + switch yys3 { + case "hashtags": + if r.TryDecodeAsNil() { + x.Hashtags = nil + } else { + yyv4 := &x.Hashtags + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + h.decSliceHashtag((*[]Hashtag)(yyv4), d) + } + } + case "urls": + if r.TryDecodeAsNil() { + x.Urls = nil + } else { + yyv6 := &x.Urls + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + h.decSlicePtrtostring((*[]*string)(yyv6), d) + } + } + case "user_mentions": + if r.TryDecodeAsNil() { + x.UserMentions = nil + } else { + yyv8 := &x.UserMentions + yym9 := z.DecBinary() + _ = yym9 + if false { + } else { + h.decSlicePtrtostring((*[]*string)(yyv8), d) + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd9225) +} + +func (x *Entities) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj10 int + var yyb10 bool + var yyhl10 bool = l >= 0 + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Hashtags = nil + } else { + yyv11 := &x.Hashtags + yym12 := z.DecBinary() + _ = yym12 + if false { + } else { + h.decSliceHashtag((*[]Hashtag)(yyv11), d) + } + } + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Urls = nil + } else { + yyv13 := &x.Urls + yym14 := z.DecBinary() + _ = yym14 + if false { + } else { + h.decSlicePtrtostring((*[]*string)(yyv13), d) + } + } + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.UserMentions = nil + } else { + yyv15 := &x.UserMentions + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + h.decSlicePtrtostring((*[]*string)(yyv15), d) + } + } + for { + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + z.DecStructFieldNotFound(yyj10-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) +} + +func (x *UserEntityDescription) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [1]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(1) + } else { + yynn2 = 1 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.Urls == nil { + r.EncodeNil() + } else { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + h.encSlicePtrtostring(([]*string)(x.Urls), e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("urls")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.Urls == nil { + r.EncodeNil() + } else { + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + h.encSlicePtrtostring(([]*string)(x.Urls), e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd9225) + } + } + } +} + +func (x *UserEntityDescription) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap9225 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd9225) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray9225 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) + } + } +} + +func (x *UserEntityDescription) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey9225) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} + yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) + z.DecSendContainerState(codecSelfer_containerMapValue9225) + switch yys3 { + case "urls": + if r.TryDecodeAsNil() { + x.Urls = nil + } else { + yyv4 := &x.Urls + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + h.decSlicePtrtostring((*[]*string)(yyv4), d) + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd9225) +} + +func (x *UserEntityDescription) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj6 int + var yyb6 bool + var yyhl6 bool = l >= 0 + yyj6++ + if yyhl6 { + yyb6 = yyj6 > l + } else { + yyb6 = r.CheckBreak() + } + if yyb6 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Urls = nil + } else { + yyv7 := &x.Urls + yym8 := z.DecBinary() + _ = yym8 + if false { + } else { + h.decSlicePtrtostring((*[]*string)(yyv7), d) + } + } + for { + yyj6++ + if yyhl6 { + yyb6 = yyj6 > l + } else { + yyb6 = r.CheckBreak() + } + if yyb6 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + z.DecStructFieldNotFound(yyj6-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) +} + +func (x *URL) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [3]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(3) + } else { + yynn2 = 3 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.ExpandedURL == nil { + r.EncodeNil() + } else { + yy4 := *x.ExpandedURL + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy4)) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("expanded_url")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.ExpandedURL == nil { + r.EncodeNil() + } else { + yy6 := *x.ExpandedURL + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy6)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.Indices == nil { + r.EncodeNil() + } else { + yym9 := z.EncBinary() + _ = yym9 + if false { + } else { + z.F.EncSliceIntV(x.Indices, false, e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("indices")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.Indices == nil { + r.EncodeNil() + } else { + yym10 := z.EncBinary() + _ = yym10 + if false { + } else { + z.F.EncSliceIntV(x.Indices, false, e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym12 := z.EncBinary() + _ = yym12 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.URL)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("url")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym13 := z.EncBinary() + _ = yym13 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.URL)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd9225) + } + } + } +} + +func (x *URL) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap9225 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd9225) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray9225 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) + } + } +} + +func (x *URL) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey9225) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} + yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) + z.DecSendContainerState(codecSelfer_containerMapValue9225) + switch yys3 { + case "expanded_url": + if r.TryDecodeAsNil() { + if x.ExpandedURL != nil { + x.ExpandedURL = nil + } + } else { + if x.ExpandedURL == nil { + x.ExpandedURL = new(string) + } + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(x.ExpandedURL)) = r.DecodeString() + } + } + case "indices": + if r.TryDecodeAsNil() { + x.Indices = nil + } else { + yyv6 := &x.Indices + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + z.F.DecSliceIntX(yyv6, false, d) + } + } + case "url": + if r.TryDecodeAsNil() { + x.URL = "" + } else { + yyv8 := &x.URL + yym9 := z.DecBinary() + _ = yym9 + if false { + } else { + *((*string)(yyv8)) = r.DecodeString() + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd9225) +} + +func (x *URL) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj10 int + var yyb10 bool + var yyhl10 bool = l >= 0 + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + if x.ExpandedURL != nil { + x.ExpandedURL = nil + } + } else { + if x.ExpandedURL == nil { + x.ExpandedURL = new(string) + } + yym12 := z.DecBinary() + _ = yym12 + if false { + } else { + *((*string)(x.ExpandedURL)) = r.DecodeString() + } + } + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Indices = nil + } else { + yyv13 := &x.Indices + yym14 := z.DecBinary() + _ = yym14 + if false { + } else { + z.F.DecSliceIntX(yyv13, false, d) + } + } + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.URL = "" + } else { + yyv15 := &x.URL + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + *((*string)(yyv15)) = r.DecodeString() + } + } + for { + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + z.DecStructFieldNotFound(yyj10-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) +} + +func (x *UserEntityURL) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [1]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(1) + } else { + yynn2 = 1 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.Urls == nil { + r.EncodeNil() + } else { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + h.encSliceURL(([]URL)(x.Urls), e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("urls")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.Urls == nil { + r.EncodeNil() + } else { + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + h.encSliceURL(([]URL)(x.Urls), e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd9225) + } + } + } +} + +func (x *UserEntityURL) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap9225 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd9225) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray9225 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) + } + } +} + +func (x *UserEntityURL) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey9225) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} + yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) + z.DecSendContainerState(codecSelfer_containerMapValue9225) + switch yys3 { + case "urls": + if r.TryDecodeAsNil() { + x.Urls = nil + } else { + yyv4 := &x.Urls + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + h.decSliceURL((*[]URL)(yyv4), d) + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd9225) +} + +func (x *UserEntityURL) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj6 int + var yyb6 bool + var yyhl6 bool = l >= 0 + yyj6++ + if yyhl6 { + yyb6 = yyj6 > l + } else { + yyb6 = r.CheckBreak() + } + if yyb6 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Urls = nil + } else { + yyv7 := &x.Urls + yym8 := z.DecBinary() + _ = yym8 + if false { + } else { + h.decSliceURL((*[]URL)(yyv7), d) + } + } + for { + yyj6++ + if yyhl6 { + yyb6 = yyj6 > l + } else { + yyb6 = r.CheckBreak() + } + if yyb6 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + z.DecStructFieldNotFound(yyj6-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) +} + +func (x *UserEntities) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [2]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(2) + } else { + yynn2 = 2 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yy4 := &x.Description + yy4.CodecEncodeSelf(e) + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("description")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yy6 := &x.Description + yy6.CodecEncodeSelf(e) + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yy9 := &x.URL + yy9.CodecEncodeSelf(e) + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("url")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yy11 := &x.URL + yy11.CodecEncodeSelf(e) + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd9225) + } + } + } +} + +func (x *UserEntities) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap9225 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd9225) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray9225 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) + } + } +} + +func (x *UserEntities) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey9225) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} + yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) + z.DecSendContainerState(codecSelfer_containerMapValue9225) + switch yys3 { + case "description": + if r.TryDecodeAsNil() { + x.Description = UserEntityDescription{} + } else { + yyv4 := &x.Description + yyv4.CodecDecodeSelf(d) + } + case "url": + if r.TryDecodeAsNil() { + x.URL = UserEntityURL{} + } else { + yyv5 := &x.URL + yyv5.CodecDecodeSelf(d) + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd9225) +} + +func (x *UserEntities) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj6 int + var yyb6 bool + var yyhl6 bool = l >= 0 + yyj6++ + if yyhl6 { + yyb6 = yyj6 > l + } else { + yyb6 = r.CheckBreak() + } + if yyb6 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Description = UserEntityDescription{} + } else { + yyv7 := &x.Description + yyv7.CodecDecodeSelf(d) + } + yyj6++ + if yyhl6 { + yyb6 = yyj6 > l + } else { + yyb6 = r.CheckBreak() + } + if yyb6 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.URL = UserEntityURL{} + } else { + yyv8 := &x.URL + yyv8.CodecDecodeSelf(d) + } + for { + yyj6++ + if yyhl6 { + yyb6 = yyj6 > l + } else { + yyb6 = r.CheckBreak() + } + if yyb6 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + z.DecStructFieldNotFound(yyj6-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) +} + +func (x *User) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [39]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(39) + } else { + yynn2 = 39 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeBool(bool(x.ContributorsEnabled)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("contributors_enabled")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeBool(bool(x.ContributorsEnabled)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.CreatedAt)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("created_at")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.CreatedAt)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym10 := z.EncBinary() + _ = yym10 + if false { + } else { + r.EncodeBool(bool(x.DefaultProfile)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("default_profile")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym11 := z.EncBinary() + _ = yym11 + if false { + } else { + r.EncodeBool(bool(x.DefaultProfile)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym13 := z.EncBinary() + _ = yym13 + if false { + } else { + r.EncodeBool(bool(x.DefaultProfileImage)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("default_profile_image")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym14 := z.EncBinary() + _ = yym14 + if false { + } else { + r.EncodeBool(bool(x.DefaultProfileImage)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym16 := z.EncBinary() + _ = yym16 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.Description)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("description")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym17 := z.EncBinary() + _ = yym17 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.Description)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yy19 := &x.Entities + yy19.CodecEncodeSelf(e) + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("entities")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yy21 := &x.Entities + yy21.CodecEncodeSelf(e) + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym24 := z.EncBinary() + _ = yym24 + if false { + } else { + r.EncodeInt(int64(x.FavouritesCount)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("favourites_count")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym25 := z.EncBinary() + _ = yym25 + if false { + } else { + r.EncodeInt(int64(x.FavouritesCount)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.FollowRequestSent == nil { + r.EncodeNil() + } else { + yy27 := *x.FollowRequestSent + yym28 := z.EncBinary() + _ = yym28 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy27)) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("follow_request_sent")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.FollowRequestSent == nil { + r.EncodeNil() + } else { + yy29 := *x.FollowRequestSent + yym30 := z.EncBinary() + _ = yym30 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy29)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym32 := z.EncBinary() + _ = yym32 + if false { + } else { + r.EncodeInt(int64(x.FollowersCount)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("followers_count")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym33 := z.EncBinary() + _ = yym33 + if false { + } else { + r.EncodeInt(int64(x.FollowersCount)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.Following == nil { + r.EncodeNil() + } else { + yy35 := *x.Following + yym36 := z.EncBinary() + _ = yym36 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy35)) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("following")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.Following == nil { + r.EncodeNil() + } else { + yy37 := *x.Following + yym38 := z.EncBinary() + _ = yym38 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy37)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym40 := z.EncBinary() + _ = yym40 + if false { + } else { + r.EncodeInt(int64(x.FriendsCount)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("friends_count")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym41 := z.EncBinary() + _ = yym41 + if false { + } else { + r.EncodeInt(int64(x.FriendsCount)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym43 := z.EncBinary() + _ = yym43 + if false { + } else { + r.EncodeBool(bool(x.GeoEnabled)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("geo_enabled")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym44 := z.EncBinary() + _ = yym44 + if false { + } else { + r.EncodeBool(bool(x.GeoEnabled)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym46 := z.EncBinary() + _ = yym46 + if false { + } else { + r.EncodeInt(int64(x.ID)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("id")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym47 := z.EncBinary() + _ = yym47 + if false { + } else { + r.EncodeInt(int64(x.ID)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym49 := z.EncBinary() + _ = yym49 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.IDStr)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("id_str")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym50 := z.EncBinary() + _ = yym50 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.IDStr)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym52 := z.EncBinary() + _ = yym52 + if false { + } else { + r.EncodeBool(bool(x.IsTranslator)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("is_translator")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym53 := z.EncBinary() + _ = yym53 + if false { + } else { + r.EncodeBool(bool(x.IsTranslator)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym55 := z.EncBinary() + _ = yym55 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.Lang)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("lang")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym56 := z.EncBinary() + _ = yym56 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.Lang)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym58 := z.EncBinary() + _ = yym58 + if false { + } else { + r.EncodeInt(int64(x.ListedCount)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("listed_count")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym59 := z.EncBinary() + _ = yym59 + if false { + } else { + r.EncodeInt(int64(x.ListedCount)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym61 := z.EncBinary() + _ = yym61 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.Location)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("location")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym62 := z.EncBinary() + _ = yym62 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.Location)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym64 := z.EncBinary() + _ = yym64 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.Name)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("name")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym65 := z.EncBinary() + _ = yym65 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.Name)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.Notifications == nil { + r.EncodeNil() + } else { + yy67 := *x.Notifications + yym68 := z.EncBinary() + _ = yym68 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy67)) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("notifications")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.Notifications == nil { + r.EncodeNil() + } else { + yy69 := *x.Notifications + yym70 := z.EncBinary() + _ = yym70 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy69)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym72 := z.EncBinary() + _ = yym72 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileBackgroundColor)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("profile_background_color")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym73 := z.EncBinary() + _ = yym73 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileBackgroundColor)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym75 := z.EncBinary() + _ = yym75 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileBackgroundImageURL)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("profile_background_image_url")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym76 := z.EncBinary() + _ = yym76 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileBackgroundImageURL)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym78 := z.EncBinary() + _ = yym78 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileBackgroundImageURLHTTPS)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("profile_background_image_url_https")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym79 := z.EncBinary() + _ = yym79 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileBackgroundImageURLHTTPS)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym81 := z.EncBinary() + _ = yym81 + if false { + } else { + r.EncodeBool(bool(x.ProfileBackgroundTile)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("profile_background_tile")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym82 := z.EncBinary() + _ = yym82 + if false { + } else { + r.EncodeBool(bool(x.ProfileBackgroundTile)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym84 := z.EncBinary() + _ = yym84 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileImageURL)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("profile_image_url")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym85 := z.EncBinary() + _ = yym85 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileImageURL)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym87 := z.EncBinary() + _ = yym87 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileImageURLHTTPS)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("profile_image_url_https")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym88 := z.EncBinary() + _ = yym88 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileImageURLHTTPS)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym90 := z.EncBinary() + _ = yym90 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileLinkColor)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("profile_link_color")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym91 := z.EncBinary() + _ = yym91 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileLinkColor)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym93 := z.EncBinary() + _ = yym93 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileSidebarBorderColor)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("profile_sidebar_border_color")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym94 := z.EncBinary() + _ = yym94 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileSidebarBorderColor)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym96 := z.EncBinary() + _ = yym96 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileSidebarFillColor)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("profile_sidebar_fill_color")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym97 := z.EncBinary() + _ = yym97 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileSidebarFillColor)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym99 := z.EncBinary() + _ = yym99 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileTextColor)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("profile_text_color")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym100 := z.EncBinary() + _ = yym100 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ProfileTextColor)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym102 := z.EncBinary() + _ = yym102 + if false { + } else { + r.EncodeBool(bool(x.ProfileUseBackgroundImage)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("profile_use_background_image")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym103 := z.EncBinary() + _ = yym103 + if false { + } else { + r.EncodeBool(bool(x.ProfileUseBackgroundImage)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym105 := z.EncBinary() + _ = yym105 + if false { + } else { + r.EncodeBool(bool(x.Protected)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("protected")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym106 := z.EncBinary() + _ = yym106 + if false { + } else { + r.EncodeBool(bool(x.Protected)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym108 := z.EncBinary() + _ = yym108 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ScreenName)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("screen_name")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym109 := z.EncBinary() + _ = yym109 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ScreenName)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym111 := z.EncBinary() + _ = yym111 + if false { + } else { + r.EncodeBool(bool(x.ShowAllInlineMedia)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("show_all_inline_media")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym112 := z.EncBinary() + _ = yym112 + if false { + } else { + r.EncodeBool(bool(x.ShowAllInlineMedia)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym114 := z.EncBinary() + _ = yym114 + if false { + } else { + r.EncodeInt(int64(x.StatusesCount)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("statuses_count")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym115 := z.EncBinary() + _ = yym115 + if false { + } else { + r.EncodeInt(int64(x.StatusesCount)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym117 := z.EncBinary() + _ = yym117 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.TimeZone)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("time_zone")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym118 := z.EncBinary() + _ = yym118 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.TimeZone)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.URL == nil { + r.EncodeNil() + } else { + yy120 := *x.URL + yym121 := z.EncBinary() + _ = yym121 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy120)) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("url")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.URL == nil { + r.EncodeNil() + } else { + yy122 := *x.URL + yym123 := z.EncBinary() + _ = yym123 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy122)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym125 := z.EncBinary() + _ = yym125 + if false { + } else { + r.EncodeInt(int64(x.UtcOffset)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("utc_offset")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym126 := z.EncBinary() + _ = yym126 + if false { + } else { + r.EncodeInt(int64(x.UtcOffset)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym128 := z.EncBinary() + _ = yym128 + if false { + } else { + r.EncodeBool(bool(x.Verified)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("verified")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym129 := z.EncBinary() + _ = yym129 + if false { + } else { + r.EncodeBool(bool(x.Verified)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd9225) + } + } + } +} + +func (x *User) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap9225 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd9225) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray9225 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) + } + } +} + +func (x *User) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey9225) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} + yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) + z.DecSendContainerState(codecSelfer_containerMapValue9225) + switch yys3 { + case "contributors_enabled": + if r.TryDecodeAsNil() { + x.ContributorsEnabled = false + } else { + yyv4 := &x.ContributorsEnabled + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*bool)(yyv4)) = r.DecodeBool() + } + } + case "created_at": + if r.TryDecodeAsNil() { + x.CreatedAt = "" + } else { + yyv6 := &x.CreatedAt + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + case "default_profile": + if r.TryDecodeAsNil() { + x.DefaultProfile = false + } else { + yyv8 := &x.DefaultProfile + yym9 := z.DecBinary() + _ = yym9 + if false { + } else { + *((*bool)(yyv8)) = r.DecodeBool() + } + } + case "default_profile_image": + if r.TryDecodeAsNil() { + x.DefaultProfileImage = false + } else { + yyv10 := &x.DefaultProfileImage + yym11 := z.DecBinary() + _ = yym11 + if false { + } else { + *((*bool)(yyv10)) = r.DecodeBool() + } + } + case "description": + if r.TryDecodeAsNil() { + x.Description = "" + } else { + yyv12 := &x.Description + yym13 := z.DecBinary() + _ = yym13 + if false { + } else { + *((*string)(yyv12)) = r.DecodeString() + } + } + case "entities": + if r.TryDecodeAsNil() { + x.Entities = UserEntities{} + } else { + yyv14 := &x.Entities + yyv14.CodecDecodeSelf(d) + } + case "favourites_count": + if r.TryDecodeAsNil() { + x.FavouritesCount = 0 + } else { + yyv15 := &x.FavouritesCount + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + *((*int)(yyv15)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + case "follow_request_sent": + if r.TryDecodeAsNil() { + if x.FollowRequestSent != nil { + x.FollowRequestSent = nil + } + } else { + if x.FollowRequestSent == nil { + x.FollowRequestSent = new(string) + } + yym18 := z.DecBinary() + _ = yym18 + if false { + } else { + *((*string)(x.FollowRequestSent)) = r.DecodeString() + } + } + case "followers_count": + if r.TryDecodeAsNil() { + x.FollowersCount = 0 + } else { + yyv19 := &x.FollowersCount + yym20 := z.DecBinary() + _ = yym20 + if false { + } else { + *((*int)(yyv19)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + case "following": + if r.TryDecodeAsNil() { + if x.Following != nil { + x.Following = nil + } + } else { + if x.Following == nil { + x.Following = new(string) + } + yym22 := z.DecBinary() + _ = yym22 + if false { + } else { + *((*string)(x.Following)) = r.DecodeString() + } + } + case "friends_count": + if r.TryDecodeAsNil() { + x.FriendsCount = 0 + } else { + yyv23 := &x.FriendsCount + yym24 := z.DecBinary() + _ = yym24 + if false { + } else { + *((*int)(yyv23)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + case "geo_enabled": + if r.TryDecodeAsNil() { + x.GeoEnabled = false + } else { + yyv25 := &x.GeoEnabled + yym26 := z.DecBinary() + _ = yym26 + if false { + } else { + *((*bool)(yyv25)) = r.DecodeBool() + } + } + case "id": + if r.TryDecodeAsNil() { + x.ID = 0 + } else { + yyv27 := &x.ID + yym28 := z.DecBinary() + _ = yym28 + if false { + } else { + *((*int)(yyv27)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + case "id_str": + if r.TryDecodeAsNil() { + x.IDStr = "" + } else { + yyv29 := &x.IDStr + yym30 := z.DecBinary() + _ = yym30 + if false { + } else { + *((*string)(yyv29)) = r.DecodeString() + } + } + case "is_translator": + if r.TryDecodeAsNil() { + x.IsTranslator = false + } else { + yyv31 := &x.IsTranslator + yym32 := z.DecBinary() + _ = yym32 + if false { + } else { + *((*bool)(yyv31)) = r.DecodeBool() + } + } + case "lang": + if r.TryDecodeAsNil() { + x.Lang = "" + } else { + yyv33 := &x.Lang + yym34 := z.DecBinary() + _ = yym34 + if false { + } else { + *((*string)(yyv33)) = r.DecodeString() + } + } + case "listed_count": + if r.TryDecodeAsNil() { + x.ListedCount = 0 + } else { + yyv35 := &x.ListedCount + yym36 := z.DecBinary() + _ = yym36 + if false { + } else { + *((*int)(yyv35)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + case "location": + if r.TryDecodeAsNil() { + x.Location = "" + } else { + yyv37 := &x.Location + yym38 := z.DecBinary() + _ = yym38 + if false { + } else { + *((*string)(yyv37)) = r.DecodeString() + } + } + case "name": + if r.TryDecodeAsNil() { + x.Name = "" + } else { + yyv39 := &x.Name + yym40 := z.DecBinary() + _ = yym40 + if false { + } else { + *((*string)(yyv39)) = r.DecodeString() + } + } + case "notifications": + if r.TryDecodeAsNil() { + if x.Notifications != nil { + x.Notifications = nil + } + } else { + if x.Notifications == nil { + x.Notifications = new(string) + } + yym42 := z.DecBinary() + _ = yym42 + if false { + } else { + *((*string)(x.Notifications)) = r.DecodeString() + } + } + case "profile_background_color": + if r.TryDecodeAsNil() { + x.ProfileBackgroundColor = "" + } else { + yyv43 := &x.ProfileBackgroundColor + yym44 := z.DecBinary() + _ = yym44 + if false { + } else { + *((*string)(yyv43)) = r.DecodeString() + } + } + case "profile_background_image_url": + if r.TryDecodeAsNil() { + x.ProfileBackgroundImageURL = "" + } else { + yyv45 := &x.ProfileBackgroundImageURL + yym46 := z.DecBinary() + _ = yym46 + if false { + } else { + *((*string)(yyv45)) = r.DecodeString() + } + } + case "profile_background_image_url_https": + if r.TryDecodeAsNil() { + x.ProfileBackgroundImageURLHTTPS = "" + } else { + yyv47 := &x.ProfileBackgroundImageURLHTTPS + yym48 := z.DecBinary() + _ = yym48 + if false { + } else { + *((*string)(yyv47)) = r.DecodeString() + } + } + case "profile_background_tile": + if r.TryDecodeAsNil() { + x.ProfileBackgroundTile = false + } else { + yyv49 := &x.ProfileBackgroundTile + yym50 := z.DecBinary() + _ = yym50 + if false { + } else { + *((*bool)(yyv49)) = r.DecodeBool() + } + } + case "profile_image_url": + if r.TryDecodeAsNil() { + x.ProfileImageURL = "" + } else { + yyv51 := &x.ProfileImageURL + yym52 := z.DecBinary() + _ = yym52 + if false { + } else { + *((*string)(yyv51)) = r.DecodeString() + } + } + case "profile_image_url_https": + if r.TryDecodeAsNil() { + x.ProfileImageURLHTTPS = "" + } else { + yyv53 := &x.ProfileImageURLHTTPS + yym54 := z.DecBinary() + _ = yym54 + if false { + } else { + *((*string)(yyv53)) = r.DecodeString() + } + } + case "profile_link_color": + if r.TryDecodeAsNil() { + x.ProfileLinkColor = "" + } else { + yyv55 := &x.ProfileLinkColor + yym56 := z.DecBinary() + _ = yym56 + if false { + } else { + *((*string)(yyv55)) = r.DecodeString() + } + } + case "profile_sidebar_border_color": + if r.TryDecodeAsNil() { + x.ProfileSidebarBorderColor = "" + } else { + yyv57 := &x.ProfileSidebarBorderColor + yym58 := z.DecBinary() + _ = yym58 + if false { + } else { + *((*string)(yyv57)) = r.DecodeString() + } + } + case "profile_sidebar_fill_color": + if r.TryDecodeAsNil() { + x.ProfileSidebarFillColor = "" + } else { + yyv59 := &x.ProfileSidebarFillColor + yym60 := z.DecBinary() + _ = yym60 + if false { + } else { + *((*string)(yyv59)) = r.DecodeString() + } + } + case "profile_text_color": + if r.TryDecodeAsNil() { + x.ProfileTextColor = "" + } else { + yyv61 := &x.ProfileTextColor + yym62 := z.DecBinary() + _ = yym62 + if false { + } else { + *((*string)(yyv61)) = r.DecodeString() + } + } + case "profile_use_background_image": + if r.TryDecodeAsNil() { + x.ProfileUseBackgroundImage = false + } else { + yyv63 := &x.ProfileUseBackgroundImage + yym64 := z.DecBinary() + _ = yym64 + if false { + } else { + *((*bool)(yyv63)) = r.DecodeBool() + } + } + case "protected": + if r.TryDecodeAsNil() { + x.Protected = false + } else { + yyv65 := &x.Protected + yym66 := z.DecBinary() + _ = yym66 + if false { + } else { + *((*bool)(yyv65)) = r.DecodeBool() + } + } + case "screen_name": + if r.TryDecodeAsNil() { + x.ScreenName = "" + } else { + yyv67 := &x.ScreenName + yym68 := z.DecBinary() + _ = yym68 + if false { + } else { + *((*string)(yyv67)) = r.DecodeString() + } + } + case "show_all_inline_media": + if r.TryDecodeAsNil() { + x.ShowAllInlineMedia = false + } else { + yyv69 := &x.ShowAllInlineMedia + yym70 := z.DecBinary() + _ = yym70 + if false { + } else { + *((*bool)(yyv69)) = r.DecodeBool() + } + } + case "statuses_count": + if r.TryDecodeAsNil() { + x.StatusesCount = 0 + } else { + yyv71 := &x.StatusesCount + yym72 := z.DecBinary() + _ = yym72 + if false { + } else { + *((*int)(yyv71)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + case "time_zone": + if r.TryDecodeAsNil() { + x.TimeZone = "" + } else { + yyv73 := &x.TimeZone + yym74 := z.DecBinary() + _ = yym74 + if false { + } else { + *((*string)(yyv73)) = r.DecodeString() + } + } + case "url": + if r.TryDecodeAsNil() { + if x.URL != nil { + x.URL = nil + } + } else { + if x.URL == nil { + x.URL = new(string) + } + yym76 := z.DecBinary() + _ = yym76 + if false { + } else { + *((*string)(x.URL)) = r.DecodeString() + } + } + case "utc_offset": + if r.TryDecodeAsNil() { + x.UtcOffset = 0 + } else { + yyv77 := &x.UtcOffset + yym78 := z.DecBinary() + _ = yym78 + if false { + } else { + *((*int)(yyv77)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + case "verified": + if r.TryDecodeAsNil() { + x.Verified = false + } else { + yyv79 := &x.Verified + yym80 := z.DecBinary() + _ = yym80 + if false { + } else { + *((*bool)(yyv79)) = r.DecodeBool() + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd9225) +} + +func (x *User) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj81 int + var yyb81 bool + var yyhl81 bool = l >= 0 + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ContributorsEnabled = false + } else { + yyv82 := &x.ContributorsEnabled + yym83 := z.DecBinary() + _ = yym83 + if false { + } else { + *((*bool)(yyv82)) = r.DecodeBool() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.CreatedAt = "" + } else { + yyv84 := &x.CreatedAt + yym85 := z.DecBinary() + _ = yym85 + if false { + } else { + *((*string)(yyv84)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.DefaultProfile = false + } else { + yyv86 := &x.DefaultProfile + yym87 := z.DecBinary() + _ = yym87 + if false { + } else { + *((*bool)(yyv86)) = r.DecodeBool() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.DefaultProfileImage = false + } else { + yyv88 := &x.DefaultProfileImage + yym89 := z.DecBinary() + _ = yym89 + if false { + } else { + *((*bool)(yyv88)) = r.DecodeBool() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Description = "" + } else { + yyv90 := &x.Description + yym91 := z.DecBinary() + _ = yym91 + if false { + } else { + *((*string)(yyv90)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Entities = UserEntities{} + } else { + yyv92 := &x.Entities + yyv92.CodecDecodeSelf(d) + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.FavouritesCount = 0 + } else { + yyv93 := &x.FavouritesCount + yym94 := z.DecBinary() + _ = yym94 + if false { + } else { + *((*int)(yyv93)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + if x.FollowRequestSent != nil { + x.FollowRequestSent = nil + } + } else { + if x.FollowRequestSent == nil { + x.FollowRequestSent = new(string) + } + yym96 := z.DecBinary() + _ = yym96 + if false { + } else { + *((*string)(x.FollowRequestSent)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.FollowersCount = 0 + } else { + yyv97 := &x.FollowersCount + yym98 := z.DecBinary() + _ = yym98 + if false { + } else { + *((*int)(yyv97)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + if x.Following != nil { + x.Following = nil + } + } else { + if x.Following == nil { + x.Following = new(string) + } + yym100 := z.DecBinary() + _ = yym100 + if false { + } else { + *((*string)(x.Following)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.FriendsCount = 0 + } else { + yyv101 := &x.FriendsCount + yym102 := z.DecBinary() + _ = yym102 + if false { + } else { + *((*int)(yyv101)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.GeoEnabled = false + } else { + yyv103 := &x.GeoEnabled + yym104 := z.DecBinary() + _ = yym104 + if false { + } else { + *((*bool)(yyv103)) = r.DecodeBool() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ID = 0 + } else { + yyv105 := &x.ID + yym106 := z.DecBinary() + _ = yym106 + if false { + } else { + *((*int)(yyv105)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.IDStr = "" + } else { + yyv107 := &x.IDStr + yym108 := z.DecBinary() + _ = yym108 + if false { + } else { + *((*string)(yyv107)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.IsTranslator = false + } else { + yyv109 := &x.IsTranslator + yym110 := z.DecBinary() + _ = yym110 + if false { + } else { + *((*bool)(yyv109)) = r.DecodeBool() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Lang = "" + } else { + yyv111 := &x.Lang + yym112 := z.DecBinary() + _ = yym112 + if false { + } else { + *((*string)(yyv111)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ListedCount = 0 + } else { + yyv113 := &x.ListedCount + yym114 := z.DecBinary() + _ = yym114 + if false { + } else { + *((*int)(yyv113)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Location = "" + } else { + yyv115 := &x.Location + yym116 := z.DecBinary() + _ = yym116 + if false { + } else { + *((*string)(yyv115)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Name = "" + } else { + yyv117 := &x.Name + yym118 := z.DecBinary() + _ = yym118 + if false { + } else { + *((*string)(yyv117)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + if x.Notifications != nil { + x.Notifications = nil + } + } else { + if x.Notifications == nil { + x.Notifications = new(string) + } + yym120 := z.DecBinary() + _ = yym120 + if false { + } else { + *((*string)(x.Notifications)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ProfileBackgroundColor = "" + } else { + yyv121 := &x.ProfileBackgroundColor + yym122 := z.DecBinary() + _ = yym122 + if false { + } else { + *((*string)(yyv121)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ProfileBackgroundImageURL = "" + } else { + yyv123 := &x.ProfileBackgroundImageURL + yym124 := z.DecBinary() + _ = yym124 + if false { + } else { + *((*string)(yyv123)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ProfileBackgroundImageURLHTTPS = "" + } else { + yyv125 := &x.ProfileBackgroundImageURLHTTPS + yym126 := z.DecBinary() + _ = yym126 + if false { + } else { + *((*string)(yyv125)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ProfileBackgroundTile = false + } else { + yyv127 := &x.ProfileBackgroundTile + yym128 := z.DecBinary() + _ = yym128 + if false { + } else { + *((*bool)(yyv127)) = r.DecodeBool() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ProfileImageURL = "" + } else { + yyv129 := &x.ProfileImageURL + yym130 := z.DecBinary() + _ = yym130 + if false { + } else { + *((*string)(yyv129)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ProfileImageURLHTTPS = "" + } else { + yyv131 := &x.ProfileImageURLHTTPS + yym132 := z.DecBinary() + _ = yym132 + if false { + } else { + *((*string)(yyv131)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ProfileLinkColor = "" + } else { + yyv133 := &x.ProfileLinkColor + yym134 := z.DecBinary() + _ = yym134 + if false { + } else { + *((*string)(yyv133)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ProfileSidebarBorderColor = "" + } else { + yyv135 := &x.ProfileSidebarBorderColor + yym136 := z.DecBinary() + _ = yym136 + if false { + } else { + *((*string)(yyv135)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ProfileSidebarFillColor = "" + } else { + yyv137 := &x.ProfileSidebarFillColor + yym138 := z.DecBinary() + _ = yym138 + if false { + } else { + *((*string)(yyv137)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ProfileTextColor = "" + } else { + yyv139 := &x.ProfileTextColor + yym140 := z.DecBinary() + _ = yym140 + if false { + } else { + *((*string)(yyv139)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ProfileUseBackgroundImage = false + } else { + yyv141 := &x.ProfileUseBackgroundImage + yym142 := z.DecBinary() + _ = yym142 + if false { + } else { + *((*bool)(yyv141)) = r.DecodeBool() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Protected = false + } else { + yyv143 := &x.Protected + yym144 := z.DecBinary() + _ = yym144 + if false { + } else { + *((*bool)(yyv143)) = r.DecodeBool() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ScreenName = "" + } else { + yyv145 := &x.ScreenName + yym146 := z.DecBinary() + _ = yym146 + if false { + } else { + *((*string)(yyv145)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ShowAllInlineMedia = false + } else { + yyv147 := &x.ShowAllInlineMedia + yym148 := z.DecBinary() + _ = yym148 + if false { + } else { + *((*bool)(yyv147)) = r.DecodeBool() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.StatusesCount = 0 + } else { + yyv149 := &x.StatusesCount + yym150 := z.DecBinary() + _ = yym150 + if false { + } else { + *((*int)(yyv149)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.TimeZone = "" + } else { + yyv151 := &x.TimeZone + yym152 := z.DecBinary() + _ = yym152 + if false { + } else { + *((*string)(yyv151)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + if x.URL != nil { + x.URL = nil + } + } else { + if x.URL == nil { + x.URL = new(string) + } + yym154 := z.DecBinary() + _ = yym154 + if false { + } else { + *((*string)(x.URL)) = r.DecodeString() + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.UtcOffset = 0 + } else { + yyv155 := &x.UtcOffset + yym156 := z.DecBinary() + _ = yym156 + if false { + } else { + *((*int)(yyv155)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Verified = false + } else { + yyv157 := &x.Verified + yym158 := z.DecBinary() + _ = yym158 + if false { + } else { + *((*bool)(yyv157)) = r.DecodeBool() + } + } + for { + yyj81++ + if yyhl81 { + yyb81 = yyj81 > l + } else { + yyb81 = r.CheckBreak() + } + if yyb81 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + z.DecStructFieldNotFound(yyj81-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) +} + +func (x *StatusMetadata) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [2]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(2) + } else { + yynn2 = 2 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.IsoLanguageCode)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("iso_language_code")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.IsoLanguageCode)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ResultType)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("result_type")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.ResultType)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd9225) + } + } + } +} + +func (x *StatusMetadata) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap9225 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd9225) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray9225 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) + } + } +} + +func (x *StatusMetadata) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey9225) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} + yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) + z.DecSendContainerState(codecSelfer_containerMapValue9225) + switch yys3 { + case "iso_language_code": + if r.TryDecodeAsNil() { + x.IsoLanguageCode = "" + } else { + yyv4 := &x.IsoLanguageCode + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "result_type": + if r.TryDecodeAsNil() { + x.ResultType = "" + } else { + yyv6 := &x.ResultType + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd9225) +} + +func (x *StatusMetadata) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj8 int + var yyb8 bool + var yyhl8 bool = l >= 0 + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.IsoLanguageCode = "" + } else { + yyv9 := &x.IsoLanguageCode + yym10 := z.DecBinary() + _ = yym10 + if false { + } else { + *((*string)(yyv9)) = r.DecodeString() + } + } + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ResultType = "" + } else { + yyv11 := &x.ResultType + yym12 := z.DecBinary() + _ = yym12 + if false { + } else { + *((*string)(yyv11)) = r.DecodeString() + } + } + for { + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + z.DecStructFieldNotFound(yyj8-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) +} + +func (x *Status) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [21]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(21) + } else { + yynn2 = 21 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.Contributors == nil { + r.EncodeNil() + } else { + yy4 := *x.Contributors + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy4)) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("contributors")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.Contributors == nil { + r.EncodeNil() + } else { + yy6 := *x.Contributors + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy6)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.Coordinates == nil { + r.EncodeNil() + } else { + yy9 := *x.Coordinates + yym10 := z.EncBinary() + _ = yym10 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy9)) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("coordinates")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.Coordinates == nil { + r.EncodeNil() + } else { + yy11 := *x.Coordinates + yym12 := z.EncBinary() + _ = yym12 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy11)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym14 := z.EncBinary() + _ = yym14 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.CreatedAt)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("created_at")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym15 := z.EncBinary() + _ = yym15 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.CreatedAt)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yy17 := &x.Entities + yy17.CodecEncodeSelf(e) + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("entities")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yy19 := &x.Entities + yy19.CodecEncodeSelf(e) + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym22 := z.EncBinary() + _ = yym22 + if false { + } else { + r.EncodeBool(bool(x.Favorited)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("favorited")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym23 := z.EncBinary() + _ = yym23 + if false { + } else { + r.EncodeBool(bool(x.Favorited)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.Geo == nil { + r.EncodeNil() + } else { + yy25 := *x.Geo + yym26 := z.EncBinary() + _ = yym26 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy25)) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("geo")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.Geo == nil { + r.EncodeNil() + } else { + yy27 := *x.Geo + yym28 := z.EncBinary() + _ = yym28 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy27)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym30 := z.EncBinary() + _ = yym30 + if false { + } else { + r.EncodeInt(int64(x.ID)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("id")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym31 := z.EncBinary() + _ = yym31 + if false { + } else { + r.EncodeInt(int64(x.ID)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym33 := z.EncBinary() + _ = yym33 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.IDStr)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("id_str")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym34 := z.EncBinary() + _ = yym34 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.IDStr)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.InReplyToScreenName == nil { + r.EncodeNil() + } else { + yy36 := *x.InReplyToScreenName + yym37 := z.EncBinary() + _ = yym37 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy36)) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("in_reply_to_screen_name")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.InReplyToScreenName == nil { + r.EncodeNil() + } else { + yy38 := *x.InReplyToScreenName + yym39 := z.EncBinary() + _ = yym39 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy38)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.InReplyToStatusID == nil { + r.EncodeNil() + } else { + yy41 := *x.InReplyToStatusID + yym42 := z.EncBinary() + _ = yym42 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy41)) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("in_reply_to_status_id")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.InReplyToStatusID == nil { + r.EncodeNil() + } else { + yy43 := *x.InReplyToStatusID + yym44 := z.EncBinary() + _ = yym44 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy43)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.InReplyToStatusIDStr == nil { + r.EncodeNil() + } else { + yy46 := *x.InReplyToStatusIDStr + yym47 := z.EncBinary() + _ = yym47 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy46)) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("in_reply_to_status_id_str")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.InReplyToStatusIDStr == nil { + r.EncodeNil() + } else { + yy48 := *x.InReplyToStatusIDStr + yym49 := z.EncBinary() + _ = yym49 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy48)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.InReplyToUserID == nil { + r.EncodeNil() + } else { + yy51 := *x.InReplyToUserID + yym52 := z.EncBinary() + _ = yym52 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy51)) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("in_reply_to_user_id")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.InReplyToUserID == nil { + r.EncodeNil() + } else { + yy53 := *x.InReplyToUserID + yym54 := z.EncBinary() + _ = yym54 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy53)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.InReplyToUserIDStr == nil { + r.EncodeNil() + } else { + yy56 := *x.InReplyToUserIDStr + yym57 := z.EncBinary() + _ = yym57 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy56)) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("in_reply_to_user_id_str")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.InReplyToUserIDStr == nil { + r.EncodeNil() + } else { + yy58 := *x.InReplyToUserIDStr + yym59 := z.EncBinary() + _ = yym59 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy58)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yy61 := &x.Metadata + yy61.CodecEncodeSelf(e) + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("metadata")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yy63 := &x.Metadata + yy63.CodecEncodeSelf(e) + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.Place == nil { + r.EncodeNil() + } else { + yy66 := *x.Place + yym67 := z.EncBinary() + _ = yym67 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy66)) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("place")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.Place == nil { + r.EncodeNil() + } else { + yy68 := *x.Place + yym69 := z.EncBinary() + _ = yym69 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy68)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym71 := z.EncBinary() + _ = yym71 + if false { + } else { + r.EncodeInt(int64(x.RetweetCount)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("retweet_count")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym72 := z.EncBinary() + _ = yym72 + if false { + } else { + r.EncodeInt(int64(x.RetweetCount)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym74 := z.EncBinary() + _ = yym74 + if false { + } else { + r.EncodeBool(bool(x.Retweeted)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("retweeted")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym75 := z.EncBinary() + _ = yym75 + if false { + } else { + r.EncodeBool(bool(x.Retweeted)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym77 := z.EncBinary() + _ = yym77 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.Source)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("source")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym78 := z.EncBinary() + _ = yym78 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.Source)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym80 := z.EncBinary() + _ = yym80 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.Text)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("text")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym81 := z.EncBinary() + _ = yym81 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(x.Text)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yym83 := z.EncBinary() + _ = yym83 + if false { + } else { + r.EncodeBool(bool(x.Truncated)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("truncated")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yym84 := z.EncBinary() + _ = yym84 + if false { + } else { + r.EncodeBool(bool(x.Truncated)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yy86 := &x.User + yy86.CodecEncodeSelf(e) + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("user")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yy88 := &x.User + yy88.CodecEncodeSelf(e) + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd9225) + } + } + } +} + +func (x *Status) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap9225 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd9225) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray9225 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) + } + } +} + +func (x *Status) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey9225) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} + yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) + z.DecSendContainerState(codecSelfer_containerMapValue9225) + switch yys3 { + case "contributors": + if r.TryDecodeAsNil() { + if x.Contributors != nil { + x.Contributors = nil + } + } else { + if x.Contributors == nil { + x.Contributors = new(string) + } + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(x.Contributors)) = r.DecodeString() + } + } + case "coordinates": + if r.TryDecodeAsNil() { + if x.Coordinates != nil { + x.Coordinates = nil + } + } else { + if x.Coordinates == nil { + x.Coordinates = new(string) + } + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(x.Coordinates)) = r.DecodeString() + } + } + case "created_at": + if r.TryDecodeAsNil() { + x.CreatedAt = "" + } else { + yyv8 := &x.CreatedAt + yym9 := z.DecBinary() + _ = yym9 + if false { + } else { + *((*string)(yyv8)) = r.DecodeString() + } + } + case "entities": + if r.TryDecodeAsNil() { + x.Entities = Entities{} + } else { + yyv10 := &x.Entities + yyv10.CodecDecodeSelf(d) + } + case "favorited": + if r.TryDecodeAsNil() { + x.Favorited = false + } else { + yyv11 := &x.Favorited + yym12 := z.DecBinary() + _ = yym12 + if false { + } else { + *((*bool)(yyv11)) = r.DecodeBool() + } + } + case "geo": + if r.TryDecodeAsNil() { + if x.Geo != nil { + x.Geo = nil + } + } else { + if x.Geo == nil { + x.Geo = new(string) + } + yym14 := z.DecBinary() + _ = yym14 + if false { + } else { + *((*string)(x.Geo)) = r.DecodeString() + } + } + case "id": + if r.TryDecodeAsNil() { + x.ID = 0 + } else { + yyv15 := &x.ID + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + *((*int64)(yyv15)) = int64(r.DecodeInt(64)) + } + } + case "id_str": + if r.TryDecodeAsNil() { + x.IDStr = "" + } else { + yyv17 := &x.IDStr + yym18 := z.DecBinary() + _ = yym18 + if false { + } else { + *((*string)(yyv17)) = r.DecodeString() + } + } + case "in_reply_to_screen_name": + if r.TryDecodeAsNil() { + if x.InReplyToScreenName != nil { + x.InReplyToScreenName = nil + } + } else { + if x.InReplyToScreenName == nil { + x.InReplyToScreenName = new(string) + } + yym20 := z.DecBinary() + _ = yym20 + if false { + } else { + *((*string)(x.InReplyToScreenName)) = r.DecodeString() + } + } + case "in_reply_to_status_id": + if r.TryDecodeAsNil() { + if x.InReplyToStatusID != nil { + x.InReplyToStatusID = nil + } + } else { + if x.InReplyToStatusID == nil { + x.InReplyToStatusID = new(string) + } + yym22 := z.DecBinary() + _ = yym22 + if false { + } else { + *((*string)(x.InReplyToStatusID)) = r.DecodeString() + } + } + case "in_reply_to_status_id_str": + if r.TryDecodeAsNil() { + if x.InReplyToStatusIDStr != nil { + x.InReplyToStatusIDStr = nil + } + } else { + if x.InReplyToStatusIDStr == nil { + x.InReplyToStatusIDStr = new(string) + } + yym24 := z.DecBinary() + _ = yym24 + if false { + } else { + *((*string)(x.InReplyToStatusIDStr)) = r.DecodeString() + } + } + case "in_reply_to_user_id": + if r.TryDecodeAsNil() { + if x.InReplyToUserID != nil { + x.InReplyToUserID = nil + } + } else { + if x.InReplyToUserID == nil { + x.InReplyToUserID = new(string) + } + yym26 := z.DecBinary() + _ = yym26 + if false { + } else { + *((*string)(x.InReplyToUserID)) = r.DecodeString() + } + } + case "in_reply_to_user_id_str": + if r.TryDecodeAsNil() { + if x.InReplyToUserIDStr != nil { + x.InReplyToUserIDStr = nil + } + } else { + if x.InReplyToUserIDStr == nil { + x.InReplyToUserIDStr = new(string) + } + yym28 := z.DecBinary() + _ = yym28 + if false { + } else { + *((*string)(x.InReplyToUserIDStr)) = r.DecodeString() + } + } + case "metadata": + if r.TryDecodeAsNil() { + x.Metadata = StatusMetadata{} + } else { + yyv29 := &x.Metadata + yyv29.CodecDecodeSelf(d) + } + case "place": + if r.TryDecodeAsNil() { + if x.Place != nil { + x.Place = nil + } + } else { + if x.Place == nil { + x.Place = new(string) + } + yym31 := z.DecBinary() + _ = yym31 + if false { + } else { + *((*string)(x.Place)) = r.DecodeString() + } + } + case "retweet_count": + if r.TryDecodeAsNil() { + x.RetweetCount = 0 + } else { + yyv32 := &x.RetweetCount + yym33 := z.DecBinary() + _ = yym33 + if false { + } else { + *((*int)(yyv32)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + case "retweeted": + if r.TryDecodeAsNil() { + x.Retweeted = false + } else { + yyv34 := &x.Retweeted + yym35 := z.DecBinary() + _ = yym35 + if false { + } else { + *((*bool)(yyv34)) = r.DecodeBool() + } + } + case "source": + if r.TryDecodeAsNil() { + x.Source = "" + } else { + yyv36 := &x.Source + yym37 := z.DecBinary() + _ = yym37 + if false { + } else { + *((*string)(yyv36)) = r.DecodeString() + } + } + case "text": + if r.TryDecodeAsNil() { + x.Text = "" + } else { + yyv38 := &x.Text + yym39 := z.DecBinary() + _ = yym39 + if false { + } else { + *((*string)(yyv38)) = r.DecodeString() + } + } + case "truncated": + if r.TryDecodeAsNil() { + x.Truncated = false + } else { + yyv40 := &x.Truncated + yym41 := z.DecBinary() + _ = yym41 + if false { + } else { + *((*bool)(yyv40)) = r.DecodeBool() + } + } + case "user": + if r.TryDecodeAsNil() { + x.User = User{} + } else { + yyv42 := &x.User + yyv42.CodecDecodeSelf(d) + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd9225) +} + +func (x *Status) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj43 int + var yyb43 bool + var yyhl43 bool = l >= 0 + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + if x.Contributors != nil { + x.Contributors = nil + } + } else { + if x.Contributors == nil { + x.Contributors = new(string) + } + yym45 := z.DecBinary() + _ = yym45 + if false { + } else { + *((*string)(x.Contributors)) = r.DecodeString() + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + if x.Coordinates != nil { + x.Coordinates = nil + } + } else { + if x.Coordinates == nil { + x.Coordinates = new(string) + } + yym47 := z.DecBinary() + _ = yym47 + if false { + } else { + *((*string)(x.Coordinates)) = r.DecodeString() + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.CreatedAt = "" + } else { + yyv48 := &x.CreatedAt + yym49 := z.DecBinary() + _ = yym49 + if false { + } else { + *((*string)(yyv48)) = r.DecodeString() + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Entities = Entities{} + } else { + yyv50 := &x.Entities + yyv50.CodecDecodeSelf(d) + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Favorited = false + } else { + yyv51 := &x.Favorited + yym52 := z.DecBinary() + _ = yym52 + if false { + } else { + *((*bool)(yyv51)) = r.DecodeBool() + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + if x.Geo != nil { + x.Geo = nil + } + } else { + if x.Geo == nil { + x.Geo = new(string) + } + yym54 := z.DecBinary() + _ = yym54 + if false { + } else { + *((*string)(x.Geo)) = r.DecodeString() + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.ID = 0 + } else { + yyv55 := &x.ID + yym56 := z.DecBinary() + _ = yym56 + if false { + } else { + *((*int64)(yyv55)) = int64(r.DecodeInt(64)) + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.IDStr = "" + } else { + yyv57 := &x.IDStr + yym58 := z.DecBinary() + _ = yym58 + if false { + } else { + *((*string)(yyv57)) = r.DecodeString() + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + if x.InReplyToScreenName != nil { + x.InReplyToScreenName = nil + } + } else { + if x.InReplyToScreenName == nil { + x.InReplyToScreenName = new(string) + } + yym60 := z.DecBinary() + _ = yym60 + if false { + } else { + *((*string)(x.InReplyToScreenName)) = r.DecodeString() + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + if x.InReplyToStatusID != nil { + x.InReplyToStatusID = nil + } + } else { + if x.InReplyToStatusID == nil { + x.InReplyToStatusID = new(string) + } + yym62 := z.DecBinary() + _ = yym62 + if false { + } else { + *((*string)(x.InReplyToStatusID)) = r.DecodeString() + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + if x.InReplyToStatusIDStr != nil { + x.InReplyToStatusIDStr = nil + } + } else { + if x.InReplyToStatusIDStr == nil { + x.InReplyToStatusIDStr = new(string) + } + yym64 := z.DecBinary() + _ = yym64 + if false { + } else { + *((*string)(x.InReplyToStatusIDStr)) = r.DecodeString() + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + if x.InReplyToUserID != nil { + x.InReplyToUserID = nil + } + } else { + if x.InReplyToUserID == nil { + x.InReplyToUserID = new(string) + } + yym66 := z.DecBinary() + _ = yym66 + if false { + } else { + *((*string)(x.InReplyToUserID)) = r.DecodeString() + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + if x.InReplyToUserIDStr != nil { + x.InReplyToUserIDStr = nil + } + } else { + if x.InReplyToUserIDStr == nil { + x.InReplyToUserIDStr = new(string) + } + yym68 := z.DecBinary() + _ = yym68 + if false { + } else { + *((*string)(x.InReplyToUserIDStr)) = r.DecodeString() + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Metadata = StatusMetadata{} + } else { + yyv69 := &x.Metadata + yyv69.CodecDecodeSelf(d) + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + if x.Place != nil { + x.Place = nil + } + } else { + if x.Place == nil { + x.Place = new(string) + } + yym71 := z.DecBinary() + _ = yym71 + if false { + } else { + *((*string)(x.Place)) = r.DecodeString() + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.RetweetCount = 0 + } else { + yyv72 := &x.RetweetCount + yym73 := z.DecBinary() + _ = yym73 + if false { + } else { + *((*int)(yyv72)) = int(r.DecodeInt(codecSelferBitsize9225)) + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Retweeted = false + } else { + yyv74 := &x.Retweeted + yym75 := z.DecBinary() + _ = yym75 + if false { + } else { + *((*bool)(yyv74)) = r.DecodeBool() + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Source = "" + } else { + yyv76 := &x.Source + yym77 := z.DecBinary() + _ = yym77 + if false { + } else { + *((*string)(yyv76)) = r.DecodeString() + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Text = "" + } else { + yyv78 := &x.Text + yym79 := z.DecBinary() + _ = yym79 + if false { + } else { + *((*string)(yyv78)) = r.DecodeString() + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Truncated = false + } else { + yyv80 := &x.Truncated + yym81 := z.DecBinary() + _ = yym81 + if false { + } else { + *((*bool)(yyv80)) = r.DecodeBool() + } + } + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.User = User{} + } else { + yyv82 := &x.User + yyv82.CodecDecodeSelf(d) + } + for { + yyj43++ + if yyhl43 { + yyb43 = yyj43 > l + } else { + yyb43 = r.CheckBreak() + } + if yyb43 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + z.DecStructFieldNotFound(yyj43-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) +} + +func (x *LargeStruct) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [2]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(2) + } else { + yynn2 = 2 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yy4 := &x.SearchMetadata + yy4.CodecEncodeSelf(e) + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("search_metadata")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + yy6 := &x.SearchMetadata + yy6.CodecEncodeSelf(e) + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.Statuses == nil { + r.EncodeNil() + } else { + yym9 := z.EncBinary() + _ = yym9 + if false { + } else { + h.encSliceStatus(([]Status)(x.Statuses), e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("statuses")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.Statuses == nil { + r.EncodeNil() + } else { + yym10 := z.EncBinary() + _ = yym10 + if false { + } else { + h.encSliceStatus(([]Status)(x.Statuses), e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd9225) + } + } + } +} + +func (x *LargeStruct) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap9225 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd9225) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray9225 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) + } + } +} + +func (x *LargeStruct) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey9225) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} + yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) + z.DecSendContainerState(codecSelfer_containerMapValue9225) + switch yys3 { + case "search_metadata": + if r.TryDecodeAsNil() { + x.SearchMetadata = SearchMetadata{} + } else { + yyv4 := &x.SearchMetadata + yyv4.CodecDecodeSelf(d) + } + case "statuses": + if r.TryDecodeAsNil() { + x.Statuses = nil + } else { + yyv5 := &x.Statuses + yym6 := z.DecBinary() + _ = yym6 + if false { + } else { + h.decSliceStatus((*[]Status)(yyv5), d) + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd9225) +} + +func (x *LargeStruct) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj7 int + var yyb7 bool + var yyhl7 bool = l >= 0 + yyj7++ + if yyhl7 { + yyb7 = yyj7 > l + } else { + yyb7 = r.CheckBreak() + } + if yyb7 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.SearchMetadata = SearchMetadata{} + } else { + yyv8 := &x.SearchMetadata + yyv8.CodecDecodeSelf(d) + } + yyj7++ + if yyhl7 { + yyb7 = yyj7 > l + } else { + yyb7 = r.CheckBreak() + } + if yyb7 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Statuses = nil + } else { + yyv9 := &x.Statuses + yym10 := z.DecBinary() + _ = yym10 + if false { + } else { + h.decSliceStatus((*[]Status)(yyv9), d) + } + } + for { + yyj7++ + if yyhl7 { + yyb7 = yyj7 > l + } else { + yyb7 = r.CheckBreak() + } + if yyb7 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + z.DecStructFieldNotFound(yyj7-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) +} + +func (x *XLStruct) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [1]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(1) + } else { + yynn2 = 1 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if x.Data == nil { + r.EncodeNil() + } else { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + h.encSliceLargeStruct(([]LargeStruct)(x.Data), e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey9225) + r.EncodeString(codecSelferC_UTF89225, string("Data")) + z.EncSendContainerState(codecSelfer_containerMapValue9225) + if x.Data == nil { + r.EncodeNil() + } else { + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + h.encSliceLargeStruct(([]LargeStruct)(x.Data), e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd9225) + } + } + } +} + +func (x *XLStruct) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap9225 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd9225) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray9225 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) + } + } +} + +func (x *XLStruct) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey9225) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} + yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) + z.DecSendContainerState(codecSelfer_containerMapValue9225) + switch yys3 { + case "Data": + if r.TryDecodeAsNil() { + x.Data = nil + } else { + yyv4 := &x.Data + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + h.decSliceLargeStruct((*[]LargeStruct)(yyv4), d) + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd9225) +} + +func (x *XLStruct) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj6 int + var yyb6 bool + var yyhl6 bool = l >= 0 + yyj6++ + if yyhl6 { + yyb6 = yyj6 > l + } else { + yyb6 = r.CheckBreak() + } + if yyb6 { + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + if r.TryDecodeAsNil() { + x.Data = nil + } else { + yyv7 := &x.Data + yym8 := z.DecBinary() + _ = yym8 + if false { + } else { + h.decSliceLargeStruct((*[]LargeStruct)(yyv7), d) + } + } + for { + yyj6++ + if yyhl6 { + yyb6 = yyj6 > l + } else { + yyb6 = r.CheckBreak() + } + if yyb6 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem9225) + z.DecStructFieldNotFound(yyj6-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd9225) +} + +func (x codecSelfer9225) encSliceHashtag(v []Hashtag, e *codec1978.Encoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + r.EncodeArrayStart(len(v)) + for _, yyv1 := range v { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yy2 := &yyv1 + yy2.CodecEncodeSelf(e) + } + z.EncSendContainerState(codecSelfer_containerArrayEnd9225) +} + +func (x codecSelfer9225) decSliceHashtag(v *[]Hashtag, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + + yyv1 := *v + yyh1, yyl1 := z.DecSliceHelperStart() + var yyc1 bool + _ = yyc1 + if yyl1 == 0 { + if yyv1 == nil { + yyv1 = []Hashtag{} + yyc1 = true + } else if len(yyv1) != 0 { + yyv1 = yyv1[:0] + yyc1 = true + } + } else if yyl1 > 0 { + var yyrr1, yyrl1 int + var yyrt1 bool + _, _ = yyrl1, yyrt1 + yyrr1 = yyl1 // len(yyv1) + if yyl1 > cap(yyv1) { + + yyrg1 := len(yyv1) > 0 + yyv21 := yyv1 + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 40) + if yyrt1 { + if yyrl1 <= cap(yyv1) { + yyv1 = yyv1[:yyrl1] + } else { + yyv1 = make([]Hashtag, yyrl1) + } + } else { + yyv1 = make([]Hashtag, yyrl1) + } + yyc1 = true + yyrr1 = len(yyv1) + if yyrg1 { + copy(yyv1, yyv21) + } + } else if yyl1 != len(yyv1) { + yyv1 = yyv1[:yyl1] + yyc1 = true + } + yyj1 := 0 + for ; yyj1 < yyrr1; yyj1++ { + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = Hashtag{} + } else { + yyv2 := &yyv1[yyj1] + yyv2.CodecDecodeSelf(d) + } + + } + if yyrt1 { + for ; yyj1 < yyl1; yyj1++ { + yyv1 = append(yyv1, Hashtag{}) + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = Hashtag{} + } else { + yyv3 := &yyv1[yyj1] + yyv3.CodecDecodeSelf(d) + } + + } + } + + } else { + yyj1 := 0 + for ; !r.CheckBreak(); yyj1++ { + + if yyj1 >= len(yyv1) { + yyv1 = append(yyv1, Hashtag{}) // var yyz1 Hashtag + yyc1 = true + } + yyh1.ElemContainerState(yyj1) + if yyj1 < len(yyv1) { + if r.TryDecodeAsNil() { + yyv1[yyj1] = Hashtag{} + } else { + yyv4 := &yyv1[yyj1] + yyv4.CodecDecodeSelf(d) + } + + } else { + z.DecSwallow() + } + + } + if yyj1 < len(yyv1) { + yyv1 = yyv1[:yyj1] + yyc1 = true + } else if yyj1 == 0 && yyv1 == nil { + yyv1 = []Hashtag{} + yyc1 = true + } + } + yyh1.End() + if yyc1 { + *v = yyv1 + } +} + +func (x codecSelfer9225) encSlicePtrtostring(v []*string, e *codec1978.Encoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + r.EncodeArrayStart(len(v)) + for _, yyv1 := range v { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + if yyv1 == nil { + r.EncodeNil() + } else { + yy2 := *yyv1 + yym3 := z.EncBinary() + _ = yym3 + if false { + } else { + r.EncodeString(codecSelferC_UTF89225, string(yy2)) + } + } + } + z.EncSendContainerState(codecSelfer_containerArrayEnd9225) +} + +func (x codecSelfer9225) decSlicePtrtostring(v *[]*string, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + + yyv1 := *v + yyh1, yyl1 := z.DecSliceHelperStart() + var yyc1 bool + _ = yyc1 + if yyl1 == 0 { + if yyv1 == nil { + yyv1 = []*string{} + yyc1 = true + } else if len(yyv1) != 0 { + yyv1 = yyv1[:0] + yyc1 = true + } + } else if yyl1 > 0 { + var yyrr1, yyrl1 int + var yyrt1 bool + _, _ = yyrl1, yyrt1 + yyrr1 = yyl1 // len(yyv1) + if yyl1 > cap(yyv1) { + + yyrg1 := len(yyv1) > 0 + yyv21 := yyv1 + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 8) + if yyrt1 { + if yyrl1 <= cap(yyv1) { + yyv1 = yyv1[:yyrl1] + } else { + yyv1 = make([]*string, yyrl1) + } + } else { + yyv1 = make([]*string, yyrl1) + } + yyc1 = true + yyrr1 = len(yyv1) + if yyrg1 { + copy(yyv1, yyv21) + } + } else if yyl1 != len(yyv1) { + yyv1 = yyv1[:yyl1] + yyc1 = true + } + yyj1 := 0 + for ; yyj1 < yyrr1; yyj1++ { + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + if yyv1[yyj1] != nil { + *yyv1[yyj1] = "" + } + } else { + if yyv1[yyj1] == nil { + yyv1[yyj1] = new(string) + } + yyw2 := yyv1[yyj1] + yym3 := z.DecBinary() + _ = yym3 + if false { + } else { + *((*string)(yyw2)) = r.DecodeString() + } + } + + } + if yyrt1 { + for ; yyj1 < yyl1; yyj1++ { + yyv1 = append(yyv1, nil) + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + if yyv1[yyj1] != nil { + *yyv1[yyj1] = "" + } + } else { + if yyv1[yyj1] == nil { + yyv1[yyj1] = new(string) + } + yyw4 := yyv1[yyj1] + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyw4)) = r.DecodeString() + } + } + + } + } + + } else { + yyj1 := 0 + for ; !r.CheckBreak(); yyj1++ { + + if yyj1 >= len(yyv1) { + yyv1 = append(yyv1, nil) // var yyz1 *string + yyc1 = true + } + yyh1.ElemContainerState(yyj1) + if yyj1 < len(yyv1) { + if r.TryDecodeAsNil() { + if yyv1[yyj1] != nil { + *yyv1[yyj1] = "" + } + } else { + if yyv1[yyj1] == nil { + yyv1[yyj1] = new(string) + } + yyw6 := yyv1[yyj1] + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyw6)) = r.DecodeString() + } + } + + } else { + z.DecSwallow() + } + + } + if yyj1 < len(yyv1) { + yyv1 = yyv1[:yyj1] + yyc1 = true + } else if yyj1 == 0 && yyv1 == nil { + yyv1 = []*string{} + yyc1 = true + } + } + yyh1.End() + if yyc1 { + *v = yyv1 + } +} + +func (x codecSelfer9225) encSliceURL(v []URL, e *codec1978.Encoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + r.EncodeArrayStart(len(v)) + for _, yyv1 := range v { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yy2 := &yyv1 + yy2.CodecEncodeSelf(e) + } + z.EncSendContainerState(codecSelfer_containerArrayEnd9225) +} + +func (x codecSelfer9225) decSliceURL(v *[]URL, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + + yyv1 := *v + yyh1, yyl1 := z.DecSliceHelperStart() + var yyc1 bool + _ = yyc1 + if yyl1 == 0 { + if yyv1 == nil { + yyv1 = []URL{} + yyc1 = true + } else if len(yyv1) != 0 { + yyv1 = yyv1[:0] + yyc1 = true + } + } else if yyl1 > 0 { + var yyrr1, yyrl1 int + var yyrt1 bool + _, _ = yyrl1, yyrt1 + yyrr1 = yyl1 // len(yyv1) + if yyl1 > cap(yyv1) { + + yyrg1 := len(yyv1) > 0 + yyv21 := yyv1 + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 48) + if yyrt1 { + if yyrl1 <= cap(yyv1) { + yyv1 = yyv1[:yyrl1] + } else { + yyv1 = make([]URL, yyrl1) + } + } else { + yyv1 = make([]URL, yyrl1) + } + yyc1 = true + yyrr1 = len(yyv1) + if yyrg1 { + copy(yyv1, yyv21) + } + } else if yyl1 != len(yyv1) { + yyv1 = yyv1[:yyl1] + yyc1 = true + } + yyj1 := 0 + for ; yyj1 < yyrr1; yyj1++ { + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = URL{} + } else { + yyv2 := &yyv1[yyj1] + yyv2.CodecDecodeSelf(d) + } + + } + if yyrt1 { + for ; yyj1 < yyl1; yyj1++ { + yyv1 = append(yyv1, URL{}) + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = URL{} + } else { + yyv3 := &yyv1[yyj1] + yyv3.CodecDecodeSelf(d) + } + + } + } + + } else { + yyj1 := 0 + for ; !r.CheckBreak(); yyj1++ { + + if yyj1 >= len(yyv1) { + yyv1 = append(yyv1, URL{}) // var yyz1 URL + yyc1 = true + } + yyh1.ElemContainerState(yyj1) + if yyj1 < len(yyv1) { + if r.TryDecodeAsNil() { + yyv1[yyj1] = URL{} + } else { + yyv4 := &yyv1[yyj1] + yyv4.CodecDecodeSelf(d) + } + + } else { + z.DecSwallow() + } + + } + if yyj1 < len(yyv1) { + yyv1 = yyv1[:yyj1] + yyc1 = true + } else if yyj1 == 0 && yyv1 == nil { + yyv1 = []URL{} + yyc1 = true + } + } + yyh1.End() + if yyc1 { + *v = yyv1 + } +} + +func (x codecSelfer9225) encSliceStatus(v []Status, e *codec1978.Encoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + r.EncodeArrayStart(len(v)) + for _, yyv1 := range v { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yy2 := &yyv1 + yy2.CodecEncodeSelf(e) + } + z.EncSendContainerState(codecSelfer_containerArrayEnd9225) +} + +func (x codecSelfer9225) decSliceStatus(v *[]Status, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + + yyv1 := *v + yyh1, yyl1 := z.DecSliceHelperStart() + var yyc1 bool + _ = yyc1 + if yyl1 == 0 { + if yyv1 == nil { + yyv1 = []Status{} + yyc1 = true + } else if len(yyv1) != 0 { + yyv1 = yyv1[:0] + yyc1 = true + } + } else if yyl1 > 0 { + var yyrr1, yyrl1 int + var yyrt1 bool + _, _ = yyrl1, yyrt1 + yyrr1 = yyl1 // len(yyv1) + if yyl1 > cap(yyv1) { + + yyrg1 := len(yyv1) > 0 + yyv21 := yyv1 + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 752) + if yyrt1 { + if yyrl1 <= cap(yyv1) { + yyv1 = yyv1[:yyrl1] + } else { + yyv1 = make([]Status, yyrl1) + } + } else { + yyv1 = make([]Status, yyrl1) + } + yyc1 = true + yyrr1 = len(yyv1) + if yyrg1 { + copy(yyv1, yyv21) + } + } else if yyl1 != len(yyv1) { + yyv1 = yyv1[:yyl1] + yyc1 = true + } + yyj1 := 0 + for ; yyj1 < yyrr1; yyj1++ { + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = Status{} + } else { + yyv2 := &yyv1[yyj1] + yyv2.CodecDecodeSelf(d) + } + + } + if yyrt1 { + for ; yyj1 < yyl1; yyj1++ { + yyv1 = append(yyv1, Status{}) + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = Status{} + } else { + yyv3 := &yyv1[yyj1] + yyv3.CodecDecodeSelf(d) + } + + } + } + + } else { + yyj1 := 0 + for ; !r.CheckBreak(); yyj1++ { + + if yyj1 >= len(yyv1) { + yyv1 = append(yyv1, Status{}) // var yyz1 Status + yyc1 = true + } + yyh1.ElemContainerState(yyj1) + if yyj1 < len(yyv1) { + if r.TryDecodeAsNil() { + yyv1[yyj1] = Status{} + } else { + yyv4 := &yyv1[yyj1] + yyv4.CodecDecodeSelf(d) + } + + } else { + z.DecSwallow() + } + + } + if yyj1 < len(yyv1) { + yyv1 = yyv1[:yyj1] + yyc1 = true + } else if yyj1 == 0 && yyv1 == nil { + yyv1 = []Status{} + yyc1 = true + } + } + yyh1.End() + if yyc1 { + *v = yyv1 + } +} + +func (x codecSelfer9225) encSliceLargeStruct(v []LargeStruct, e *codec1978.Encoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + r.EncodeArrayStart(len(v)) + for _, yyv1 := range v { + z.EncSendContainerState(codecSelfer_containerArrayElem9225) + yy2 := &yyv1 + yy2.CodecEncodeSelf(e) + } + z.EncSendContainerState(codecSelfer_containerArrayEnd9225) +} + +func (x codecSelfer9225) decSliceLargeStruct(v *[]LargeStruct, d *codec1978.Decoder) { + var h codecSelfer9225 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + + yyv1 := *v + yyh1, yyl1 := z.DecSliceHelperStart() + var yyc1 bool + _ = yyc1 + if yyl1 == 0 { + if yyv1 == nil { + yyv1 = []LargeStruct{} + yyc1 = true + } else if len(yyv1) != 0 { + yyv1 = yyv1[:0] + yyc1 = true + } + } else if yyl1 > 0 { + var yyrr1, yyrl1 int + var yyrt1 bool + _, _ = yyrl1, yyrt1 + yyrr1 = yyl1 // len(yyv1) + if yyl1 > cap(yyv1) { + + yyrg1 := len(yyv1) > 0 + yyv21 := yyv1 + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 136) + if yyrt1 { + if yyrl1 <= cap(yyv1) { + yyv1 = yyv1[:yyrl1] + } else { + yyv1 = make([]LargeStruct, yyrl1) + } + } else { + yyv1 = make([]LargeStruct, yyrl1) + } + yyc1 = true + yyrr1 = len(yyv1) + if yyrg1 { + copy(yyv1, yyv21) + } + } else if yyl1 != len(yyv1) { + yyv1 = yyv1[:yyl1] + yyc1 = true + } + yyj1 := 0 + for ; yyj1 < yyrr1; yyj1++ { + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = LargeStruct{} + } else { + yyv2 := &yyv1[yyj1] + yyv2.CodecDecodeSelf(d) + } + + } + if yyrt1 { + for ; yyj1 < yyl1; yyj1++ { + yyv1 = append(yyv1, LargeStruct{}) + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = LargeStruct{} + } else { + yyv3 := &yyv1[yyj1] + yyv3.CodecDecodeSelf(d) + } + + } + } + + } else { + yyj1 := 0 + for ; !r.CheckBreak(); yyj1++ { + + if yyj1 >= len(yyv1) { + yyv1 = append(yyv1, LargeStruct{}) // var yyz1 LargeStruct + yyc1 = true + } + yyh1.ElemContainerState(yyj1) + if yyj1 < len(yyv1) { + if r.TryDecodeAsNil() { + yyv1[yyj1] = LargeStruct{} + } else { + yyv4 := &yyv1[yyj1] + yyv4.CodecDecodeSelf(d) + } + + } else { + z.DecSwallow() + } + + } + if yyj1 < len(yyv1) { + yyv1 = yyv1[:yyj1] + yyc1 = true + } else if yyj1 == 0 && yyv1 == nil { + yyv1 = []LargeStruct{} + yyc1 = true + } + } + yyh1.End() + if yyc1 { + *v = yyv1 + } +} diff --git a/vendor/github.com/mailru/easyjson/benchmark/data_ffjson.go b/vendor/github.com/mailru/easyjson/benchmark/data_ffjson.go new file mode 100644 index 0000000000..9f000d3ad2 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/benchmark/data_ffjson.go @@ -0,0 +1,6723 @@ +// +build use_ffjson + +// DO NOT EDIT! +// Code generated by ffjson +// source: .root/src/github.com/mailru/easyjson/benchmark/data.go +// DO NOT EDIT! + +package benchmark + +import ( + "bytes" + "errors" + "fmt" + fflib "github.com/pquerna/ffjson/fflib/v1" +) + +func (mj *Entities) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Entities) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"hashtags":`) + if mj.Hashtags != nil { + buf.WriteString(`[`) + for i, v := range mj.Hashtags { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"urls":`) + if mj.Urls != nil { + buf.WriteString(`[`) + for i, v := range mj.Urls { + if i != 0 { + buf.WriteString(`,`) + } + if v != nil { + fflib.WriteJsonString(buf, string(*v)) + } else { + buf.WriteString(`null`) + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"user_mentions":`) + if mj.UserMentions != nil { + buf.WriteString(`[`) + for i, v := range mj.UserMentions { + if i != 0 { + buf.WriteString(`,`) + } + if v != nil { + fflib.WriteJsonString(buf, string(*v)) + } else { + buf.WriteString(`null`) + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Entitiesbase = iota + ffj_t_Entitiesno_such_key + + ffj_t_Entities_Hashtags + + ffj_t_Entities_Urls + + ffj_t_Entities_UserMentions +) + +var ffj_key_Entities_Hashtags = []byte("hashtags") + +var ffj_key_Entities_Urls = []byte("urls") + +var ffj_key_Entities_UserMentions = []byte("user_mentions") + +func (uj *Entities) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Entities) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Entitiesbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Entitiesno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'h': + + if bytes.Equal(ffj_key_Entities_Hashtags, kn) { + currentKey = ffj_t_Entities_Hashtags + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_Entities_Urls, kn) { + currentKey = ffj_t_Entities_Urls + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Entities_UserMentions, kn) { + currentKey = ffj_t_Entities_UserMentions + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Entities_UserMentions, kn) { + currentKey = ffj_t_Entities_UserMentions + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Entities_Urls, kn) { + currentKey = ffj_t_Entities_Urls + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Entities_Hashtags, kn) { + currentKey = ffj_t_Entities_Hashtags + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Entitiesno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Entities_Hashtags: + goto handle_Hashtags + + case ffj_t_Entities_Urls: + goto handle_Urls + + case ffj_t_Entities_UserMentions: + goto handle_UserMentions + + case ffj_t_Entitiesno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Hashtags: + + /* handler: uj.Hashtags type=[]benchmark.Hashtag kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Hashtags = nil + } else { + + uj.Hashtags = make([]Hashtag, 0) + + wantVal := true + + for { + + var tmp_uj__Hashtags Hashtag + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Hashtags type=benchmark.Hashtag kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Hashtags.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Hashtags = append(uj.Hashtags, tmp_uj__Hashtags) + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Urls: + + /* handler: uj.Urls type=[]*string kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Urls = nil + } else { + + uj.Urls = make([]*string, 0) + + wantVal := true + + for { + + var tmp_uj__Urls *string + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Urls type=*string kind=ptr quoted=false*/ + + { + + if tok == fflib.FFTok_null { + tmp_uj__Urls = nil + } else { + if tmp_uj__Urls == nil { + tmp_uj__Urls = new(string) + } + + /* handler: tmp_uj__Urls type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + tmp_uj__Urls = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + tmp_uj__Urls = &tval + + } + } + + } + } + + uj.Urls = append(uj.Urls, tmp_uj__Urls) + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_UserMentions: + + /* handler: uj.UserMentions type=[]*string kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.UserMentions = nil + } else { + + uj.UserMentions = make([]*string, 0) + + wantVal := true + + for { + + var tmp_uj__UserMentions *string + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__UserMentions type=*string kind=ptr quoted=false*/ + + { + + if tok == fflib.FFTok_null { + tmp_uj__UserMentions = nil + } else { + if tmp_uj__UserMentions == nil { + tmp_uj__UserMentions = new(string) + } + + /* handler: tmp_uj__UserMentions type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + tmp_uj__UserMentions = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + tmp_uj__UserMentions = &tval + + } + } + + } + } + + uj.UserMentions = append(uj.UserMentions, tmp_uj__UserMentions) + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + return nil +} + +func (mj *Hashtag) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Hashtag) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"indices":`) + if mj.Indices != nil { + buf.WriteString(`[`) + for i, v := range mj.Indices { + if i != 0 { + buf.WriteString(`,`) + } + fflib.FormatBits2(buf, uint64(v), 10, v < 0) + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"text":`) + fflib.WriteJsonString(buf, string(mj.Text)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Hashtagbase = iota + ffj_t_Hashtagno_such_key + + ffj_t_Hashtag_Indices + + ffj_t_Hashtag_Text +) + +var ffj_key_Hashtag_Indices = []byte("indices") + +var ffj_key_Hashtag_Text = []byte("text") + +func (uj *Hashtag) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Hashtag) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Hashtagbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Hashtagno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'i': + + if bytes.Equal(ffj_key_Hashtag_Indices, kn) { + currentKey = ffj_t_Hashtag_Indices + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Hashtag_Text, kn) { + currentKey = ffj_t_Hashtag_Text + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Hashtag_Text, kn) { + currentKey = ffj_t_Hashtag_Text + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Hashtag_Indices, kn) { + currentKey = ffj_t_Hashtag_Indices + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Hashtagno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Hashtag_Indices: + goto handle_Indices + + case ffj_t_Hashtag_Text: + goto handle_Text + + case ffj_t_Hashtagno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Indices: + + /* handler: uj.Indices type=[]int kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Indices = nil + } else { + + uj.Indices = make([]int, 0) + + wantVal := true + + for { + + var tmp_uj__Indices int + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Indices type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + tmp_uj__Indices = int(tval) + + } + } + + uj.Indices = append(uj.Indices, tmp_uj__Indices) + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Text: + + /* handler: uj.Text type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Text = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + return nil +} + +func (mj *LargeStruct) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *LargeStruct) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"search_metadata":`) + + { + + err = mj.SearchMetadata.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"statuses":`) + if mj.Statuses != nil { + buf.WriteString(`[`) + for i, v := range mj.Statuses { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_LargeStructbase = iota + ffj_t_LargeStructno_such_key + + ffj_t_LargeStruct_SearchMetadata + + ffj_t_LargeStruct_Statuses +) + +var ffj_key_LargeStruct_SearchMetadata = []byte("search_metadata") + +var ffj_key_LargeStruct_Statuses = []byte("statuses") + +func (uj *LargeStruct) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *LargeStruct) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_LargeStructbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_LargeStructno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 's': + + if bytes.Equal(ffj_key_LargeStruct_SearchMetadata, kn) { + currentKey = ffj_t_LargeStruct_SearchMetadata + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_LargeStruct_Statuses, kn) { + currentKey = ffj_t_LargeStruct_Statuses + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_LargeStruct_Statuses, kn) { + currentKey = ffj_t_LargeStruct_Statuses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_LargeStruct_SearchMetadata, kn) { + currentKey = ffj_t_LargeStruct_SearchMetadata + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_LargeStructno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_LargeStruct_SearchMetadata: + goto handle_SearchMetadata + + case ffj_t_LargeStruct_Statuses: + goto handle_Statuses + + case ffj_t_LargeStructno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_SearchMetadata: + + /* handler: uj.SearchMetadata type=benchmark.SearchMetadata kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.SearchMetadata.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Statuses: + + /* handler: uj.Statuses type=[]benchmark.Status kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Statuses = nil + } else { + + uj.Statuses = make([]Status, 0) + + wantVal := true + + for { + + var tmp_uj__Statuses Status + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Statuses type=benchmark.Status kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Statuses.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Statuses = append(uj.Statuses, tmp_uj__Statuses) + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + return nil +} + +func (mj *SearchMetadata) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *SearchMetadata) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"completed_in":`) + fflib.AppendFloat(buf, float64(mj.CompletedIn), 'g', -1, 64) + buf.WriteString(`,"count":`) + fflib.FormatBits2(buf, uint64(mj.Count), 10, mj.Count < 0) + buf.WriteString(`,"max_id":`) + fflib.FormatBits2(buf, uint64(mj.MaxID), 10, mj.MaxID < 0) + buf.WriteString(`,"max_id_str":`) + fflib.WriteJsonString(buf, string(mj.MaxIDStr)) + buf.WriteString(`,"next_results":`) + fflib.WriteJsonString(buf, string(mj.NextResults)) + buf.WriteString(`,"query":`) + fflib.WriteJsonString(buf, string(mj.Query)) + buf.WriteString(`,"refresh_url":`) + fflib.WriteJsonString(buf, string(mj.RefreshURL)) + buf.WriteString(`,"since_id":`) + fflib.FormatBits2(buf, uint64(mj.SinceID), 10, mj.SinceID < 0) + buf.WriteString(`,"since_id_str":`) + fflib.WriteJsonString(buf, string(mj.SinceIDStr)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_SearchMetadatabase = iota + ffj_t_SearchMetadatano_such_key + + ffj_t_SearchMetadata_CompletedIn + + ffj_t_SearchMetadata_Count + + ffj_t_SearchMetadata_MaxID + + ffj_t_SearchMetadata_MaxIDStr + + ffj_t_SearchMetadata_NextResults + + ffj_t_SearchMetadata_Query + + ffj_t_SearchMetadata_RefreshURL + + ffj_t_SearchMetadata_SinceID + + ffj_t_SearchMetadata_SinceIDStr +) + +var ffj_key_SearchMetadata_CompletedIn = []byte("completed_in") + +var ffj_key_SearchMetadata_Count = []byte("count") + +var ffj_key_SearchMetadata_MaxID = []byte("max_id") + +var ffj_key_SearchMetadata_MaxIDStr = []byte("max_id_str") + +var ffj_key_SearchMetadata_NextResults = []byte("next_results") + +var ffj_key_SearchMetadata_Query = []byte("query") + +var ffj_key_SearchMetadata_RefreshURL = []byte("refresh_url") + +var ffj_key_SearchMetadata_SinceID = []byte("since_id") + +var ffj_key_SearchMetadata_SinceIDStr = []byte("since_id_str") + +func (uj *SearchMetadata) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *SearchMetadata) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_SearchMetadatabase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_SearchMetadatano_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_SearchMetadata_CompletedIn, kn) { + currentKey = ffj_t_SearchMetadata_CompletedIn + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_SearchMetadata_Count, kn) { + currentKey = ffj_t_SearchMetadata_Count + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'm': + + if bytes.Equal(ffj_key_SearchMetadata_MaxID, kn) { + currentKey = ffj_t_SearchMetadata_MaxID + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_SearchMetadata_MaxIDStr, kn) { + currentKey = ffj_t_SearchMetadata_MaxIDStr + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_SearchMetadata_NextResults, kn) { + currentKey = ffj_t_SearchMetadata_NextResults + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'q': + + if bytes.Equal(ffj_key_SearchMetadata_Query, kn) { + currentKey = ffj_t_SearchMetadata_Query + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_SearchMetadata_RefreshURL, kn) { + currentKey = ffj_t_SearchMetadata_RefreshURL + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_SearchMetadata_SinceID, kn) { + currentKey = ffj_t_SearchMetadata_SinceID + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_SearchMetadata_SinceIDStr, kn) { + currentKey = ffj_t_SearchMetadata_SinceIDStr + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_SearchMetadata_SinceIDStr, kn) { + currentKey = ffj_t_SearchMetadata_SinceIDStr + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_SearchMetadata_SinceID, kn) { + currentKey = ffj_t_SearchMetadata_SinceID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_SearchMetadata_RefreshURL, kn) { + currentKey = ffj_t_SearchMetadata_RefreshURL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_SearchMetadata_Query, kn) { + currentKey = ffj_t_SearchMetadata_Query + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_SearchMetadata_NextResults, kn) { + currentKey = ffj_t_SearchMetadata_NextResults + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_SearchMetadata_MaxIDStr, kn) { + currentKey = ffj_t_SearchMetadata_MaxIDStr + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_SearchMetadata_MaxID, kn) { + currentKey = ffj_t_SearchMetadata_MaxID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_SearchMetadata_Count, kn) { + currentKey = ffj_t_SearchMetadata_Count + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_SearchMetadata_CompletedIn, kn) { + currentKey = ffj_t_SearchMetadata_CompletedIn + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_SearchMetadatano_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_SearchMetadata_CompletedIn: + goto handle_CompletedIn + + case ffj_t_SearchMetadata_Count: + goto handle_Count + + case ffj_t_SearchMetadata_MaxID: + goto handle_MaxID + + case ffj_t_SearchMetadata_MaxIDStr: + goto handle_MaxIDStr + + case ffj_t_SearchMetadata_NextResults: + goto handle_NextResults + + case ffj_t_SearchMetadata_Query: + goto handle_Query + + case ffj_t_SearchMetadata_RefreshURL: + goto handle_RefreshURL + + case ffj_t_SearchMetadata_SinceID: + goto handle_SinceID + + case ffj_t_SearchMetadata_SinceIDStr: + goto handle_SinceIDStr + + case ffj_t_SearchMetadatano_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_CompletedIn: + + /* handler: uj.CompletedIn type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.CompletedIn = float64(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Count: + + /* handler: uj.Count type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Count = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MaxID: + + /* handler: uj.MaxID type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.MaxID = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MaxIDStr: + + /* handler: uj.MaxIDStr type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.MaxIDStr = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NextResults: + + /* handler: uj.NextResults type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.NextResults = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Query: + + /* handler: uj.Query type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Query = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_RefreshURL: + + /* handler: uj.RefreshURL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.RefreshURL = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_SinceID: + + /* handler: uj.SinceID type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.SinceID = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_SinceIDStr: + + /* handler: uj.SinceIDStr type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.SinceIDStr = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + return nil +} + +func (mj *Status) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Status) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + if mj.Contributors != nil { + buf.WriteString(`{"contributors":`) + fflib.WriteJsonString(buf, string(*mj.Contributors)) + } else { + buf.WriteString(`{"contributors":null`) + } + if mj.Coordinates != nil { + buf.WriteString(`,"coordinates":`) + fflib.WriteJsonString(buf, string(*mj.Coordinates)) + } else { + buf.WriteString(`,"coordinates":null`) + } + buf.WriteString(`,"created_at":`) + fflib.WriteJsonString(buf, string(mj.CreatedAt)) + buf.WriteString(`,"entities":`) + + { + + err = mj.Entities.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + if mj.Favorited { + buf.WriteString(`,"favorited":true`) + } else { + buf.WriteString(`,"favorited":false`) + } + if mj.Geo != nil { + buf.WriteString(`,"geo":`) + fflib.WriteJsonString(buf, string(*mj.Geo)) + } else { + buf.WriteString(`,"geo":null`) + } + buf.WriteString(`,"id":`) + fflib.FormatBits2(buf, uint64(mj.ID), 10, mj.ID < 0) + buf.WriteString(`,"id_str":`) + fflib.WriteJsonString(buf, string(mj.IDStr)) + if mj.InReplyToScreenName != nil { + buf.WriteString(`,"in_reply_to_screen_name":`) + fflib.WriteJsonString(buf, string(*mj.InReplyToScreenName)) + } else { + buf.WriteString(`,"in_reply_to_screen_name":null`) + } + if mj.InReplyToStatusID != nil { + buf.WriteString(`,"in_reply_to_status_id":`) + fflib.WriteJsonString(buf, string(*mj.InReplyToStatusID)) + } else { + buf.WriteString(`,"in_reply_to_status_id":null`) + } + if mj.InReplyToStatusIDStr != nil { + buf.WriteString(`,"in_reply_to_status_id_str":`) + fflib.WriteJsonString(buf, string(*mj.InReplyToStatusIDStr)) + } else { + buf.WriteString(`,"in_reply_to_status_id_str":null`) + } + if mj.InReplyToUserID != nil { + buf.WriteString(`,"in_reply_to_user_id":`) + fflib.WriteJsonString(buf, string(*mj.InReplyToUserID)) + } else { + buf.WriteString(`,"in_reply_to_user_id":null`) + } + if mj.InReplyToUserIDStr != nil { + buf.WriteString(`,"in_reply_to_user_id_str":`) + fflib.WriteJsonString(buf, string(*mj.InReplyToUserIDStr)) + } else { + buf.WriteString(`,"in_reply_to_user_id_str":null`) + } + buf.WriteString(`,"metadata":`) + + { + + err = mj.Metadata.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + if mj.Place != nil { + buf.WriteString(`,"place":`) + fflib.WriteJsonString(buf, string(*mj.Place)) + } else { + buf.WriteString(`,"place":null`) + } + buf.WriteString(`,"retweet_count":`) + fflib.FormatBits2(buf, uint64(mj.RetweetCount), 10, mj.RetweetCount < 0) + if mj.Retweeted { + buf.WriteString(`,"retweeted":true`) + } else { + buf.WriteString(`,"retweeted":false`) + } + buf.WriteString(`,"source":`) + fflib.WriteJsonString(buf, string(mj.Source)) + buf.WriteString(`,"text":`) + fflib.WriteJsonString(buf, string(mj.Text)) + if mj.Truncated { + buf.WriteString(`,"truncated":true`) + } else { + buf.WriteString(`,"truncated":false`) + } + buf.WriteString(`,"user":`) + + { + + err = mj.User.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Statusbase = iota + ffj_t_Statusno_such_key + + ffj_t_Status_Contributors + + ffj_t_Status_Coordinates + + ffj_t_Status_CreatedAt + + ffj_t_Status_Entities + + ffj_t_Status_Favorited + + ffj_t_Status_Geo + + ffj_t_Status_ID + + ffj_t_Status_IDStr + + ffj_t_Status_InReplyToScreenName + + ffj_t_Status_InReplyToStatusID + + ffj_t_Status_InReplyToStatusIDStr + + ffj_t_Status_InReplyToUserID + + ffj_t_Status_InReplyToUserIDStr + + ffj_t_Status_Metadata + + ffj_t_Status_Place + + ffj_t_Status_RetweetCount + + ffj_t_Status_Retweeted + + ffj_t_Status_Source + + ffj_t_Status_Text + + ffj_t_Status_Truncated + + ffj_t_Status_User +) + +var ffj_key_Status_Contributors = []byte("contributors") + +var ffj_key_Status_Coordinates = []byte("coordinates") + +var ffj_key_Status_CreatedAt = []byte("created_at") + +var ffj_key_Status_Entities = []byte("entities") + +var ffj_key_Status_Favorited = []byte("favorited") + +var ffj_key_Status_Geo = []byte("geo") + +var ffj_key_Status_ID = []byte("id") + +var ffj_key_Status_IDStr = []byte("id_str") + +var ffj_key_Status_InReplyToScreenName = []byte("in_reply_to_screen_name") + +var ffj_key_Status_InReplyToStatusID = []byte("in_reply_to_status_id") + +var ffj_key_Status_InReplyToStatusIDStr = []byte("in_reply_to_status_id_str") + +var ffj_key_Status_InReplyToUserID = []byte("in_reply_to_user_id") + +var ffj_key_Status_InReplyToUserIDStr = []byte("in_reply_to_user_id_str") + +var ffj_key_Status_Metadata = []byte("metadata") + +var ffj_key_Status_Place = []byte("place") + +var ffj_key_Status_RetweetCount = []byte("retweet_count") + +var ffj_key_Status_Retweeted = []byte("retweeted") + +var ffj_key_Status_Source = []byte("source") + +var ffj_key_Status_Text = []byte("text") + +var ffj_key_Status_Truncated = []byte("truncated") + +var ffj_key_Status_User = []byte("user") + +func (uj *Status) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Status) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Statusbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Statusno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Status_Contributors, kn) { + currentKey = ffj_t_Status_Contributors + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Status_Coordinates, kn) { + currentKey = ffj_t_Status_Coordinates + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Status_CreatedAt, kn) { + currentKey = ffj_t_Status_CreatedAt + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'e': + + if bytes.Equal(ffj_key_Status_Entities, kn) { + currentKey = ffj_t_Status_Entities + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'f': + + if bytes.Equal(ffj_key_Status_Favorited, kn) { + currentKey = ffj_t_Status_Favorited + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'g': + + if bytes.Equal(ffj_key_Status_Geo, kn) { + currentKey = ffj_t_Status_Geo + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_Status_ID, kn) { + currentKey = ffj_t_Status_ID + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Status_IDStr, kn) { + currentKey = ffj_t_Status_IDStr + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Status_InReplyToScreenName, kn) { + currentKey = ffj_t_Status_InReplyToScreenName + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Status_InReplyToStatusID, kn) { + currentKey = ffj_t_Status_InReplyToStatusID + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Status_InReplyToStatusIDStr, kn) { + currentKey = ffj_t_Status_InReplyToStatusIDStr + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Status_InReplyToUserID, kn) { + currentKey = ffj_t_Status_InReplyToUserID + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Status_InReplyToUserIDStr, kn) { + currentKey = ffj_t_Status_InReplyToUserIDStr + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'm': + + if bytes.Equal(ffj_key_Status_Metadata, kn) { + currentKey = ffj_t_Status_Metadata + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_Status_Place, kn) { + currentKey = ffj_t_Status_Place + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_Status_RetweetCount, kn) { + currentKey = ffj_t_Status_RetweetCount + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Status_Retweeted, kn) { + currentKey = ffj_t_Status_Retweeted + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Status_Source, kn) { + currentKey = ffj_t_Status_Source + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Status_Text, kn) { + currentKey = ffj_t_Status_Text + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Status_Truncated, kn) { + currentKey = ffj_t_Status_Truncated + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_Status_User, kn) { + currentKey = ffj_t_Status_User + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Status_User, kn) { + currentKey = ffj_t_Status_User + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Status_Truncated, kn) { + currentKey = ffj_t_Status_Truncated + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Status_Text, kn) { + currentKey = ffj_t_Status_Text + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Status_Source, kn) { + currentKey = ffj_t_Status_Source + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Status_Retweeted, kn) { + currentKey = ffj_t_Status_Retweeted + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Status_RetweetCount, kn) { + currentKey = ffj_t_Status_RetweetCount + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Status_Place, kn) { + currentKey = ffj_t_Status_Place + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Status_Metadata, kn) { + currentKey = ffj_t_Status_Metadata + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Status_InReplyToUserIDStr, kn) { + currentKey = ffj_t_Status_InReplyToUserIDStr + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Status_InReplyToUserID, kn) { + currentKey = ffj_t_Status_InReplyToUserID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Status_InReplyToStatusIDStr, kn) { + currentKey = ffj_t_Status_InReplyToStatusIDStr + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Status_InReplyToStatusID, kn) { + currentKey = ffj_t_Status_InReplyToStatusID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Status_InReplyToScreenName, kn) { + currentKey = ffj_t_Status_InReplyToScreenName + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Status_IDStr, kn) { + currentKey = ffj_t_Status_IDStr + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Status_ID, kn) { + currentKey = ffj_t_Status_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Status_Geo, kn) { + currentKey = ffj_t_Status_Geo + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Status_Favorited, kn) { + currentKey = ffj_t_Status_Favorited + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Status_Entities, kn) { + currentKey = ffj_t_Status_Entities + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Status_CreatedAt, kn) { + currentKey = ffj_t_Status_CreatedAt + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Status_Coordinates, kn) { + currentKey = ffj_t_Status_Coordinates + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Status_Contributors, kn) { + currentKey = ffj_t_Status_Contributors + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Statusno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Status_Contributors: + goto handle_Contributors + + case ffj_t_Status_Coordinates: + goto handle_Coordinates + + case ffj_t_Status_CreatedAt: + goto handle_CreatedAt + + case ffj_t_Status_Entities: + goto handle_Entities + + case ffj_t_Status_Favorited: + goto handle_Favorited + + case ffj_t_Status_Geo: + goto handle_Geo + + case ffj_t_Status_ID: + goto handle_ID + + case ffj_t_Status_IDStr: + goto handle_IDStr + + case ffj_t_Status_InReplyToScreenName: + goto handle_InReplyToScreenName + + case ffj_t_Status_InReplyToStatusID: + goto handle_InReplyToStatusID + + case ffj_t_Status_InReplyToStatusIDStr: + goto handle_InReplyToStatusIDStr + + case ffj_t_Status_InReplyToUserID: + goto handle_InReplyToUserID + + case ffj_t_Status_InReplyToUserIDStr: + goto handle_InReplyToUserIDStr + + case ffj_t_Status_Metadata: + goto handle_Metadata + + case ffj_t_Status_Place: + goto handle_Place + + case ffj_t_Status_RetweetCount: + goto handle_RetweetCount + + case ffj_t_Status_Retweeted: + goto handle_Retweeted + + case ffj_t_Status_Source: + goto handle_Source + + case ffj_t_Status_Text: + goto handle_Text + + case ffj_t_Status_Truncated: + goto handle_Truncated + + case ffj_t_Status_User: + goto handle_User + + case ffj_t_Statusno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Contributors: + + /* handler: uj.Contributors type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Contributors = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Contributors = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Coordinates: + + /* handler: uj.Coordinates type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Coordinates = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Coordinates = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CreatedAt: + + /* handler: uj.CreatedAt type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.CreatedAt = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Entities: + + /* handler: uj.Entities type=benchmark.Entities kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Entities.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Favorited: + + /* handler: uj.Favorited type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + } else { + tmpb := fs.Output.Bytes() + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + uj.Favorited = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + uj.Favorited = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Geo: + + /* handler: uj.Geo type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Geo = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Geo = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ID: + + /* handler: uj.ID type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.ID = int64(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IDStr: + + /* handler: uj.IDStr type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.IDStr = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InReplyToScreenName: + + /* handler: uj.InReplyToScreenName type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.InReplyToScreenName = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.InReplyToScreenName = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InReplyToStatusID: + + /* handler: uj.InReplyToStatusID type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.InReplyToStatusID = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.InReplyToStatusID = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InReplyToStatusIDStr: + + /* handler: uj.InReplyToStatusIDStr type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.InReplyToStatusIDStr = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.InReplyToStatusIDStr = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InReplyToUserID: + + /* handler: uj.InReplyToUserID type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.InReplyToUserID = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.InReplyToUserID = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InReplyToUserIDStr: + + /* handler: uj.InReplyToUserIDStr type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.InReplyToUserIDStr = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.InReplyToUserIDStr = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Metadata: + + /* handler: uj.Metadata type=benchmark.StatusMetadata kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Metadata.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Place: + + /* handler: uj.Place type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Place = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Place = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_RetweetCount: + + /* handler: uj.RetweetCount type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.RetweetCount = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Retweeted: + + /* handler: uj.Retweeted type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + } else { + tmpb := fs.Output.Bytes() + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + uj.Retweeted = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + uj.Retweeted = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Source: + + /* handler: uj.Source type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Source = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Text: + + /* handler: uj.Text type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Text = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Truncated: + + /* handler: uj.Truncated type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + } else { + tmpb := fs.Output.Bytes() + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + uj.Truncated = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + uj.Truncated = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_User: + + /* handler: uj.User type=benchmark.User kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.User.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + return nil +} + +func (mj *StatusMetadata) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *StatusMetadata) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"iso_language_code":`) + fflib.WriteJsonString(buf, string(mj.IsoLanguageCode)) + buf.WriteString(`,"result_type":`) + fflib.WriteJsonString(buf, string(mj.ResultType)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_StatusMetadatabase = iota + ffj_t_StatusMetadatano_such_key + + ffj_t_StatusMetadata_IsoLanguageCode + + ffj_t_StatusMetadata_ResultType +) + +var ffj_key_StatusMetadata_IsoLanguageCode = []byte("iso_language_code") + +var ffj_key_StatusMetadata_ResultType = []byte("result_type") + +func (uj *StatusMetadata) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *StatusMetadata) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_StatusMetadatabase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_StatusMetadatano_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'i': + + if bytes.Equal(ffj_key_StatusMetadata_IsoLanguageCode, kn) { + currentKey = ffj_t_StatusMetadata_IsoLanguageCode + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_StatusMetadata_ResultType, kn) { + currentKey = ffj_t_StatusMetadata_ResultType + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_StatusMetadata_ResultType, kn) { + currentKey = ffj_t_StatusMetadata_ResultType + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_StatusMetadata_IsoLanguageCode, kn) { + currentKey = ffj_t_StatusMetadata_IsoLanguageCode + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_StatusMetadatano_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_StatusMetadata_IsoLanguageCode: + goto handle_IsoLanguageCode + + case ffj_t_StatusMetadata_ResultType: + goto handle_ResultType + + case ffj_t_StatusMetadatano_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_IsoLanguageCode: + + /* handler: uj.IsoLanguageCode type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.IsoLanguageCode = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ResultType: + + /* handler: uj.ResultType type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.ResultType = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + return nil +} + +func (mj *URL) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *URL) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + if mj.ExpandedURL != nil { + buf.WriteString(`{"expanded_url":`) + fflib.WriteJsonString(buf, string(*mj.ExpandedURL)) + } else { + buf.WriteString(`{"expanded_url":null`) + } + buf.WriteString(`,"indices":`) + if mj.Indices != nil { + buf.WriteString(`[`) + for i, v := range mj.Indices { + if i != 0 { + buf.WriteString(`,`) + } + fflib.FormatBits2(buf, uint64(v), 10, v < 0) + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"url":`) + fflib.WriteJsonString(buf, string(mj.URL)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_URLbase = iota + ffj_t_URLno_such_key + + ffj_t_URL_ExpandedURL + + ffj_t_URL_Indices + + ffj_t_URL_URL +) + +var ffj_key_URL_ExpandedURL = []byte("expanded_url") + +var ffj_key_URL_Indices = []byte("indices") + +var ffj_key_URL_URL = []byte("url") + +func (uj *URL) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *URL) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_URLbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_URLno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'e': + + if bytes.Equal(ffj_key_URL_ExpandedURL, kn) { + currentKey = ffj_t_URL_ExpandedURL + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_URL_Indices, kn) { + currentKey = ffj_t_URL_Indices + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_URL_URL, kn) { + currentKey = ffj_t_URL_URL + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_URL_URL, kn) { + currentKey = ffj_t_URL_URL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_URL_Indices, kn) { + currentKey = ffj_t_URL_Indices + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_URL_ExpandedURL, kn) { + currentKey = ffj_t_URL_ExpandedURL + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_URLno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_URL_ExpandedURL: + goto handle_ExpandedURL + + case ffj_t_URL_Indices: + goto handle_Indices + + case ffj_t_URL_URL: + goto handle_URL + + case ffj_t_URLno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ExpandedURL: + + /* handler: uj.ExpandedURL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.ExpandedURL = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.ExpandedURL = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Indices: + + /* handler: uj.Indices type=[]int kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Indices = nil + } else { + + uj.Indices = make([]int, 0) + + wantVal := true + + for { + + var tmp_uj__Indices int + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Indices type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + tmp_uj__Indices = int(tval) + + } + } + + uj.Indices = append(uj.Indices, tmp_uj__Indices) + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_URL: + + /* handler: uj.URL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.URL = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + return nil +} + +func (mj *User) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *User) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + if mj.ContributorsEnabled { + buf.WriteString(`{"contributors_enabled":true`) + } else { + buf.WriteString(`{"contributors_enabled":false`) + } + buf.WriteString(`,"created_at":`) + fflib.WriteJsonString(buf, string(mj.CreatedAt)) + if mj.DefaultProfile { + buf.WriteString(`,"default_profile":true`) + } else { + buf.WriteString(`,"default_profile":false`) + } + if mj.DefaultProfileImage { + buf.WriteString(`,"default_profile_image":true`) + } else { + buf.WriteString(`,"default_profile_image":false`) + } + buf.WriteString(`,"description":`) + fflib.WriteJsonString(buf, string(mj.Description)) + buf.WriteString(`,"entities":`) + + { + + err = mj.Entities.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"favourites_count":`) + fflib.FormatBits2(buf, uint64(mj.FavouritesCount), 10, mj.FavouritesCount < 0) + if mj.FollowRequestSent != nil { + buf.WriteString(`,"follow_request_sent":`) + fflib.WriteJsonString(buf, string(*mj.FollowRequestSent)) + } else { + buf.WriteString(`,"follow_request_sent":null`) + } + buf.WriteString(`,"followers_count":`) + fflib.FormatBits2(buf, uint64(mj.FollowersCount), 10, mj.FollowersCount < 0) + if mj.Following != nil { + buf.WriteString(`,"following":`) + fflib.WriteJsonString(buf, string(*mj.Following)) + } else { + buf.WriteString(`,"following":null`) + } + buf.WriteString(`,"friends_count":`) + fflib.FormatBits2(buf, uint64(mj.FriendsCount), 10, mj.FriendsCount < 0) + if mj.GeoEnabled { + buf.WriteString(`,"geo_enabled":true`) + } else { + buf.WriteString(`,"geo_enabled":false`) + } + buf.WriteString(`,"id":`) + fflib.FormatBits2(buf, uint64(mj.ID), 10, mj.ID < 0) + buf.WriteString(`,"id_str":`) + fflib.WriteJsonString(buf, string(mj.IDStr)) + if mj.IsTranslator { + buf.WriteString(`,"is_translator":true`) + } else { + buf.WriteString(`,"is_translator":false`) + } + buf.WriteString(`,"lang":`) + fflib.WriteJsonString(buf, string(mj.Lang)) + buf.WriteString(`,"listed_count":`) + fflib.FormatBits2(buf, uint64(mj.ListedCount), 10, mj.ListedCount < 0) + buf.WriteString(`,"location":`) + fflib.WriteJsonString(buf, string(mj.Location)) + buf.WriteString(`,"name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + if mj.Notifications != nil { + buf.WriteString(`,"notifications":`) + fflib.WriteJsonString(buf, string(*mj.Notifications)) + } else { + buf.WriteString(`,"notifications":null`) + } + buf.WriteString(`,"profile_background_color":`) + fflib.WriteJsonString(buf, string(mj.ProfileBackgroundColor)) + buf.WriteString(`,"profile_background_image_url":`) + fflib.WriteJsonString(buf, string(mj.ProfileBackgroundImageURL)) + buf.WriteString(`,"profile_background_image_url_https":`) + fflib.WriteJsonString(buf, string(mj.ProfileBackgroundImageURLHTTPS)) + if mj.ProfileBackgroundTile { + buf.WriteString(`,"profile_background_tile":true`) + } else { + buf.WriteString(`,"profile_background_tile":false`) + } + buf.WriteString(`,"profile_image_url":`) + fflib.WriteJsonString(buf, string(mj.ProfileImageURL)) + buf.WriteString(`,"profile_image_url_https":`) + fflib.WriteJsonString(buf, string(mj.ProfileImageURLHTTPS)) + buf.WriteString(`,"profile_link_color":`) + fflib.WriteJsonString(buf, string(mj.ProfileLinkColor)) + buf.WriteString(`,"profile_sidebar_border_color":`) + fflib.WriteJsonString(buf, string(mj.ProfileSidebarBorderColor)) + buf.WriteString(`,"profile_sidebar_fill_color":`) + fflib.WriteJsonString(buf, string(mj.ProfileSidebarFillColor)) + buf.WriteString(`,"profile_text_color":`) + fflib.WriteJsonString(buf, string(mj.ProfileTextColor)) + if mj.ProfileUseBackgroundImage { + buf.WriteString(`,"profile_use_background_image":true`) + } else { + buf.WriteString(`,"profile_use_background_image":false`) + } + if mj.Protected { + buf.WriteString(`,"protected":true`) + } else { + buf.WriteString(`,"protected":false`) + } + buf.WriteString(`,"screen_name":`) + fflib.WriteJsonString(buf, string(mj.ScreenName)) + if mj.ShowAllInlineMedia { + buf.WriteString(`,"show_all_inline_media":true`) + } else { + buf.WriteString(`,"show_all_inline_media":false`) + } + buf.WriteString(`,"statuses_count":`) + fflib.FormatBits2(buf, uint64(mj.StatusesCount), 10, mj.StatusesCount < 0) + buf.WriteString(`,"time_zone":`) + fflib.WriteJsonString(buf, string(mj.TimeZone)) + if mj.URL != nil { + buf.WriteString(`,"url":`) + fflib.WriteJsonString(buf, string(*mj.URL)) + } else { + buf.WriteString(`,"url":null`) + } + buf.WriteString(`,"utc_offset":`) + fflib.FormatBits2(buf, uint64(mj.UtcOffset), 10, mj.UtcOffset < 0) + if mj.Verified { + buf.WriteString(`,"verified":true`) + } else { + buf.WriteString(`,"verified":false`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Userbase = iota + ffj_t_Userno_such_key + + ffj_t_User_ContributorsEnabled + + ffj_t_User_CreatedAt + + ffj_t_User_DefaultProfile + + ffj_t_User_DefaultProfileImage + + ffj_t_User_Description + + ffj_t_User_Entities + + ffj_t_User_FavouritesCount + + ffj_t_User_FollowRequestSent + + ffj_t_User_FollowersCount + + ffj_t_User_Following + + ffj_t_User_FriendsCount + + ffj_t_User_GeoEnabled + + ffj_t_User_ID + + ffj_t_User_IDStr + + ffj_t_User_IsTranslator + + ffj_t_User_Lang + + ffj_t_User_ListedCount + + ffj_t_User_Location + + ffj_t_User_Name + + ffj_t_User_Notifications + + ffj_t_User_ProfileBackgroundColor + + ffj_t_User_ProfileBackgroundImageURL + + ffj_t_User_ProfileBackgroundImageURLHTTPS + + ffj_t_User_ProfileBackgroundTile + + ffj_t_User_ProfileImageURL + + ffj_t_User_ProfileImageURLHTTPS + + ffj_t_User_ProfileLinkColor + + ffj_t_User_ProfileSidebarBorderColor + + ffj_t_User_ProfileSidebarFillColor + + ffj_t_User_ProfileTextColor + + ffj_t_User_ProfileUseBackgroundImage + + ffj_t_User_Protected + + ffj_t_User_ScreenName + + ffj_t_User_ShowAllInlineMedia + + ffj_t_User_StatusesCount + + ffj_t_User_TimeZone + + ffj_t_User_URL + + ffj_t_User_UtcOffset + + ffj_t_User_Verified +) + +var ffj_key_User_ContributorsEnabled = []byte("contributors_enabled") + +var ffj_key_User_CreatedAt = []byte("created_at") + +var ffj_key_User_DefaultProfile = []byte("default_profile") + +var ffj_key_User_DefaultProfileImage = []byte("default_profile_image") + +var ffj_key_User_Description = []byte("description") + +var ffj_key_User_Entities = []byte("entities") + +var ffj_key_User_FavouritesCount = []byte("favourites_count") + +var ffj_key_User_FollowRequestSent = []byte("follow_request_sent") + +var ffj_key_User_FollowersCount = []byte("followers_count") + +var ffj_key_User_Following = []byte("following") + +var ffj_key_User_FriendsCount = []byte("friends_count") + +var ffj_key_User_GeoEnabled = []byte("geo_enabled") + +var ffj_key_User_ID = []byte("id") + +var ffj_key_User_IDStr = []byte("id_str") + +var ffj_key_User_IsTranslator = []byte("is_translator") + +var ffj_key_User_Lang = []byte("lang") + +var ffj_key_User_ListedCount = []byte("listed_count") + +var ffj_key_User_Location = []byte("location") + +var ffj_key_User_Name = []byte("name") + +var ffj_key_User_Notifications = []byte("notifications") + +var ffj_key_User_ProfileBackgroundColor = []byte("profile_background_color") + +var ffj_key_User_ProfileBackgroundImageURL = []byte("profile_background_image_url") + +var ffj_key_User_ProfileBackgroundImageURLHTTPS = []byte("profile_background_image_url_https") + +var ffj_key_User_ProfileBackgroundTile = []byte("profile_background_tile") + +var ffj_key_User_ProfileImageURL = []byte("profile_image_url") + +var ffj_key_User_ProfileImageURLHTTPS = []byte("profile_image_url_https") + +var ffj_key_User_ProfileLinkColor = []byte("profile_link_color") + +var ffj_key_User_ProfileSidebarBorderColor = []byte("profile_sidebar_border_color") + +var ffj_key_User_ProfileSidebarFillColor = []byte("profile_sidebar_fill_color") + +var ffj_key_User_ProfileTextColor = []byte("profile_text_color") + +var ffj_key_User_ProfileUseBackgroundImage = []byte("profile_use_background_image") + +var ffj_key_User_Protected = []byte("protected") + +var ffj_key_User_ScreenName = []byte("screen_name") + +var ffj_key_User_ShowAllInlineMedia = []byte("show_all_inline_media") + +var ffj_key_User_StatusesCount = []byte("statuses_count") + +var ffj_key_User_TimeZone = []byte("time_zone") + +var ffj_key_User_URL = []byte("url") + +var ffj_key_User_UtcOffset = []byte("utc_offset") + +var ffj_key_User_Verified = []byte("verified") + +func (uj *User) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *User) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Userbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Userno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_User_ContributorsEnabled, kn) { + currentKey = ffj_t_User_ContributorsEnabled + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_CreatedAt, kn) { + currentKey = ffj_t_User_CreatedAt + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_User_DefaultProfile, kn) { + currentKey = ffj_t_User_DefaultProfile + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_DefaultProfileImage, kn) { + currentKey = ffj_t_User_DefaultProfileImage + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_Description, kn) { + currentKey = ffj_t_User_Description + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'e': + + if bytes.Equal(ffj_key_User_Entities, kn) { + currentKey = ffj_t_User_Entities + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'f': + + if bytes.Equal(ffj_key_User_FavouritesCount, kn) { + currentKey = ffj_t_User_FavouritesCount + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_FollowRequestSent, kn) { + currentKey = ffj_t_User_FollowRequestSent + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_FollowersCount, kn) { + currentKey = ffj_t_User_FollowersCount + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_Following, kn) { + currentKey = ffj_t_User_Following + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_FriendsCount, kn) { + currentKey = ffj_t_User_FriendsCount + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'g': + + if bytes.Equal(ffj_key_User_GeoEnabled, kn) { + currentKey = ffj_t_User_GeoEnabled + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_User_ID, kn) { + currentKey = ffj_t_User_ID + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_IDStr, kn) { + currentKey = ffj_t_User_IDStr + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_IsTranslator, kn) { + currentKey = ffj_t_User_IsTranslator + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_User_Lang, kn) { + currentKey = ffj_t_User_Lang + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_ListedCount, kn) { + currentKey = ffj_t_User_ListedCount + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_Location, kn) { + currentKey = ffj_t_User_Location + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_User_Name, kn) { + currentKey = ffj_t_User_Name + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_Notifications, kn) { + currentKey = ffj_t_User_Notifications + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_User_ProfileBackgroundColor, kn) { + currentKey = ffj_t_User_ProfileBackgroundColor + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_ProfileBackgroundImageURL, kn) { + currentKey = ffj_t_User_ProfileBackgroundImageURL + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_ProfileBackgroundImageURLHTTPS, kn) { + currentKey = ffj_t_User_ProfileBackgroundImageURLHTTPS + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_ProfileBackgroundTile, kn) { + currentKey = ffj_t_User_ProfileBackgroundTile + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_ProfileImageURL, kn) { + currentKey = ffj_t_User_ProfileImageURL + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_ProfileImageURLHTTPS, kn) { + currentKey = ffj_t_User_ProfileImageURLHTTPS + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_ProfileLinkColor, kn) { + currentKey = ffj_t_User_ProfileLinkColor + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_ProfileSidebarBorderColor, kn) { + currentKey = ffj_t_User_ProfileSidebarBorderColor + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_ProfileSidebarFillColor, kn) { + currentKey = ffj_t_User_ProfileSidebarFillColor + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_ProfileTextColor, kn) { + currentKey = ffj_t_User_ProfileTextColor + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_ProfileUseBackgroundImage, kn) { + currentKey = ffj_t_User_ProfileUseBackgroundImage + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_Protected, kn) { + currentKey = ffj_t_User_Protected + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_User_ScreenName, kn) { + currentKey = ffj_t_User_ScreenName + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_ShowAllInlineMedia, kn) { + currentKey = ffj_t_User_ShowAllInlineMedia + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_StatusesCount, kn) { + currentKey = ffj_t_User_StatusesCount + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_User_TimeZone, kn) { + currentKey = ffj_t_User_TimeZone + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_User_URL, kn) { + currentKey = ffj_t_User_URL + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_User_UtcOffset, kn) { + currentKey = ffj_t_User_UtcOffset + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_User_Verified, kn) { + currentKey = ffj_t_User_Verified + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_User_Verified, kn) { + currentKey = ffj_t_User_Verified + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_UtcOffset, kn) { + currentKey = ffj_t_User_UtcOffset + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_User_URL, kn) { + currentKey = ffj_t_User_URL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_User_TimeZone, kn) { + currentKey = ffj_t_User_TimeZone + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_StatusesCount, kn) { + currentKey = ffj_t_User_StatusesCount + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_ShowAllInlineMedia, kn) { + currentKey = ffj_t_User_ShowAllInlineMedia + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_ScreenName, kn) { + currentKey = ffj_t_User_ScreenName + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_User_Protected, kn) { + currentKey = ffj_t_User_Protected + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_ProfileUseBackgroundImage, kn) { + currentKey = ffj_t_User_ProfileUseBackgroundImage + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_User_ProfileTextColor, kn) { + currentKey = ffj_t_User_ProfileTextColor + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_ProfileSidebarFillColor, kn) { + currentKey = ffj_t_User_ProfileSidebarFillColor + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_ProfileSidebarBorderColor, kn) { + currentKey = ffj_t_User_ProfileSidebarBorderColor + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_ProfileLinkColor, kn) { + currentKey = ffj_t_User_ProfileLinkColor + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_ProfileImageURLHTTPS, kn) { + currentKey = ffj_t_User_ProfileImageURLHTTPS + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_User_ProfileImageURL, kn) { + currentKey = ffj_t_User_ProfileImageURL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_ProfileBackgroundTile, kn) { + currentKey = ffj_t_User_ProfileBackgroundTile + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_ProfileBackgroundImageURLHTTPS, kn) { + currentKey = ffj_t_User_ProfileBackgroundImageURLHTTPS + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_ProfileBackgroundImageURL, kn) { + currentKey = ffj_t_User_ProfileBackgroundImageURL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_ProfileBackgroundColor, kn) { + currentKey = ffj_t_User_ProfileBackgroundColor + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_Notifications, kn) { + currentKey = ffj_t_User_Notifications + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_User_Name, kn) { + currentKey = ffj_t_User_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_User_Location, kn) { + currentKey = ffj_t_User_Location + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_ListedCount, kn) { + currentKey = ffj_t_User_ListedCount + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_User_Lang, kn) { + currentKey = ffj_t_User_Lang + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_IsTranslator, kn) { + currentKey = ffj_t_User_IsTranslator + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_IDStr, kn) { + currentKey = ffj_t_User_IDStr + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_User_ID, kn) { + currentKey = ffj_t_User_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_User_GeoEnabled, kn) { + currentKey = ffj_t_User_GeoEnabled + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_FriendsCount, kn) { + currentKey = ffj_t_User_FriendsCount + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_User_Following, kn) { + currentKey = ffj_t_User_Following + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_FollowersCount, kn) { + currentKey = ffj_t_User_FollowersCount + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_FollowRequestSent, kn) { + currentKey = ffj_t_User_FollowRequestSent + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_FavouritesCount, kn) { + currentKey = ffj_t_User_FavouritesCount + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_Entities, kn) { + currentKey = ffj_t_User_Entities + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_Description, kn) { + currentKey = ffj_t_User_Description + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_User_DefaultProfileImage, kn) { + currentKey = ffj_t_User_DefaultProfileImage + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_User_DefaultProfile, kn) { + currentKey = ffj_t_User_DefaultProfile + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_User_CreatedAt, kn) { + currentKey = ffj_t_User_CreatedAt + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_User_ContributorsEnabled, kn) { + currentKey = ffj_t_User_ContributorsEnabled + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Userno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_User_ContributorsEnabled: + goto handle_ContributorsEnabled + + case ffj_t_User_CreatedAt: + goto handle_CreatedAt + + case ffj_t_User_DefaultProfile: + goto handle_DefaultProfile + + case ffj_t_User_DefaultProfileImage: + goto handle_DefaultProfileImage + + case ffj_t_User_Description: + goto handle_Description + + case ffj_t_User_Entities: + goto handle_Entities + + case ffj_t_User_FavouritesCount: + goto handle_FavouritesCount + + case ffj_t_User_FollowRequestSent: + goto handle_FollowRequestSent + + case ffj_t_User_FollowersCount: + goto handle_FollowersCount + + case ffj_t_User_Following: + goto handle_Following + + case ffj_t_User_FriendsCount: + goto handle_FriendsCount + + case ffj_t_User_GeoEnabled: + goto handle_GeoEnabled + + case ffj_t_User_ID: + goto handle_ID + + case ffj_t_User_IDStr: + goto handle_IDStr + + case ffj_t_User_IsTranslator: + goto handle_IsTranslator + + case ffj_t_User_Lang: + goto handle_Lang + + case ffj_t_User_ListedCount: + goto handle_ListedCount + + case ffj_t_User_Location: + goto handle_Location + + case ffj_t_User_Name: + goto handle_Name + + case ffj_t_User_Notifications: + goto handle_Notifications + + case ffj_t_User_ProfileBackgroundColor: + goto handle_ProfileBackgroundColor + + case ffj_t_User_ProfileBackgroundImageURL: + goto handle_ProfileBackgroundImageURL + + case ffj_t_User_ProfileBackgroundImageURLHTTPS: + goto handle_ProfileBackgroundImageURLHTTPS + + case ffj_t_User_ProfileBackgroundTile: + goto handle_ProfileBackgroundTile + + case ffj_t_User_ProfileImageURL: + goto handle_ProfileImageURL + + case ffj_t_User_ProfileImageURLHTTPS: + goto handle_ProfileImageURLHTTPS + + case ffj_t_User_ProfileLinkColor: + goto handle_ProfileLinkColor + + case ffj_t_User_ProfileSidebarBorderColor: + goto handle_ProfileSidebarBorderColor + + case ffj_t_User_ProfileSidebarFillColor: + goto handle_ProfileSidebarFillColor + + case ffj_t_User_ProfileTextColor: + goto handle_ProfileTextColor + + case ffj_t_User_ProfileUseBackgroundImage: + goto handle_ProfileUseBackgroundImage + + case ffj_t_User_Protected: + goto handle_Protected + + case ffj_t_User_ScreenName: + goto handle_ScreenName + + case ffj_t_User_ShowAllInlineMedia: + goto handle_ShowAllInlineMedia + + case ffj_t_User_StatusesCount: + goto handle_StatusesCount + + case ffj_t_User_TimeZone: + goto handle_TimeZone + + case ffj_t_User_URL: + goto handle_URL + + case ffj_t_User_UtcOffset: + goto handle_UtcOffset + + case ffj_t_User_Verified: + goto handle_Verified + + case ffj_t_Userno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ContributorsEnabled: + + /* handler: uj.ContributorsEnabled type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + } else { + tmpb := fs.Output.Bytes() + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + uj.ContributorsEnabled = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + uj.ContributorsEnabled = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CreatedAt: + + /* handler: uj.CreatedAt type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.CreatedAt = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_DefaultProfile: + + /* handler: uj.DefaultProfile type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + } else { + tmpb := fs.Output.Bytes() + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + uj.DefaultProfile = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + uj.DefaultProfile = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_DefaultProfileImage: + + /* handler: uj.DefaultProfileImage type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + } else { + tmpb := fs.Output.Bytes() + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + uj.DefaultProfileImage = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + uj.DefaultProfileImage = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Description: + + /* handler: uj.Description type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Description = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Entities: + + /* handler: uj.Entities type=benchmark.UserEntities kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Entities.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_FavouritesCount: + + /* handler: uj.FavouritesCount type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.FavouritesCount = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_FollowRequestSent: + + /* handler: uj.FollowRequestSent type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.FollowRequestSent = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.FollowRequestSent = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_FollowersCount: + + /* handler: uj.FollowersCount type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.FollowersCount = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Following: + + /* handler: uj.Following type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Following = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Following = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_FriendsCount: + + /* handler: uj.FriendsCount type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.FriendsCount = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GeoEnabled: + + /* handler: uj.GeoEnabled type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + } else { + tmpb := fs.Output.Bytes() + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + uj.GeoEnabled = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + uj.GeoEnabled = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ID: + + /* handler: uj.ID type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.ID = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IDStr: + + /* handler: uj.IDStr type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.IDStr = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IsTranslator: + + /* handler: uj.IsTranslator type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + } else { + tmpb := fs.Output.Bytes() + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + uj.IsTranslator = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + uj.IsTranslator = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Lang: + + /* handler: uj.Lang type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Lang = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ListedCount: + + /* handler: uj.ListedCount type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.ListedCount = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Location: + + /* handler: uj.Location type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Location = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Notifications: + + /* handler: uj.Notifications type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Notifications = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Notifications = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ProfileBackgroundColor: + + /* handler: uj.ProfileBackgroundColor type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.ProfileBackgroundColor = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ProfileBackgroundImageURL: + + /* handler: uj.ProfileBackgroundImageURL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.ProfileBackgroundImageURL = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ProfileBackgroundImageURLHTTPS: + + /* handler: uj.ProfileBackgroundImageURLHTTPS type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.ProfileBackgroundImageURLHTTPS = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ProfileBackgroundTile: + + /* handler: uj.ProfileBackgroundTile type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + } else { + tmpb := fs.Output.Bytes() + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + uj.ProfileBackgroundTile = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + uj.ProfileBackgroundTile = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ProfileImageURL: + + /* handler: uj.ProfileImageURL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.ProfileImageURL = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ProfileImageURLHTTPS: + + /* handler: uj.ProfileImageURLHTTPS type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.ProfileImageURLHTTPS = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ProfileLinkColor: + + /* handler: uj.ProfileLinkColor type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.ProfileLinkColor = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ProfileSidebarBorderColor: + + /* handler: uj.ProfileSidebarBorderColor type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.ProfileSidebarBorderColor = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ProfileSidebarFillColor: + + /* handler: uj.ProfileSidebarFillColor type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.ProfileSidebarFillColor = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ProfileTextColor: + + /* handler: uj.ProfileTextColor type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.ProfileTextColor = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ProfileUseBackgroundImage: + + /* handler: uj.ProfileUseBackgroundImage type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + } else { + tmpb := fs.Output.Bytes() + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + uj.ProfileUseBackgroundImage = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + uj.ProfileUseBackgroundImage = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Protected: + + /* handler: uj.Protected type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + } else { + tmpb := fs.Output.Bytes() + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + uj.Protected = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + uj.Protected = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ScreenName: + + /* handler: uj.ScreenName type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.ScreenName = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ShowAllInlineMedia: + + /* handler: uj.ShowAllInlineMedia type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + } else { + tmpb := fs.Output.Bytes() + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + uj.ShowAllInlineMedia = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + uj.ShowAllInlineMedia = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_StatusesCount: + + /* handler: uj.StatusesCount type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.StatusesCount = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_TimeZone: + + /* handler: uj.TimeZone type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.TimeZone = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_URL: + + /* handler: uj.URL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.URL = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.URL = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_UtcOffset: + + /* handler: uj.UtcOffset type=int kind=int quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.UtcOffset = int(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Verified: + + /* handler: uj.Verified type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + } else { + tmpb := fs.Output.Bytes() + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + uj.Verified = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + uj.Verified = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + return nil +} + +func (mj *UserEntities) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *UserEntities) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"description":`) + + { + + err = mj.Description.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"url":`) + + { + + err = mj.URL.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_UserEntitiesbase = iota + ffj_t_UserEntitiesno_such_key + + ffj_t_UserEntities_Description + + ffj_t_UserEntities_URL +) + +var ffj_key_UserEntities_Description = []byte("description") + +var ffj_key_UserEntities_URL = []byte("url") + +func (uj *UserEntities) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *UserEntities) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_UserEntitiesbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_UserEntitiesno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'd': + + if bytes.Equal(ffj_key_UserEntities_Description, kn) { + currentKey = ffj_t_UserEntities_Description + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_UserEntities_URL, kn) { + currentKey = ffj_t_UserEntities_URL + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_UserEntities_URL, kn) { + currentKey = ffj_t_UserEntities_URL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_UserEntities_Description, kn) { + currentKey = ffj_t_UserEntities_Description + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_UserEntitiesno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_UserEntities_Description: + goto handle_Description + + case ffj_t_UserEntities_URL: + goto handle_URL + + case ffj_t_UserEntitiesno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Description: + + /* handler: uj.Description type=benchmark.UserEntityDescription kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Description.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_URL: + + /* handler: uj.URL type=benchmark.UserEntityURL kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.URL.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + return nil +} + +func (mj *UserEntityDescription) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *UserEntityDescription) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"urls":`) + if mj.Urls != nil { + buf.WriteString(`[`) + for i, v := range mj.Urls { + if i != 0 { + buf.WriteString(`,`) + } + if v != nil { + fflib.WriteJsonString(buf, string(*v)) + } else { + buf.WriteString(`null`) + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_UserEntityDescriptionbase = iota + ffj_t_UserEntityDescriptionno_such_key + + ffj_t_UserEntityDescription_Urls +) + +var ffj_key_UserEntityDescription_Urls = []byte("urls") + +func (uj *UserEntityDescription) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *UserEntityDescription) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_UserEntityDescriptionbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_UserEntityDescriptionno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'u': + + if bytes.Equal(ffj_key_UserEntityDescription_Urls, kn) { + currentKey = ffj_t_UserEntityDescription_Urls + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_UserEntityDescription_Urls, kn) { + currentKey = ffj_t_UserEntityDescription_Urls + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_UserEntityDescriptionno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_UserEntityDescription_Urls: + goto handle_Urls + + case ffj_t_UserEntityDescriptionno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Urls: + + /* handler: uj.Urls type=[]*string kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Urls = nil + } else { + + uj.Urls = make([]*string, 0) + + wantVal := true + + for { + + var tmp_uj__Urls *string + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Urls type=*string kind=ptr quoted=false*/ + + { + + if tok == fflib.FFTok_null { + tmp_uj__Urls = nil + } else { + if tmp_uj__Urls == nil { + tmp_uj__Urls = new(string) + } + + /* handler: tmp_uj__Urls type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + tmp_uj__Urls = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + tmp_uj__Urls = &tval + + } + } + + } + } + + uj.Urls = append(uj.Urls, tmp_uj__Urls) + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + return nil +} + +func (mj *UserEntityURL) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *UserEntityURL) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"urls":`) + if mj.Urls != nil { + buf.WriteString(`[`) + for i, v := range mj.Urls { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_UserEntityURLbase = iota + ffj_t_UserEntityURLno_such_key + + ffj_t_UserEntityURL_Urls +) + +var ffj_key_UserEntityURL_Urls = []byte("urls") + +func (uj *UserEntityURL) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *UserEntityURL) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_UserEntityURLbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_UserEntityURLno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'u': + + if bytes.Equal(ffj_key_UserEntityURL_Urls, kn) { + currentKey = ffj_t_UserEntityURL_Urls + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_UserEntityURL_Urls, kn) { + currentKey = ffj_t_UserEntityURL_Urls + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_UserEntityURLno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_UserEntityURL_Urls: + goto handle_Urls + + case ffj_t_UserEntityURLno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Urls: + + /* handler: uj.Urls type=[]benchmark.URL kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Urls = nil + } else { + + uj.Urls = make([]URL, 0) + + wantVal := true + + for { + + var tmp_uj__Urls URL + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Urls type=benchmark.URL kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Urls.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Urls = append(uj.Urls, tmp_uj__Urls) + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + return nil +} + +func (mj *XLStruct) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *XLStruct) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"Data":`) + if mj.Data != nil { + buf.WriteString(`[`) + for i, v := range mj.Data { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_XLStructbase = iota + ffj_t_XLStructno_such_key + + ffj_t_XLStruct_Data +) + +var ffj_key_XLStruct_Data = []byte("Data") + +func (uj *XLStruct) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *XLStruct) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_XLStructbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_XLStructno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'D': + + if bytes.Equal(ffj_key_XLStruct_Data, kn) { + currentKey = ffj_t_XLStruct_Data + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_XLStruct_Data, kn) { + currentKey = ffj_t_XLStruct_Data + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_XLStructno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_XLStruct_Data: + goto handle_Data + + case ffj_t_XLStructno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Data: + + /* handler: uj.Data type=[]benchmark.LargeStruct kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Data = nil + } else { + + uj.Data = make([]LargeStruct, 0) + + wantVal := true + + for { + + var tmp_uj__Data LargeStruct + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Data type=benchmark.LargeStruct kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Data.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Data = append(uj.Data, tmp_uj__Data) + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + return nil +} diff --git a/vendor/github.com/mailru/easyjson/benchmark/data_var.go b/vendor/github.com/mailru/easyjson/benchmark/data_var.go new file mode 100644 index 0000000000..ea4202dbe2 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/benchmark/data_var.go @@ -0,0 +1,350 @@ +package benchmark + +var largeStructData = LargeStruct{ + SearchMetadata: SearchMetadata{ + CompletedIn: 0.035, + Count: 4, + MaxID: 250126199840518145, + MaxIDStr: "250126199840518145", + NextResults: "?max_id=249279667666817023&q=%23freebandnames&count=4&include_entities=1&result_type=mixed", + Query: "%23freebandnames", + RefreshURL: "?since_id=250126199840518145&q=%23freebandnames&result_type=mixed&include_entities=1", + SinceID: 24012619984051000, + SinceIDStr: "24012619984051000", + }, + Statuses: []Status{ + { + Contributors: nil, + Coordinates: nil, + CreatedAt: "Mon Sep 24 03:35:21 +0000 2012", + Entities: Entities{ + Hashtags: []Hashtag{{ + Indices: []int{20, 34}, + Text: "freebandnames"}, + }, + Urls: []*string{}, + UserMentions: []*string{}, + }, + Favorited: false, + Geo: nil, + ID: 250075927172759552, + IDStr: "250075927172759552", + InReplyToScreenName: nil, + InReplyToStatusID: nil, + InReplyToStatusIDStr: nil, + InReplyToUserID: nil, + InReplyToUserIDStr: nil, + Metadata: StatusMetadata{ + IsoLanguageCode: "en", + ResultType: "recent", + }, + Place: nil, + RetweetCount: 0, + Retweeted: false, + Source: "Twitter for Mac", + Text: "Aggressive Ponytail #freebandnames", + Truncated: false, + User: User{ + ContributorsEnabled: false, + CreatedAt: "Mon Apr 26 06:01:55 +0000 2010", + DefaultProfile: true, + DefaultProfileImage: false, + Description: "Born 330 Live 310", + Entities: UserEntities{ + Description: UserEntityDescription{ + Urls: []*string{}, + }, + URL: UserEntityURL{ + Urls: []URL{{ + ExpandedURL: nil, + Indices: []int{0, 0}, + URL: "", + }}, + }, + }, + FavouritesCount: 0, + FollowRequestSent: nil, + FollowersCount: 70, + Following: nil, + FriendsCount: 110, + GeoEnabled: true, + ID: 137238150, + IDStr: "137238150", + IsTranslator: false, + Lang: "en", + ListedCount: 2, + Location: "LA, CA", + Name: "Sean Cummings", + Notifications: nil, + ProfileBackgroundColor: "C0DEED", + ProfileBackgroundImageURL: "http://a0.twimg.com/images/themes/theme1/bg.png", + ProfileBackgroundImageURLHTTPS: "https://si0.twimg.com/images/themes/theme1/bg.png", + ProfileBackgroundTile: false, + ProfileImageURL: "http://a0.twimg.com/profile_images/2359746665/1v6zfgqo8g0d3mk7ii5s_normal.jpeg", + ProfileImageURLHTTPS: "https://si0.twimg.com/profile_images/2359746665/1v6zfgqo8g0d3mk7ii5s_normal.jpeg", + ProfileLinkColor: "0084B4", + ProfileSidebarBorderColor: "C0DEED", + ProfileSidebarFillColor: "DDEEF6", + ProfileTextColor: "333333", + ProfileUseBackgroundImage: true, + Protected: false, + ScreenName: "sean_cummings", + ShowAllInlineMedia: false, + StatusesCount: 579, + TimeZone: "Pacific Time (US & Canada)", + URL: nil, + UtcOffset: -28800, + Verified: false, + }, + }, + { + Contributors: nil, + Coordinates: nil, + CreatedAt: "Fri Sep 21 23:40:54 +0000 2012", + Entities: Entities{ + Hashtags: []Hashtag{{ + Indices: []int{20, 34}, + Text: "FreeBandNames", + }}, + Urls: []*string{}, + UserMentions: []*string{}, + }, + Favorited: false, + Geo: nil, + ID: 249292149810667520, + IDStr: "249292149810667520", + InReplyToScreenName: nil, + InReplyToStatusID: nil, + InReplyToStatusIDStr: nil, + InReplyToUserID: nil, + InReplyToUserIDStr: nil, + Metadata: StatusMetadata{ + IsoLanguageCode: "pl", + ResultType: "recent", + }, + Place: nil, + RetweetCount: 0, + Retweeted: false, + Source: "web", + Text: "Thee Namaste Nerdz. #FreeBandNames", + Truncated: false, + User: User{ + ContributorsEnabled: false, + CreatedAt: "Tue Apr 07 19:05:07 +0000 2009", + DefaultProfile: false, + DefaultProfileImage: false, + Description: "You will come to Durham, North Carolina. I will sell you some records then, here in Durham, North Carolina. Fun will happen.", + Entities: UserEntities{ + Description: UserEntityDescription{Urls: []*string{}}, + URL: UserEntityURL{ + Urls: []URL{{ + ExpandedURL: nil, + Indices: []int{0, 32}, + URL: "http://bullcityrecords.com/wnng/"}}, + }, + }, + FavouritesCount: 8, + FollowRequestSent: nil, + FollowersCount: 2052, + Following: nil, + FriendsCount: 348, + GeoEnabled: false, + ID: 29516238, + IDStr: "29516238", + IsTranslator: false, + Lang: "en", + ListedCount: 118, + Location: "Durham, NC", + Name: "Chaz Martenstein", + Notifications: nil, + ProfileBackgroundColor: "9AE4E8", + ProfileBackgroundImageURL: "http://a0.twimg.com/profile_background_images/9423277/background_tile.bmp", + ProfileBackgroundImageURLHTTPS: "https://si0.twimg.com/profile_background_images/9423277/background_tile.bmp", + ProfileBackgroundTile: true, + ProfileImageURL: "http://a0.twimg.com/profile_images/447958234/Lichtenstein_normal.jpg", + ProfileImageURLHTTPS: "https://si0.twimg.com/profile_images/447958234/Lichtenstein_normal.jpg", + ProfileLinkColor: "0084B4", + ProfileSidebarBorderColor: "BDDCAD", + ProfileSidebarFillColor: "DDFFCC", + ProfileTextColor: "333333", + ProfileUseBackgroundImage: true, + Protected: false, + ScreenName: "bullcityrecords", + ShowAllInlineMedia: true, + StatusesCount: 7579, + TimeZone: "Eastern Time (US & Canada)", + URL: nil, + UtcOffset: -18000, + Verified: false, + }, + }, + Status{ + Contributors: nil, + Coordinates: nil, + CreatedAt: "Fri Sep 21 23:30:20 +0000 2012", + Entities: Entities{ + Hashtags: []Hashtag{{ + Indices: []int{29, 43}, + Text: "freebandnames", + }}, + Urls: []*string{}, + UserMentions: []*string{}, + }, + Favorited: false, + Geo: nil, + ID: 249289491129438208, + IDStr: "249289491129438208", + InReplyToScreenName: nil, + InReplyToStatusID: nil, + InReplyToStatusIDStr: nil, + InReplyToUserID: nil, + InReplyToUserIDStr: nil, + Metadata: StatusMetadata{ + IsoLanguageCode: "en", + ResultType: "recent", + }, + Place: nil, + RetweetCount: 0, + Retweeted: false, + Source: "web", + Text: "Mexican Heaven, Mexican Hell #freebandnames", + Truncated: false, + User: User{ + ContributorsEnabled: false, + CreatedAt: "Tue Sep 01 21:21:35 +0000 2009", + DefaultProfile: false, + DefaultProfileImage: false, + Description: "Science Fiction Writer, sort of. Likes Superheroes, Mole People, Alt. Timelines.", + Entities: UserEntities{ + Description: UserEntityDescription{ + Urls: nil, + }, + URL: UserEntityURL{ + Urls: []URL{{ + ExpandedURL: nil, + Indices: []int{0, 0}, + URL: "", + }}, + }, + }, + FavouritesCount: 19, + FollowRequestSent: nil, + FollowersCount: 63, + Following: nil, + FriendsCount: 63, + GeoEnabled: false, + ID: 70789458, + IDStr: "70789458", + IsTranslator: false, + Lang: "en", + ListedCount: 1, + Location: "Kingston New York", + Name: "Thomas John Wakeman", + Notifications: nil, + ProfileBackgroundColor: "352726", + ProfileBackgroundImageURL: "http://a0.twimg.com/images/themes/theme5/bg.gif", + ProfileBackgroundImageURLHTTPS: "https://si0.twimg.com/images/themes/theme5/bg.gif", + ProfileBackgroundTile: false, + ProfileImageURL: "http://a0.twimg.com/profile_images/2219333930/Froggystyle_normal.png", + ProfileImageURLHTTPS: "https://si0.twimg.com/profile_images/2219333930/Froggystyle_normal.png", + ProfileLinkColor: "D02B55", + ProfileSidebarBorderColor: "829D5E", + ProfileSidebarFillColor: "99CC33", + ProfileTextColor: "3E4415", + ProfileUseBackgroundImage: true, + Protected: false, + ScreenName: "MonkiesFist", + ShowAllInlineMedia: false, + StatusesCount: 1048, + TimeZone: "Eastern Time (US & Canada)", + URL: nil, + UtcOffset: -18000, + Verified: false, + }, + }, + Status{ + Contributors: nil, + Coordinates: nil, + CreatedAt: "Fri Sep 21 22:51:18 +0000 2012", + Entities: Entities{ + Hashtags: []Hashtag{{ + Indices: []int{20, 34}, + Text: "freebandnames", + }}, + Urls: []*string{}, + UserMentions: []*string{}, + }, + Favorited: false, + Geo: nil, + ID: 249279667666817024, + IDStr: "249279667666817024", + InReplyToScreenName: nil, + InReplyToStatusID: nil, + InReplyToStatusIDStr: nil, + InReplyToUserID: nil, + InReplyToUserIDStr: nil, + Metadata: StatusMetadata{ + IsoLanguageCode: "en", + ResultType: "recent", + }, + Place: nil, + RetweetCount: 0, + Retweeted: false, + Source: "Twitter for iPhone", + Text: "The Foolish Mortals #freebandnames", + Truncated: false, + User: User{ + ContributorsEnabled: false, + CreatedAt: "Mon May 04 00:05:00 +0000 2009", + DefaultProfile: false, + DefaultProfileImage: false, + Description: "Cartoonist, Illustrator, and T-Shirt connoisseur", + Entities: UserEntities{ + Description: UserEntityDescription{ + Urls: []*string{}, + }, + URL: UserEntityURL{ + Urls: []URL{{ + ExpandedURL: nil, + Indices: []int{0, 24}, + URL: "http://www.omnitarian.me", + }}, + }, + }, + FavouritesCount: 647, + FollowRequestSent: nil, + FollowersCount: 608, + Following: nil, + FriendsCount: 249, + GeoEnabled: false, + ID: 37539828, + IDStr: "37539828", + IsTranslator: false, + Lang: "en", + ListedCount: 52, + Location: "Wisconsin, USA", + Name: "Marty Elmer", + Notifications: nil, + ProfileBackgroundColor: "EEE3C4", + ProfileBackgroundImageURL: "http://a0.twimg.com/profile_background_images/106455659/rect6056-9.png", + ProfileBackgroundImageURLHTTPS: "https://si0.twimg.com/profile_background_images/106455659/rect6056-9.png", + ProfileBackgroundTile: true, + ProfileImageURL: "http://a0.twimg.com/profile_images/1629790393/shrinker_2000_trans_normal.png", + ProfileImageURLHTTPS: "https://si0.twimg.com/profile_images/1629790393/shrinker_2000_trans_normal.png", + ProfileLinkColor: "3B2A26", + ProfileSidebarBorderColor: "615A44", + ProfileSidebarFillColor: "BFAC83", + ProfileTextColor: "000000", + ProfileUseBackgroundImage: true, + Protected: false, + ScreenName: "Omnitarian", + ShowAllInlineMedia: true, + StatusesCount: 3575, + TimeZone: "Central Time (US & Canada)", + URL: nil, + UtcOffset: -21600, + Verified: false, + }, + }, + }, +} diff --git a/vendor/github.com/mailru/easyjson/benchmark/example.json b/vendor/github.com/mailru/easyjson/benchmark/example.json new file mode 100644 index 0000000000..2405022cf4 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/benchmark/example.json @@ -0,0 +1,415 @@ +{ + "statuses": [ + { + "coordinates": null, + "favorited": false, + "truncated": false, + "created_at": "Mon Sep 24 03:35:21 +0000 2012", + "id_str": "250075927172759552", + "entities": { + "urls": [ + + ], + "hashtags": [ + { + "text": "freebandnames", + "indices": [ + 20, + 34 + ] + } + ], + "user_mentions": [ + + ] + }, + "in_reply_to_user_id_str": null, + "contributors": null, + "text": "Aggressive Ponytail #freebandnames", + "metadata": { + "iso_language_code": "en", + "result_type": "recent" + }, + "retweet_count": 0, + "in_reply_to_status_id_str": null, + "id": 250075927172759552, + "geo": null, + "retweeted": false, + "in_reply_to_user_id": null, + "place": null, + "user": { + "profile_sidebar_fill_color": "DDEEF6", + "profile_sidebar_border_color": "C0DEED", + "profile_background_tile": false, + "name": "Sean Cummings", + "profile_image_url": "http://a0.twimg.com/profile_images/2359746665/1v6zfgqo8g0d3mk7ii5s_normal.jpeg", + "created_at": "Mon Apr 26 06:01:55 +0000 2010", + "location": "LA, CA", + "follow_request_sent": null, + "profile_link_color": "0084B4", + "is_translator": false, + "id_str": "137238150", + "entities": { + "url": { + "urls": [ + { + "expanded_url": null, + "url": "", + "indices": [ + 0, + 0 + ] + } + ] + }, + "description": { + "urls": [ + + ] + } + }, + "default_profile": true, + "contributors_enabled": false, + "favourites_count": 0, + "url": null, + "profile_image_url_https": "https://si0.twimg.com/profile_images/2359746665/1v6zfgqo8g0d3mk7ii5s_normal.jpeg", + "utc_offset": -28800, + "id": 137238150, + "profile_use_background_image": true, + "listed_count": 2, + "profile_text_color": "333333", + "lang": "en", + "followers_count": 70, + "protected": false, + "notifications": null, + "profile_background_image_url_https": "https://si0.twimg.com/images/themes/theme1/bg.png", + "profile_background_color": "C0DEED", + "verified": false, + "geo_enabled": true, + "time_zone": "Pacific Time (US & Canada)", + "description": "Born 330 Live 310", + "default_profile_image": false, + "profile_background_image_url": "http://a0.twimg.com/images/themes/theme1/bg.png", + "statuses_count": 579, + "friends_count": 110, + "following": null, + "show_all_inline_media": false, + "screen_name": "sean_cummings" + }, + "in_reply_to_screen_name": null, + "source": "Twitter for Mac", + "in_reply_to_status_id": null + }, + { + "coordinates": null, + "favorited": false, + "truncated": false, + "created_at": "Fri Sep 21 23:40:54 +0000 2012", + "id_str": "249292149810667520", + "entities": { + "urls": [ + + ], + "hashtags": [ + { + "text": "FreeBandNames", + "indices": [ + 20, + 34 + ] + } + ], + "user_mentions": [ + + ] + }, + "in_reply_to_user_id_str": null, + "contributors": null, + "text": "Thee Namaste Nerdz. #FreeBandNames", + "metadata": { + "iso_language_code": "pl", + "result_type": "recent" + }, + "retweet_count": 0, + "in_reply_to_status_id_str": null, + "id": 249292149810667520, + "geo": null, + "retweeted": false, + "in_reply_to_user_id": null, + "place": null, + "user": { + "profile_sidebar_fill_color": "DDFFCC", + "profile_sidebar_border_color": "BDDCAD", + "profile_background_tile": true, + "name": "Chaz Martenstein", + "profile_image_url": "http://a0.twimg.com/profile_images/447958234/Lichtenstein_normal.jpg", + "created_at": "Tue Apr 07 19:05:07 +0000 2009", + "location": "Durham, NC", + "follow_request_sent": null, + "profile_link_color": "0084B4", + "is_translator": false, + "id_str": "29516238", + "entities": { + "url": { + "urls": [ + { + "expanded_url": null, + "url": "http://bullcityrecords.com/wnng/", + "indices": [ + 0, + 32 + ] + } + ] + }, + "description": { + "urls": [ + + ] + } + }, + "default_profile": false, + "contributors_enabled": false, + "favourites_count": 8, + "url": "http://bullcityrecords.com/wnng/", + "profile_image_url_https": "https://si0.twimg.com/profile_images/447958234/Lichtenstein_normal.jpg", + "utc_offset": -18000, + "id": 29516238, + "profile_use_background_image": true, + "listed_count": 118, + "profile_text_color": "333333", + "lang": "en", + "followers_count": 2052, + "protected": false, + "notifications": null, + "profile_background_image_url_https": "https://si0.twimg.com/profile_background_images/9423277/background_tile.bmp", + "profile_background_color": "9AE4E8", + "verified": false, + "geo_enabled": false, + "time_zone": "Eastern Time (US & Canada)", + "description": "You will come to Durham, North Carolina. I will sell you some records then, here in Durham, North Carolina. Fun will happen.", + "default_profile_image": false, + "profile_background_image_url": "http://a0.twimg.com/profile_background_images/9423277/background_tile.bmp", + "statuses_count": 7579, + "friends_count": 348, + "following": null, + "show_all_inline_media": true, + "screen_name": "bullcityrecords" + }, + "in_reply_to_screen_name": null, + "source": "web", + "in_reply_to_status_id": null + }, + { + "coordinates": null, + "favorited": false, + "truncated": false, + "created_at": "Fri Sep 21 23:30:20 +0000 2012", + "id_str": "249289491129438208", + "entities": { + "urls": [ + + ], + "hashtags": [ + { + "text": "freebandnames", + "indices": [ + 29, + 43 + ] + } + ], + "user_mentions": [ + + ] + }, + "in_reply_to_user_id_str": null, + "contributors": null, + "text": "Mexican Heaven, Mexican Hell #freebandnames", + "metadata": { + "iso_language_code": "en", + "result_type": "recent" + }, + "retweet_count": 0, + "in_reply_to_status_id_str": null, + "id": 249289491129438208, + "geo": null, + "retweeted": false, + "in_reply_to_user_id": null, + "place": null, + "user": { + "profile_sidebar_fill_color": "99CC33", + "profile_sidebar_border_color": "829D5E", + "profile_background_tile": false, + "name": "Thomas John Wakeman", + "profile_image_url": "http://a0.twimg.com/profile_images/2219333930/Froggystyle_normal.png", + "created_at": "Tue Sep 01 21:21:35 +0000 2009", + "location": "Kingston New York", + "follow_request_sent": null, + "profile_link_color": "D02B55", + "is_translator": false, + "id_str": "70789458", + "entities": { + "url": { + "urls": [ + { + "expanded_url": null, + "url": "", + "indices": [ + 0, + 0 + ] + } + ] + }, + "description": { + "urls": [ + + ] + } + }, + "default_profile": false, + "contributors_enabled": false, + "favourites_count": 19, + "url": null, + "profile_image_url_https": "https://si0.twimg.com/profile_images/2219333930/Froggystyle_normal.png", + "utc_offset": -18000, + "id": 70789458, + "profile_use_background_image": true, + "listed_count": 1, + "profile_text_color": "3E4415", + "lang": "en", + "followers_count": 63, + "protected": false, + "notifications": null, + "profile_background_image_url_https": "https://si0.twimg.com/images/themes/theme5/bg.gif", + "profile_background_color": "352726", + "verified": false, + "geo_enabled": false, + "time_zone": "Eastern Time (US & Canada)", + "description": "Science Fiction Writer, sort of. Likes Superheroes, Mole People, Alt. Timelines.", + "default_profile_image": false, + "profile_background_image_url": "http://a0.twimg.com/images/themes/theme5/bg.gif", + "statuses_count": 1048, + "friends_count": 63, + "following": null, + "show_all_inline_media": false, + "screen_name": "MonkiesFist" + }, + "in_reply_to_screen_name": null, + "source": "web", + "in_reply_to_status_id": null + }, + { + "coordinates": null, + "favorited": false, + "truncated": false, + "created_at": "Fri Sep 21 22:51:18 +0000 2012", + "id_str": "249279667666817024", + "entities": { + "urls": [ + + ], + "hashtags": [ + { + "text": "freebandnames", + "indices": [ + 20, + 34 + ] + } + ], + "user_mentions": [ + + ] + }, + "in_reply_to_user_id_str": null, + "contributors": null, + "text": "The Foolish Mortals #freebandnames", + "metadata": { + "iso_language_code": "en", + "result_type": "recent" + }, + "retweet_count": 0, + "in_reply_to_status_id_str": null, + "id": 249279667666817024, + "geo": null, + "retweeted": false, + "in_reply_to_user_id": null, + "place": null, + "user": { + "profile_sidebar_fill_color": "BFAC83", + "profile_sidebar_border_color": "615A44", + "profile_background_tile": true, + "name": "Marty Elmer", + "profile_image_url": "http://a0.twimg.com/profile_images/1629790393/shrinker_2000_trans_normal.png", + "created_at": "Mon May 04 00:05:00 +0000 2009", + "location": "Wisconsin, USA", + "follow_request_sent": null, + "profile_link_color": "3B2A26", + "is_translator": false, + "id_str": "37539828", + "entities": { + "url": { + "urls": [ + { + "expanded_url": null, + "url": "http://www.omnitarian.me", + "indices": [ + 0, + 24 + ] + } + ] + }, + "description": { + "urls": [ + + ] + } + }, + "default_profile": false, + "contributors_enabled": false, + "favourites_count": 647, + "url": "http://www.omnitarian.me", + "profile_image_url_https": "https://si0.twimg.com/profile_images/1629790393/shrinker_2000_trans_normal.png", + "utc_offset": -21600, + "id": 37539828, + "profile_use_background_image": true, + "listed_count": 52, + "profile_text_color": "000000", + "lang": "en", + "followers_count": 608, + "protected": false, + "notifications": null, + "profile_background_image_url_https": "https://si0.twimg.com/profile_background_images/106455659/rect6056-9.png", + "profile_background_color": "EEE3C4", + "verified": false, + "geo_enabled": false, + "time_zone": "Central Time (US & Canada)", + "description": "Cartoonist, Illustrator, and T-Shirt connoisseur", + "default_profile_image": false, + "profile_background_image_url": "http://a0.twimg.com/profile_background_images/106455659/rect6056-9.png", + "statuses_count": 3575, + "friends_count": 249, + "following": null, + "show_all_inline_media": true, + "screen_name": "Omnitarian" + }, + "in_reply_to_screen_name": null, + "source": "Twitter for iPhone", + "in_reply_to_status_id": null + } + ], + "search_metadata": { + "max_id": 250126199840518145, + "since_id": 24012619984051000, + "refresh_url": "?since_id=250126199840518145&q=%23freebandnames&result_type=mixed&include_entities=1", + "next_results": "?max_id=249279667666817023&q=%23freebandnames&count=4&include_entities=1&result_type=mixed", + "count": 4, + "completed_in": 0.035, + "since_id_str": "24012619984051000", + "query": "%23freebandnames", + "max_id_str": "250126199840518145" + } +} diff --git a/vendor/github.com/mailru/easyjson/benchmark/ujson.sh b/vendor/github.com/mailru/easyjson/benchmark/ujson.sh new file mode 100755 index 0000000000..378e7df464 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/benchmark/ujson.sh @@ -0,0 +1,7 @@ +#/bin/bash + +echo -n "Python ujson module, DECODE: " +python -m timeit -s "import ujson; data = open('`dirname $0`/example.json', 'r').read()" 'ujson.loads(data)' + +echo -n "Python ujson module, ENCODE: " +python -m timeit -s "import ujson; data = open('`dirname $0`/example.json', 'r').read(); obj = ujson.loads(data)" 'ujson.dumps(obj)' diff --git a/vendor/github.com/mailru/easyjson/bootstrap/bootstrap.go b/vendor/github.com/mailru/easyjson/bootstrap/bootstrap.go new file mode 100644 index 0000000000..a461bf15ee --- /dev/null +++ b/vendor/github.com/mailru/easyjson/bootstrap/bootstrap.go @@ -0,0 +1,193 @@ +// Package bootstrap implements the bootstrapping logic: generation of a .go file to +// launch the actual generator and launching the generator itself. +// +// The package may be preferred to a command-line utility if generating the serializers +// from golang code is required. +package bootstrap + +import ( + "fmt" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "sort" +) + +const genPackage = "github.com/mailru/easyjson/gen" +const pkgWriter = "github.com/mailru/easyjson/jwriter" +const pkgLexer = "github.com/mailru/easyjson/jlexer" + +type Generator struct { + PkgPath, PkgName string + Types []string + + NoStdMarshalers bool + SnakeCase bool + LowerCamelCase bool + OmitEmpty bool + DisallowUnknownFields bool + + OutName string + BuildTags string + + StubsOnly bool + LeaveTemps bool + NoFormat bool +} + +// writeStub outputs an initial stub for marshalers/unmarshalers so that the package +// using marshalers/unmarshales compiles correctly for boostrapping code. +func (g *Generator) writeStub() error { + f, err := os.Create(g.OutName) + if err != nil { + return err + } + defer f.Close() + + if g.BuildTags != "" { + fmt.Fprintln(f, "// +build ", g.BuildTags) + fmt.Fprintln(f) + } + fmt.Fprintln(f, "// TEMPORARY AUTOGENERATED FILE: easyjson stub code to make the package") + fmt.Fprintln(f, "// compilable during generation.") + fmt.Fprintln(f) + fmt.Fprintln(f, "package ", g.PkgName) + + if len(g.Types) > 0 { + fmt.Fprintln(f) + fmt.Fprintln(f, "import (") + fmt.Fprintln(f, ` "`+pkgWriter+`"`) + fmt.Fprintln(f, ` "`+pkgLexer+`"`) + fmt.Fprintln(f, ")") + } + + sort.Strings(g.Types) + for _, t := range g.Types { + fmt.Fprintln(f) + if !g.NoStdMarshalers { + fmt.Fprintln(f, "func (", t, ") MarshalJSON() ([]byte, error) { return nil, nil }") + fmt.Fprintln(f, "func (*", t, ") UnmarshalJSON([]byte) error { return nil }") + } + + fmt.Fprintln(f, "func (", t, ") MarshalEasyJSON(w *jwriter.Writer) {}") + fmt.Fprintln(f, "func (*", t, ") UnmarshalEasyJSON(l *jlexer.Lexer) {}") + fmt.Fprintln(f) + fmt.Fprintln(f, "type EasyJSON_exporter_"+t+" *"+t) + } + return nil +} + +// writeMain creates a .go file that launches the generator if 'go run'. +func (g *Generator) writeMain() (path string, err error) { + f, err := ioutil.TempFile(filepath.Dir(g.OutName), "easyjson-bootstrap") + if err != nil { + return "", err + } + + fmt.Fprintln(f, "// +build ignore") + fmt.Fprintln(f) + fmt.Fprintln(f, "// TEMPORARY AUTOGENERATED FILE: easyjson bootstapping code to launch") + fmt.Fprintln(f, "// the actual generator.") + fmt.Fprintln(f) + fmt.Fprintln(f, "package main") + fmt.Fprintln(f) + fmt.Fprintln(f, "import (") + fmt.Fprintln(f, ` "fmt"`) + fmt.Fprintln(f, ` "os"`) + fmt.Fprintln(f) + fmt.Fprintf(f, " %q\n", genPackage) + if len(g.Types) > 0 { + fmt.Fprintln(f) + fmt.Fprintf(f, " pkg %q\n", g.PkgPath) + } + fmt.Fprintln(f, ")") + fmt.Fprintln(f) + fmt.Fprintln(f, "func main() {") + fmt.Fprintf(f, " g := gen.NewGenerator(%q)\n", filepath.Base(g.OutName)) + fmt.Fprintf(f, " g.SetPkg(%q, %q)\n", g.PkgName, g.PkgPath) + if g.BuildTags != "" { + fmt.Fprintf(f, " g.SetBuildTags(%q)\n", g.BuildTags) + } + if g.SnakeCase { + fmt.Fprintln(f, " g.UseSnakeCase()") + } + if g.LowerCamelCase { + fmt.Fprintln(f, " g.UseLowerCamelCase()") + } + if g.OmitEmpty { + fmt.Fprintln(f, " g.OmitEmpty()") + } + if g.NoStdMarshalers { + fmt.Fprintln(f, " g.NoStdMarshalers()") + } + if g.DisallowUnknownFields { + fmt.Fprintln(f, " g.DisallowUnknownFields()") + } + + sort.Strings(g.Types) + for _, v := range g.Types { + fmt.Fprintln(f, " g.Add(pkg.EasyJSON_exporter_"+v+"(nil))") + } + + fmt.Fprintln(f, " if err := g.Run(os.Stdout); err != nil {") + fmt.Fprintln(f, " fmt.Fprintln(os.Stderr, err)") + fmt.Fprintln(f, " os.Exit(1)") + fmt.Fprintln(f, " }") + fmt.Fprintln(f, "}") + + src := f.Name() + if err := f.Close(); err != nil { + return src, err + } + + dest := src + ".go" + return dest, os.Rename(src, dest) +} + +func (g *Generator) Run() error { + if err := g.writeStub(); err != nil { + return err + } + if g.StubsOnly { + return nil + } + + path, err := g.writeMain() + if err != nil { + return err + } + if !g.LeaveTemps { + defer os.Remove(path) + } + + f, err := os.Create(g.OutName + ".tmp") + if err != nil { + return err + } + if !g.LeaveTemps { + defer os.Remove(f.Name()) // will not remove after rename + } + + cmd := exec.Command("go", "run", "-tags", g.BuildTags, filepath.Base(path)) + cmd.Stdout = f + cmd.Stderr = os.Stderr + cmd.Dir = filepath.Dir(path) + if err = cmd.Run(); err != nil { + return err + } + + f.Close() + + if !g.NoFormat { + cmd = exec.Command("gofmt", "-w", f.Name()) + cmd.Stderr = os.Stderr + cmd.Stdout = os.Stdout + + if err = cmd.Run(); err != nil { + return err + } + } + + return os.Rename(f.Name(), g.OutName) +} diff --git a/vendor/github.com/mailru/easyjson/buffer/pool.go b/vendor/github.com/mailru/easyjson/buffer/pool.go new file mode 100644 index 0000000000..07fb4bc1f7 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/buffer/pool.go @@ -0,0 +1,270 @@ +// Package buffer implements a buffer for serialization, consisting of a chain of []byte-s to +// reduce copying and to allow reuse of individual chunks. +package buffer + +import ( + "io" + "sync" +) + +// PoolConfig contains configuration for the allocation and reuse strategy. +type PoolConfig struct { + StartSize int // Minimum chunk size that is allocated. + PooledSize int // Minimum chunk size that is reused, reusing chunks too small will result in overhead. + MaxSize int // Maximum chunk size that will be allocated. +} + +var config = PoolConfig{ + StartSize: 128, + PooledSize: 512, + MaxSize: 32768, +} + +// Reuse pool: chunk size -> pool. +var buffers = map[int]*sync.Pool{} + +func initBuffers() { + for l := config.PooledSize; l <= config.MaxSize; l *= 2 { + buffers[l] = new(sync.Pool) + } +} + +func init() { + initBuffers() +} + +// Init sets up a non-default pooling and allocation strategy. Should be run before serialization is done. +func Init(cfg PoolConfig) { + config = cfg + initBuffers() +} + +// putBuf puts a chunk to reuse pool if it can be reused. +func putBuf(buf []byte) { + size := cap(buf) + if size < config.PooledSize { + return + } + if c := buffers[size]; c != nil { + c.Put(buf[:0]) + } +} + +// getBuf gets a chunk from reuse pool or creates a new one if reuse failed. +func getBuf(size int) []byte { + if size < config.PooledSize { + return make([]byte, 0, size) + } + + if c := buffers[size]; c != nil { + v := c.Get() + if v != nil { + return v.([]byte) + } + } + return make([]byte, 0, size) +} + +// Buffer is a buffer optimized for serialization without extra copying. +type Buffer struct { + + // Buf is the current chunk that can be used for serialization. + Buf []byte + + toPool []byte + bufs [][]byte +} + +// EnsureSpace makes sure that the current chunk contains at least s free bytes, +// possibly creating a new chunk. +func (b *Buffer) EnsureSpace(s int) { + if cap(b.Buf)-len(b.Buf) >= s { + return + } + l := len(b.Buf) + if l > 0 { + if cap(b.toPool) != cap(b.Buf) { + // Chunk was reallocated, toPool can be pooled. + putBuf(b.toPool) + } + if cap(b.bufs) == 0 { + b.bufs = make([][]byte, 0, 8) + } + b.bufs = append(b.bufs, b.Buf) + l = cap(b.toPool) * 2 + } else { + l = config.StartSize + } + + if l > config.MaxSize { + l = config.MaxSize + } + b.Buf = getBuf(l) + b.toPool = b.Buf +} + +// AppendByte appends a single byte to buffer. +func (b *Buffer) AppendByte(data byte) { + if cap(b.Buf) == len(b.Buf) { // EnsureSpace won't be inlined. + b.EnsureSpace(1) + } + b.Buf = append(b.Buf, data) +} + +// AppendBytes appends a byte slice to buffer. +func (b *Buffer) AppendBytes(data []byte) { + for len(data) > 0 { + if cap(b.Buf) == len(b.Buf) { // EnsureSpace won't be inlined. + b.EnsureSpace(1) + } + + sz := cap(b.Buf) - len(b.Buf) + if sz > len(data) { + sz = len(data) + } + + b.Buf = append(b.Buf, data[:sz]...) + data = data[sz:] + } +} + +// AppendBytes appends a string to buffer. +func (b *Buffer) AppendString(data string) { + for len(data) > 0 { + if cap(b.Buf) == len(b.Buf) { // EnsureSpace won't be inlined. + b.EnsureSpace(1) + } + + sz := cap(b.Buf) - len(b.Buf) + if sz > len(data) { + sz = len(data) + } + + b.Buf = append(b.Buf, data[:sz]...) + data = data[sz:] + } +} + +// Size computes the size of a buffer by adding sizes of every chunk. +func (b *Buffer) Size() int { + size := len(b.Buf) + for _, buf := range b.bufs { + size += len(buf) + } + return size +} + +// DumpTo outputs the contents of a buffer to a writer and resets the buffer. +func (b *Buffer) DumpTo(w io.Writer) (written int, err error) { + var n int + for _, buf := range b.bufs { + if err == nil { + n, err = w.Write(buf) + written += n + } + putBuf(buf) + } + + if err == nil { + n, err = w.Write(b.Buf) + written += n + } + putBuf(b.toPool) + + b.bufs = nil + b.Buf = nil + b.toPool = nil + + return +} + +// BuildBytes creates a single byte slice with all the contents of the buffer. Data is +// copied if it does not fit in a single chunk. You can optionally provide one byte +// slice as argument that it will try to reuse. +func (b *Buffer) BuildBytes(reuse ...[]byte) []byte { + if len(b.bufs) == 0 { + ret := b.Buf + b.toPool = nil + b.Buf = nil + return ret + } + + var ret []byte + size := b.Size() + + // If we got a buffer as argument and it is big enought, reuse it. + if len(reuse) == 1 && cap(reuse[0]) >= size { + ret = reuse[0][:0] + } else { + ret = make([]byte, 0, size) + } + for _, buf := range b.bufs { + ret = append(ret, buf...) + putBuf(buf) + } + + ret = append(ret, b.Buf...) + putBuf(b.toPool) + + b.bufs = nil + b.toPool = nil + b.Buf = nil + + return ret +} + +type readCloser struct { + offset int + bufs [][]byte +} + +func (r *readCloser) Read(p []byte) (n int, err error) { + for _, buf := range r.bufs { + // Copy as much as we can. + x := copy(p[n:], buf[r.offset:]) + n += x // Increment how much we filled. + + // Did we empty the whole buffer? + if r.offset+x == len(buf) { + // On to the next buffer. + r.offset = 0 + r.bufs = r.bufs[1:] + + // We can release this buffer. + putBuf(buf) + } else { + r.offset += x + } + + if n == len(p) { + break + } + } + // No buffers left or nothing read? + if len(r.bufs) == 0 { + err = io.EOF + } + return +} + +func (r *readCloser) Close() error { + // Release all remaining buffers. + for _, buf := range r.bufs { + putBuf(buf) + } + // In case Close gets called multiple times. + r.bufs = nil + + return nil +} + +// ReadCloser creates an io.ReadCloser with all the contents of the buffer. +func (b *Buffer) ReadCloser() io.ReadCloser { + ret := &readCloser{0, append(b.bufs, b.Buf)} + + b.bufs = nil + b.toPool = nil + b.Buf = nil + + return ret +} diff --git a/vendor/github.com/mailru/easyjson/easyjson/main.go b/vendor/github.com/mailru/easyjson/easyjson/main.go new file mode 100644 index 0000000000..d4035f76fc --- /dev/null +++ b/vendor/github.com/mailru/easyjson/easyjson/main.go @@ -0,0 +1,108 @@ +package main + +import ( + "errors" + "flag" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/mailru/easyjson/bootstrap" + // Reference the gen package to be friendly to vendoring tools, + // as it is an indirect dependency. + // (The temporary bootstrapping code uses it.) + _ "github.com/mailru/easyjson/gen" + "github.com/mailru/easyjson/parser" +) + +var buildTags = flag.String("build_tags", "", "build tags to add to generated file") +var snakeCase = flag.Bool("snake_case", false, "use snake_case names instead of CamelCase by default") +var lowerCamelCase = flag.Bool("lower_camel_case", false, "use lowerCamelCase names instead of CamelCase by default") +var noStdMarshalers = flag.Bool("no_std_marshalers", false, "don't generate MarshalJSON/UnmarshalJSON funcs") +var omitEmpty = flag.Bool("omit_empty", false, "omit empty fields by default") +var allStructs = flag.Bool("all", false, "generate marshaler/unmarshalers for all structs in a file") +var leaveTemps = flag.Bool("leave_temps", false, "do not delete temporary files") +var stubs = flag.Bool("stubs", false, "only generate stubs for marshaler/unmarshaler funcs") +var noformat = flag.Bool("noformat", false, "do not run 'gofmt -w' on output file") +var specifiedName = flag.String("output_filename", "", "specify the filename of the output") +var processPkg = flag.Bool("pkg", false, "process the whole package instead of just the given file") +var disallowUnknownFields = flag.Bool("disallow_unknown_fields", false, "return error if any unknown field in json appeared") + +func generate(fname string) (err error) { + fInfo, err := os.Stat(fname) + if err != nil { + return err + } + + p := parser.Parser{AllStructs: *allStructs} + if err := p.Parse(fname, fInfo.IsDir()); err != nil { + return fmt.Errorf("Error parsing %v: %v", fname, err) + } + + var outName string + if fInfo.IsDir() { + outName = filepath.Join(fname, p.PkgName+"_easyjson.go") + } else { + if s := strings.TrimSuffix(fname, ".go"); s == fname { + return errors.New("Filename must end in '.go'") + } else { + outName = s + "_easyjson.go" + } + } + + if *specifiedName != "" { + outName = *specifiedName + } + + var trimmedBuildTags string + if *buildTags != "" { + trimmedBuildTags = strings.TrimSpace(*buildTags) + } + + g := bootstrap.Generator{ + BuildTags: trimmedBuildTags, + PkgPath: p.PkgPath, + PkgName: p.PkgName, + Types: p.StructNames, + SnakeCase: *snakeCase, + LowerCamelCase: *lowerCamelCase, + NoStdMarshalers: *noStdMarshalers, + DisallowUnknownFields: *disallowUnknownFields, + OmitEmpty: *omitEmpty, + LeaveTemps: *leaveTemps, + OutName: outName, + StubsOnly: *stubs, + NoFormat: *noformat, + } + + if err := g.Run(); err != nil { + return fmt.Errorf("Bootstrap failed: %v", err) + } + return nil +} + +func main() { + flag.Parse() + + files := flag.Args() + + gofile := os.Getenv("GOFILE") + if *processPkg { + gofile = filepath.Dir(gofile) + } + + if len(files) == 0 && gofile != "" { + files = []string{gofile} + } else if len(files) == 0 { + flag.Usage() + os.Exit(1) + } + + for _, fname := range files { + if err := generate(fname); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + } +} diff --git a/vendor/github.com/mailru/easyjson/gen/decoder.go b/vendor/github.com/mailru/easyjson/gen/decoder.go new file mode 100644 index 0000000000..02a3dfa233 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/gen/decoder.go @@ -0,0 +1,522 @@ +package gen + +import ( + "encoding" + "encoding/json" + "fmt" + "reflect" + "strings" + "unicode" + + "github.com/mailru/easyjson" +) + +// Target this byte size for initial slice allocation to reduce garbage collection. +const minSliceBytes = 64 + +func (g *Generator) getDecoderName(t reflect.Type) string { + return g.functionName("decode", t) +} + +var primitiveDecoders = map[reflect.Kind]string{ + reflect.String: "in.String()", + reflect.Bool: "in.Bool()", + reflect.Int: "in.Int()", + reflect.Int8: "in.Int8()", + reflect.Int16: "in.Int16()", + reflect.Int32: "in.Int32()", + reflect.Int64: "in.Int64()", + reflect.Uint: "in.Uint()", + reflect.Uint8: "in.Uint8()", + reflect.Uint16: "in.Uint16()", + reflect.Uint32: "in.Uint32()", + reflect.Uint64: "in.Uint64()", + reflect.Float32: "in.Float32()", + reflect.Float64: "in.Float64()", +} + +var primitiveStringDecoders = map[reflect.Kind]string{ + reflect.String: "in.String()", + reflect.Int: "in.IntStr()", + reflect.Int8: "in.Int8Str()", + reflect.Int16: "in.Int16Str()", + reflect.Int32: "in.Int32Str()", + reflect.Int64: "in.Int64Str()", + reflect.Uint: "in.UintStr()", + reflect.Uint8: "in.Uint8Str()", + reflect.Uint16: "in.Uint16Str()", + reflect.Uint32: "in.Uint32Str()", + reflect.Uint64: "in.Uint64Str()", + reflect.Uintptr: "in.UintptrStr()", + reflect.Float32: "in.Float32Str()", + reflect.Float64: "in.Float64Str()", +} + +var customDecoders = map[string]string{ + "json.Number": "in.JsonNumber()", +} + +// genTypeDecoder generates decoding code for the type t, but uses unmarshaler interface if implemented by t. +func (g *Generator) genTypeDecoder(t reflect.Type, out string, tags fieldTags, indent int) error { + ws := strings.Repeat(" ", indent) + + unmarshalerIface := reflect.TypeOf((*easyjson.Unmarshaler)(nil)).Elem() + if reflect.PtrTo(t).Implements(unmarshalerIface) { + fmt.Fprintln(g.out, ws+"("+out+").UnmarshalEasyJSON(in)") + return nil + } + + unmarshalerIface = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + if reflect.PtrTo(t).Implements(unmarshalerIface) { + fmt.Fprintln(g.out, ws+"if data := in.Raw(); in.Ok() {") + fmt.Fprintln(g.out, ws+" in.AddError( ("+out+").UnmarshalJSON(data) )") + fmt.Fprintln(g.out, ws+"}") + return nil + } + + unmarshalerIface = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() + if reflect.PtrTo(t).Implements(unmarshalerIface) { + fmt.Fprintln(g.out, ws+"if data := in.UnsafeBytes(); in.Ok() {") + fmt.Fprintln(g.out, ws+" in.AddError( ("+out+").UnmarshalText(data) )") + fmt.Fprintln(g.out, ws+"}") + return nil + } + + err := g.genTypeDecoderNoCheck(t, out, tags, indent) + return err +} + +// returns true of the type t implements one of the custom unmarshaler interfaces +func hasCustomUnmarshaler(t reflect.Type) bool { + t = reflect.PtrTo(t) + return t.Implements(reflect.TypeOf((*easyjson.Unmarshaler)(nil)).Elem()) || + t.Implements(reflect.TypeOf((*json.Unmarshaler)(nil)).Elem()) || + t.Implements(reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()) +} + +// genTypeDecoderNoCheck generates decoding code for the type t. +func (g *Generator) genTypeDecoderNoCheck(t reflect.Type, out string, tags fieldTags, indent int) error { + ws := strings.Repeat(" ", indent) + // Check whether type is primitive, needs to be done after interface check. + if dec := customDecoders[t.String()]; dec != "" { + fmt.Fprintln(g.out, ws+out+" = "+dec) + return nil + } else if dec := primitiveStringDecoders[t.Kind()]; dec != "" && tags.asString { + fmt.Fprintln(g.out, ws+out+" = "+g.getType(t)+"("+dec+")") + return nil + } else if dec := primitiveDecoders[t.Kind()]; dec != "" { + fmt.Fprintln(g.out, ws+out+" = "+g.getType(t)+"("+dec+")") + return nil + } + + switch t.Kind() { + case reflect.Slice: + tmpVar := g.uniqueVarName() + elem := t.Elem() + + if elem.Kind() == reflect.Uint8 && elem.Name() == "uint8" { + fmt.Fprintln(g.out, ws+"if in.IsNull() {") + fmt.Fprintln(g.out, ws+" in.Skip()") + fmt.Fprintln(g.out, ws+" "+out+" = nil") + fmt.Fprintln(g.out, ws+"} else {") + fmt.Fprintln(g.out, ws+" "+out+" = in.Bytes()") + fmt.Fprintln(g.out, ws+"}") + + } else { + + capacity := minSliceBytes / elem.Size() + if capacity == 0 { + capacity = 1 + } + + fmt.Fprintln(g.out, ws+"if in.IsNull() {") + fmt.Fprintln(g.out, ws+" in.Skip()") + fmt.Fprintln(g.out, ws+" "+out+" = nil") + fmt.Fprintln(g.out, ws+"} else {") + fmt.Fprintln(g.out, ws+" in.Delim('[')") + fmt.Fprintln(g.out, ws+" if "+out+" == nil {") + fmt.Fprintln(g.out, ws+" if !in.IsDelim(']') {") + fmt.Fprintln(g.out, ws+" "+out+" = make("+g.getType(t)+", 0, "+fmt.Sprint(capacity)+")") + fmt.Fprintln(g.out, ws+" } else {") + fmt.Fprintln(g.out, ws+" "+out+" = "+g.getType(t)+"{}") + fmt.Fprintln(g.out, ws+" }") + fmt.Fprintln(g.out, ws+" } else { ") + fmt.Fprintln(g.out, ws+" "+out+" = ("+out+")[:0]") + fmt.Fprintln(g.out, ws+" }") + fmt.Fprintln(g.out, ws+" for !in.IsDelim(']') {") + fmt.Fprintln(g.out, ws+" var "+tmpVar+" "+g.getType(elem)) + + if err := g.genTypeDecoder(elem, tmpVar, tags, indent+2); err != nil { + return err + } + + fmt.Fprintln(g.out, ws+" "+out+" = append("+out+", "+tmpVar+")") + fmt.Fprintln(g.out, ws+" in.WantComma()") + fmt.Fprintln(g.out, ws+" }") + fmt.Fprintln(g.out, ws+" in.Delim(']')") + fmt.Fprintln(g.out, ws+"}") + } + + case reflect.Array: + iterVar := g.uniqueVarName() + elem := t.Elem() + + if elem.Kind() == reflect.Uint8 && elem.Name() == "uint8" { + fmt.Fprintln(g.out, ws+"if in.IsNull() {") + fmt.Fprintln(g.out, ws+" in.Skip()") + fmt.Fprintln(g.out, ws+"} else {") + fmt.Fprintln(g.out, ws+" copy("+out+"[:], in.Bytes())") + fmt.Fprintln(g.out, ws+"}") + + } else { + + length := t.Len() + + fmt.Fprintln(g.out, ws+"if in.IsNull() {") + fmt.Fprintln(g.out, ws+" in.Skip()") + fmt.Fprintln(g.out, ws+"} else {") + fmt.Fprintln(g.out, ws+" in.Delim('[')") + fmt.Fprintln(g.out, ws+" "+iterVar+" := 0") + fmt.Fprintln(g.out, ws+" for !in.IsDelim(']') {") + fmt.Fprintln(g.out, ws+" if "+iterVar+" < "+fmt.Sprint(length)+" {") + + if err := g.genTypeDecoder(elem, "("+out+")["+iterVar+"]", tags, indent+3); err != nil { + return err + } + + fmt.Fprintln(g.out, ws+" "+iterVar+"++") + fmt.Fprintln(g.out, ws+" } else {") + fmt.Fprintln(g.out, ws+" in.SkipRecursive()") + fmt.Fprintln(g.out, ws+" }") + fmt.Fprintln(g.out, ws+" in.WantComma()") + fmt.Fprintln(g.out, ws+" }") + fmt.Fprintln(g.out, ws+" in.Delim(']')") + fmt.Fprintln(g.out, ws+"}") + } + + case reflect.Struct: + dec := g.getDecoderName(t) + g.addType(t) + + if len(out) > 0 && out[0] == '*' { + // NOTE: In order to remove an extra reference to a pointer + fmt.Fprintln(g.out, ws+dec+"(in, "+out[1:]+")") + } else { + fmt.Fprintln(g.out, ws+dec+"(in, &"+out+")") + } + + case reflect.Ptr: + fmt.Fprintln(g.out, ws+"if in.IsNull() {") + fmt.Fprintln(g.out, ws+" in.Skip()") + fmt.Fprintln(g.out, ws+" "+out+" = nil") + fmt.Fprintln(g.out, ws+"} else {") + fmt.Fprintln(g.out, ws+" if "+out+" == nil {") + fmt.Fprintln(g.out, ws+" "+out+" = new("+g.getType(t.Elem())+")") + fmt.Fprintln(g.out, ws+" }") + + if err := g.genTypeDecoder(t.Elem(), "*"+out, tags, indent+1); err != nil { + return err + } + + fmt.Fprintln(g.out, ws+"}") + + case reflect.Map: + key := t.Key() + keyDec, ok := primitiveStringDecoders[key.Kind()] + if !ok && !hasCustomUnmarshaler(key) { + return fmt.Errorf("map type %v not supported: only string and integer keys and types implementing json.Unmarshaler are allowed", key) + } // else assume the caller knows what they are doing and that the custom unmarshaler performs the translation from string or integer keys to the key type + elem := t.Elem() + tmpVar := g.uniqueVarName() + + fmt.Fprintln(g.out, ws+"if in.IsNull() {") + fmt.Fprintln(g.out, ws+" in.Skip()") + fmt.Fprintln(g.out, ws+"} else {") + fmt.Fprintln(g.out, ws+" in.Delim('{')") + fmt.Fprintln(g.out, ws+" if !in.IsDelim('}') {") + fmt.Fprintln(g.out, ws+" "+out+" = make("+g.getType(t)+")") + fmt.Fprintln(g.out, ws+" } else {") + fmt.Fprintln(g.out, ws+" "+out+" = nil") + fmt.Fprintln(g.out, ws+" }") + + fmt.Fprintln(g.out, ws+" for !in.IsDelim('}') {") + if keyDec != "" { + fmt.Fprintln(g.out, ws+" key := "+g.getType(key)+"("+keyDec+")") + } else { + fmt.Fprintln(g.out, ws+" var key "+g.getType(key)) + if err := g.genTypeDecoder(key, "key", tags, indent+2); err != nil { + return err + } + } + + fmt.Fprintln(g.out, ws+" in.WantColon()") + fmt.Fprintln(g.out, ws+" var "+tmpVar+" "+g.getType(elem)) + + if err := g.genTypeDecoder(elem, tmpVar, tags, indent+2); err != nil { + return err + } + + fmt.Fprintln(g.out, ws+" ("+out+")[key] = "+tmpVar) + fmt.Fprintln(g.out, ws+" in.WantComma()") + fmt.Fprintln(g.out, ws+" }") + fmt.Fprintln(g.out, ws+" in.Delim('}')") + fmt.Fprintln(g.out, ws+"}") + + case reflect.Interface: + if t.NumMethod() != 0 { + return fmt.Errorf("interface type %v not supported: only interface{} is allowed", t) + } + fmt.Fprintln(g.out, ws+"if m, ok := "+out+".(easyjson.Unmarshaler); ok {") + fmt.Fprintln(g.out, ws+"m.UnmarshalEasyJSON(in)") + fmt.Fprintln(g.out, ws+"} else if m, ok := "+out+".(json.Unmarshaler); ok {") + fmt.Fprintln(g.out, ws+"_ = m.UnmarshalJSON(in.Raw())") + fmt.Fprintln(g.out, ws+"} else {") + fmt.Fprintln(g.out, ws+" "+out+" = in.Interface()") + fmt.Fprintln(g.out, ws+"}") + default: + return fmt.Errorf("don't know how to decode %v", t) + } + return nil + +} + +func (g *Generator) genStructFieldDecoder(t reflect.Type, f reflect.StructField) error { + jsonName := g.fieldNamer.GetJSONFieldName(t, f) + tags := parseFieldTags(f) + + if tags.omit { + return nil + } + + fmt.Fprintf(g.out, " case %q:\n", jsonName) + if err := g.genTypeDecoder(f.Type, "out."+f.Name, tags, 3); err != nil { + return err + } + + if tags.required { + fmt.Fprintf(g.out, "%sSet = true\n", f.Name) + } + + return nil +} + +func (g *Generator) genRequiredFieldSet(t reflect.Type, f reflect.StructField) { + tags := parseFieldTags(f) + + if !tags.required { + return + } + + fmt.Fprintf(g.out, "var %sSet bool\n", f.Name) +} + +func (g *Generator) genRequiredFieldCheck(t reflect.Type, f reflect.StructField) { + jsonName := g.fieldNamer.GetJSONFieldName(t, f) + tags := parseFieldTags(f) + + if !tags.required { + return + } + + g.imports["fmt"] = "fmt" + + fmt.Fprintf(g.out, "if !%sSet {\n", f.Name) + fmt.Fprintf(g.out, " in.AddError(fmt.Errorf(\"key '%s' is required\"))\n", jsonName) + fmt.Fprintf(g.out, "}\n") +} + +func mergeStructFields(fields1, fields2 []reflect.StructField) (fields []reflect.StructField) { + used := map[string]bool{} + for _, f := range fields2 { + used[f.Name] = true + fields = append(fields, f) + } + + for _, f := range fields1 { + if !used[f.Name] { + fields = append(fields, f) + } + } + return +} + +func getStructFields(t reflect.Type) ([]reflect.StructField, error) { + if t.Kind() != reflect.Struct { + return nil, fmt.Errorf("got %v; expected a struct", t) + } + + var efields []reflect.StructField + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + tags := parseFieldTags(f) + if !f.Anonymous || tags.name != "" { + continue + } + + t1 := f.Type + if t1.Kind() == reflect.Ptr { + t1 = t1.Elem() + } + + fs, err := getStructFields(t1) + if err != nil { + return nil, fmt.Errorf("error processing embedded field: %v", err) + } + efields = mergeStructFields(efields, fs) + } + + var fields []reflect.StructField + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + tags := parseFieldTags(f) + if f.Anonymous && tags.name == "" { + continue + } + + c := []rune(f.Name)[0] + if unicode.IsUpper(c) { + fields = append(fields, f) + } + } + return mergeStructFields(efields, fields), nil +} + +func (g *Generator) genDecoder(t reflect.Type) error { + switch t.Kind() { + case reflect.Slice, reflect.Array, reflect.Map: + return g.genSliceArrayDecoder(t) + default: + return g.genStructDecoder(t) + } +} + +func (g *Generator) genSliceArrayDecoder(t reflect.Type) error { + switch t.Kind() { + case reflect.Slice, reflect.Array, reflect.Map: + default: + return fmt.Errorf("cannot generate encoder/decoder for %v, not a slice/array/map type", t) + } + + fname := g.getDecoderName(t) + typ := g.getType(t) + + fmt.Fprintln(g.out, "func "+fname+"(in *jlexer.Lexer, out *"+typ+") {") + fmt.Fprintln(g.out, " isTopLevel := in.IsStart()") + err := g.genTypeDecoderNoCheck(t, "*out", fieldTags{}, 1) + if err != nil { + return err + } + fmt.Fprintln(g.out, " if isTopLevel {") + fmt.Fprintln(g.out, " in.Consumed()") + fmt.Fprintln(g.out, " }") + fmt.Fprintln(g.out, "}") + + return nil +} + +func (g *Generator) genStructDecoder(t reflect.Type) error { + if t.Kind() != reflect.Struct { + return fmt.Errorf("cannot generate encoder/decoder for %v, not a struct type", t) + } + + fname := g.getDecoderName(t) + typ := g.getType(t) + + fmt.Fprintln(g.out, "func "+fname+"(in *jlexer.Lexer, out *"+typ+") {") + fmt.Fprintln(g.out, " isTopLevel := in.IsStart()") + fmt.Fprintln(g.out, " if in.IsNull() {") + fmt.Fprintln(g.out, " if isTopLevel {") + fmt.Fprintln(g.out, " in.Consumed()") + fmt.Fprintln(g.out, " }") + fmt.Fprintln(g.out, " in.Skip()") + fmt.Fprintln(g.out, " return") + fmt.Fprintln(g.out, " }") + + // Init embedded pointer fields. + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if !f.Anonymous || f.Type.Kind() != reflect.Ptr { + continue + } + fmt.Fprintln(g.out, " out."+f.Name+" = new("+g.getType(f.Type.Elem())+")") + } + + fs, err := getStructFields(t) + if err != nil { + return fmt.Errorf("cannot generate decoder for %v: %v", t, err) + } + + for _, f := range fs { + g.genRequiredFieldSet(t, f) + } + + fmt.Fprintln(g.out, " in.Delim('{')") + fmt.Fprintln(g.out, " for !in.IsDelim('}') {") + fmt.Fprintln(g.out, " key := in.UnsafeString()") + fmt.Fprintln(g.out, " in.WantColon()") + fmt.Fprintln(g.out, " if in.IsNull() {") + fmt.Fprintln(g.out, " in.Skip()") + fmt.Fprintln(g.out, " in.WantComma()") + fmt.Fprintln(g.out, " continue") + fmt.Fprintln(g.out, " }") + + fmt.Fprintln(g.out, " switch key {") + for _, f := range fs { + if err := g.genStructFieldDecoder(t, f); err != nil { + return err + } + } + + fmt.Fprintln(g.out, " default:") + if g.disallowUnknownFields { + fmt.Fprintln(g.out, ` in.AddError(&jlexer.LexerError{ + Offset: in.GetPos(), + Reason: "unknown field", + Data: key, + })`) + } else { + fmt.Fprintln(g.out, " in.SkipRecursive()") + } + fmt.Fprintln(g.out, " }") + fmt.Fprintln(g.out, " in.WantComma()") + fmt.Fprintln(g.out, " }") + fmt.Fprintln(g.out, " in.Delim('}')") + fmt.Fprintln(g.out, " if isTopLevel {") + fmt.Fprintln(g.out, " in.Consumed()") + fmt.Fprintln(g.out, " }") + + for _, f := range fs { + g.genRequiredFieldCheck(t, f) + } + + fmt.Fprintln(g.out, "}") + + return nil +} + +func (g *Generator) genStructUnmarshaler(t reflect.Type) error { + switch t.Kind() { + case reflect.Slice, reflect.Array, reflect.Map, reflect.Struct: + default: + return fmt.Errorf("cannot generate encoder/decoder for %v, not a struct/slice/array/map type", t) + } + + fname := g.getDecoderName(t) + typ := g.getType(t) + + if !g.noStdMarshalers { + fmt.Fprintln(g.out, "// UnmarshalJSON supports json.Unmarshaler interface") + fmt.Fprintln(g.out, "func (v *"+typ+") UnmarshalJSON(data []byte) error {") + fmt.Fprintln(g.out, " r := jlexer.Lexer{Data: data}") + fmt.Fprintln(g.out, " "+fname+"(&r, v)") + fmt.Fprintln(g.out, " return r.Error()") + fmt.Fprintln(g.out, "}") + } + + fmt.Fprintln(g.out, "// UnmarshalEasyJSON supports easyjson.Unmarshaler interface") + fmt.Fprintln(g.out, "func (v *"+typ+") UnmarshalEasyJSON(l *jlexer.Lexer) {") + fmt.Fprintln(g.out, " "+fname+"(l, v)") + fmt.Fprintln(g.out, "}") + + return nil +} diff --git a/vendor/github.com/mailru/easyjson/gen/encoder.go b/vendor/github.com/mailru/easyjson/gen/encoder.go new file mode 100644 index 0000000000..b2be743d88 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/gen/encoder.go @@ -0,0 +1,399 @@ +package gen + +import ( + "encoding" + "encoding/json" + "fmt" + "reflect" + "strconv" + "strings" + + "github.com/mailru/easyjson" +) + +func (g *Generator) getEncoderName(t reflect.Type) string { + return g.functionName("encode", t) +} + +var primitiveEncoders = map[reflect.Kind]string{ + reflect.String: "out.String(string(%v))", + reflect.Bool: "out.Bool(bool(%v))", + reflect.Int: "out.Int(int(%v))", + reflect.Int8: "out.Int8(int8(%v))", + reflect.Int16: "out.Int16(int16(%v))", + reflect.Int32: "out.Int32(int32(%v))", + reflect.Int64: "out.Int64(int64(%v))", + reflect.Uint: "out.Uint(uint(%v))", + reflect.Uint8: "out.Uint8(uint8(%v))", + reflect.Uint16: "out.Uint16(uint16(%v))", + reflect.Uint32: "out.Uint32(uint32(%v))", + reflect.Uint64: "out.Uint64(uint64(%v))", + reflect.Float32: "out.Float32(float32(%v))", + reflect.Float64: "out.Float64(float64(%v))", +} + +var primitiveStringEncoders = map[reflect.Kind]string{ + reflect.String: "out.String(string(%v))", + reflect.Int: "out.IntStr(int(%v))", + reflect.Int8: "out.Int8Str(int8(%v))", + reflect.Int16: "out.Int16Str(int16(%v))", + reflect.Int32: "out.Int32Str(int32(%v))", + reflect.Int64: "out.Int64Str(int64(%v))", + reflect.Uint: "out.UintStr(uint(%v))", + reflect.Uint8: "out.Uint8Str(uint8(%v))", + reflect.Uint16: "out.Uint16Str(uint16(%v))", + reflect.Uint32: "out.Uint32Str(uint32(%v))", + reflect.Uint64: "out.Uint64Str(uint64(%v))", + reflect.Uintptr: "out.UintptrStr(uintptr(%v))", + reflect.Float32: "out.Float32Str(float32(%v))", + reflect.Float64: "out.Float64Str(float64(%v))", +} + +// fieldTags contains parsed version of json struct field tags. +type fieldTags struct { + name string + + omit bool + omitEmpty bool + noOmitEmpty bool + asString bool + required bool +} + +// parseFieldTags parses the json field tag into a structure. +func parseFieldTags(f reflect.StructField) fieldTags { + var ret fieldTags + + for i, s := range strings.Split(f.Tag.Get("json"), ",") { + switch { + case i == 0 && s == "-": + ret.omit = true + case i == 0: + ret.name = s + case s == "omitempty": + ret.omitEmpty = true + case s == "!omitempty": + ret.noOmitEmpty = true + case s == "string": + ret.asString = true + case s == "required": + ret.required = true + } + } + + return ret +} + +// genTypeEncoder generates code that encodes in of type t into the writer, but uses marshaler interface if implemented by t. +func (g *Generator) genTypeEncoder(t reflect.Type, in string, tags fieldTags, indent int, assumeNonEmpty bool) error { + ws := strings.Repeat(" ", indent) + + marshalerIface := reflect.TypeOf((*easyjson.Marshaler)(nil)).Elem() + if reflect.PtrTo(t).Implements(marshalerIface) { + fmt.Fprintln(g.out, ws+"("+in+").MarshalEasyJSON(out)") + return nil + } + + marshalerIface = reflect.TypeOf((*json.Marshaler)(nil)).Elem() + if reflect.PtrTo(t).Implements(marshalerIface) { + fmt.Fprintln(g.out, ws+"out.Raw( ("+in+").MarshalJSON() )") + return nil + } + + marshalerIface = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() + if reflect.PtrTo(t).Implements(marshalerIface) { + fmt.Fprintln(g.out, ws+"out.RawText( ("+in+").MarshalText() )") + return nil + } + + err := g.genTypeEncoderNoCheck(t, in, tags, indent, assumeNonEmpty) + return err +} + +// returns true of the type t implements one of the custom marshaler interfaces +func hasCustomMarshaler(t reflect.Type) bool { + t = reflect.PtrTo(t) + return t.Implements(reflect.TypeOf((*easyjson.Marshaler)(nil)).Elem()) || + t.Implements(reflect.TypeOf((*json.Marshaler)(nil)).Elem()) || + t.Implements(reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()) +} + +// genTypeEncoderNoCheck generates code that encodes in of type t into the writer. +func (g *Generator) genTypeEncoderNoCheck(t reflect.Type, in string, tags fieldTags, indent int, assumeNonEmpty bool) error { + ws := strings.Repeat(" ", indent) + + // Check whether type is primitive, needs to be done after interface check. + if enc := primitiveStringEncoders[t.Kind()]; enc != "" && tags.asString { + fmt.Fprintf(g.out, ws+enc+"\n", in) + return nil + } else if enc := primitiveEncoders[t.Kind()]; enc != "" { + fmt.Fprintf(g.out, ws+enc+"\n", in) + return nil + } + + switch t.Kind() { + case reflect.Slice: + elem := t.Elem() + iVar := g.uniqueVarName() + vVar := g.uniqueVarName() + + if t.Elem().Kind() == reflect.Uint8 && elem.Name() == "uint8" { + fmt.Fprintln(g.out, ws+"out.Base64Bytes("+in+")") + } else { + if !assumeNonEmpty { + fmt.Fprintln(g.out, ws+"if "+in+" == nil && (out.Flags & jwriter.NilSliceAsEmpty) == 0 {") + fmt.Fprintln(g.out, ws+` out.RawString("null")`) + fmt.Fprintln(g.out, ws+"} else {") + } else { + fmt.Fprintln(g.out, ws+"{") + } + fmt.Fprintln(g.out, ws+" out.RawByte('[')") + fmt.Fprintln(g.out, ws+" for "+iVar+", "+vVar+" := range "+in+" {") + fmt.Fprintln(g.out, ws+" if "+iVar+" > 0 {") + fmt.Fprintln(g.out, ws+" out.RawByte(',')") + fmt.Fprintln(g.out, ws+" }") + + if err := g.genTypeEncoder(elem, vVar, tags, indent+2, false); err != nil { + return err + } + + fmt.Fprintln(g.out, ws+" }") + fmt.Fprintln(g.out, ws+" out.RawByte(']')") + fmt.Fprintln(g.out, ws+"}") + } + + case reflect.Array: + elem := t.Elem() + iVar := g.uniqueVarName() + + if t.Elem().Kind() == reflect.Uint8 && elem.Name() == "uint8" { + fmt.Fprintln(g.out, ws+"out.Base64Bytes("+in+"[:])") + } else { + fmt.Fprintln(g.out, ws+"out.RawByte('[')") + fmt.Fprintln(g.out, ws+"for "+iVar+" := range "+in+" {") + fmt.Fprintln(g.out, ws+" if "+iVar+" > 0 {") + fmt.Fprintln(g.out, ws+" out.RawByte(',')") + fmt.Fprintln(g.out, ws+" }") + + if err := g.genTypeEncoder(elem, "("+in+")["+iVar+"]", tags, indent+1, false); err != nil { + return err + } + + fmt.Fprintln(g.out, ws+"}") + fmt.Fprintln(g.out, ws+"out.RawByte(']')") + } + + case reflect.Struct: + enc := g.getEncoderName(t) + g.addType(t) + + fmt.Fprintln(g.out, ws+enc+"(out, "+in+")") + + case reflect.Ptr: + if !assumeNonEmpty { + fmt.Fprintln(g.out, ws+"if "+in+" == nil {") + fmt.Fprintln(g.out, ws+` out.RawString("null")`) + fmt.Fprintln(g.out, ws+"} else {") + } + + if err := g.genTypeEncoder(t.Elem(), "*"+in, tags, indent+1, false); err != nil { + return err + } + + if !assumeNonEmpty { + fmt.Fprintln(g.out, ws+"}") + } + + case reflect.Map: + key := t.Key() + keyEnc, ok := primitiveStringEncoders[key.Kind()] + if !ok && !hasCustomMarshaler(key) { + return fmt.Errorf("map key type %v not supported: only string and integer keys and types implementing Marshaler interfaces are allowed", key) + } // else assume the caller knows what they are doing and that the custom marshaler performs the translation from the key type to a string or integer + tmpVar := g.uniqueVarName() + + if !assumeNonEmpty { + fmt.Fprintln(g.out, ws+"if "+in+" == nil && (out.Flags & jwriter.NilMapAsEmpty) == 0 {") + fmt.Fprintln(g.out, ws+" out.RawString(`null`)") + fmt.Fprintln(g.out, ws+"} else {") + } else { + fmt.Fprintln(g.out, ws+"{") + } + fmt.Fprintln(g.out, ws+" out.RawByte('{')") + fmt.Fprintln(g.out, ws+" "+tmpVar+"First := true") + fmt.Fprintln(g.out, ws+" for "+tmpVar+"Name, "+tmpVar+"Value := range "+in+" {") + fmt.Fprintln(g.out, ws+" if "+tmpVar+"First { "+tmpVar+"First = false } else { out.RawByte(',') }") + if keyEnc != "" { + fmt.Fprintln(g.out, ws+" "+fmt.Sprintf(keyEnc, tmpVar+"Name")) + } else { + if err := g.genTypeEncoder(key, tmpVar+"Name", tags, indent+2, false); err != nil { + return err + } + } + + fmt.Fprintln(g.out, ws+" out.RawByte(':')") + + if err := g.genTypeEncoder(t.Elem(), tmpVar+"Value", tags, indent+2, false); err != nil { + return err + } + + fmt.Fprintln(g.out, ws+" }") + fmt.Fprintln(g.out, ws+" out.RawByte('}')") + fmt.Fprintln(g.out, ws+"}") + + case reflect.Interface: + if t.NumMethod() != 0 { + return fmt.Errorf("interface type %v not supported: only interface{} is allowed", t) + } + fmt.Fprintln(g.out, ws+"if m, ok := "+in+".(easyjson.Marshaler); ok {") + fmt.Fprintln(g.out, ws+" m.MarshalEasyJSON(out)") + fmt.Fprintln(g.out, ws+"} else if m, ok := "+in+".(json.Marshaler); ok {") + fmt.Fprintln(g.out, ws+" out.Raw(m.MarshalJSON())") + fmt.Fprintln(g.out, ws+"} else {") + fmt.Fprintln(g.out, ws+" out.Raw(json.Marshal("+in+"))") + fmt.Fprintln(g.out, ws+"}") + + default: + return fmt.Errorf("don't know how to encode %v", t) + } + return nil +} + +func (g *Generator) notEmptyCheck(t reflect.Type, v string) string { + optionalIface := reflect.TypeOf((*easyjson.Optional)(nil)).Elem() + if reflect.PtrTo(t).Implements(optionalIface) { + return "(" + v + ").IsDefined()" + } + + switch t.Kind() { + case reflect.Slice, reflect.Map: + return "len(" + v + ") != 0" + case reflect.Interface, reflect.Ptr: + return v + " != nil" + case reflect.Bool: + return v + case reflect.String: + return v + ` != ""` + case reflect.Float32, reflect.Float64, + reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + + return v + " != 0" + + default: + // note: Array types don't have a useful empty value + return "true" + } +} + +func (g *Generator) genStructFieldEncoder(t reflect.Type, f reflect.StructField) error { + jsonName := g.fieldNamer.GetJSONFieldName(t, f) + tags := parseFieldTags(f) + + if tags.omit { + return nil + } + noOmitEmpty := (!tags.omitEmpty && !g.omitEmpty) || tags.noOmitEmpty + if noOmitEmpty { + fmt.Fprintln(g.out, " {") + } else { + fmt.Fprintln(g.out, " if", g.notEmptyCheck(f.Type, "in."+f.Name), "{") + } + fmt.Fprintf(g.out, " const prefix string = %q\n", ","+strconv.Quote(jsonName)+":") + fmt.Fprintln(g.out, " if first {") + fmt.Fprintln(g.out, " first = false") + fmt.Fprintln(g.out, " out.RawString(prefix[1:])") + fmt.Fprintln(g.out, " } else {") + fmt.Fprintln(g.out, " out.RawString(prefix)") + fmt.Fprintln(g.out, " }") + + if err := g.genTypeEncoder(f.Type, "in."+f.Name, tags, 2, !noOmitEmpty); err != nil { + return err + } + fmt.Fprintln(g.out, " }") + return nil +} + +func (g *Generator) genEncoder(t reflect.Type) error { + switch t.Kind() { + case reflect.Slice, reflect.Array, reflect.Map: + return g.genSliceArrayMapEncoder(t) + default: + return g.genStructEncoder(t) + } +} + +func (g *Generator) genSliceArrayMapEncoder(t reflect.Type) error { + switch t.Kind() { + case reflect.Slice, reflect.Array, reflect.Map: + default: + return fmt.Errorf("cannot generate encoder/decoder for %v, not a slice/array/map type", t) + } + + fname := g.getEncoderName(t) + typ := g.getType(t) + + fmt.Fprintln(g.out, "func "+fname+"(out *jwriter.Writer, in "+typ+") {") + err := g.genTypeEncoderNoCheck(t, "in", fieldTags{}, 1, false) + if err != nil { + return err + } + fmt.Fprintln(g.out, "}") + return nil +} + +func (g *Generator) genStructEncoder(t reflect.Type) error { + if t.Kind() != reflect.Struct { + return fmt.Errorf("cannot generate encoder/decoder for %v, not a struct type", t) + } + + fname := g.getEncoderName(t) + typ := g.getType(t) + + fmt.Fprintln(g.out, "func "+fname+"(out *jwriter.Writer, in "+typ+") {") + fmt.Fprintln(g.out, " out.RawByte('{')") + fmt.Fprintln(g.out, " first := true") + fmt.Fprintln(g.out, " _ = first") + + fs, err := getStructFields(t) + if err != nil { + return fmt.Errorf("cannot generate encoder for %v: %v", t, err) + } + for _, f := range fs { + if err := g.genStructFieldEncoder(t, f); err != nil { + return err + } + } + + fmt.Fprintln(g.out, " out.RawByte('}')") + fmt.Fprintln(g.out, "}") + + return nil +} + +func (g *Generator) genStructMarshaler(t reflect.Type) error { + switch t.Kind() { + case reflect.Slice, reflect.Array, reflect.Map, reflect.Struct: + default: + return fmt.Errorf("cannot generate encoder/decoder for %v, not a struct/slice/array/map type", t) + } + + fname := g.getEncoderName(t) + typ := g.getType(t) + + if !g.noStdMarshalers { + fmt.Fprintln(g.out, "// MarshalJSON supports json.Marshaler interface") + fmt.Fprintln(g.out, "func (v "+typ+") MarshalJSON() ([]byte, error) {") + fmt.Fprintln(g.out, " w := jwriter.Writer{}") + fmt.Fprintln(g.out, " "+fname+"(&w, v)") + fmt.Fprintln(g.out, " return w.Buffer.BuildBytes(), w.Error") + fmt.Fprintln(g.out, "}") + } + + fmt.Fprintln(g.out, "// MarshalEasyJSON supports easyjson.Marshaler interface") + fmt.Fprintln(g.out, "func (v "+typ+") MarshalEasyJSON(w *jwriter.Writer) {") + fmt.Fprintln(g.out, " "+fname+"(w, v)") + fmt.Fprintln(g.out, "}") + + return nil +} diff --git a/vendor/github.com/mailru/easyjson/gen/generator.go b/vendor/github.com/mailru/easyjson/gen/generator.go new file mode 100644 index 0000000000..a34a8520be --- /dev/null +++ b/vendor/github.com/mailru/easyjson/gen/generator.go @@ -0,0 +1,533 @@ +package gen + +import ( + "bytes" + "fmt" + "hash/fnv" + "io" + "path" + "reflect" + "sort" + "strconv" + "strings" + "unicode" +) + +const pkgWriter = "github.com/mailru/easyjson/jwriter" +const pkgLexer = "github.com/mailru/easyjson/jlexer" +const pkgEasyJSON = "github.com/mailru/easyjson" + +// FieldNamer defines a policy for generating names for struct fields. +type FieldNamer interface { + GetJSONFieldName(t reflect.Type, f reflect.StructField) string +} + +// Generator generates the requested marshaler/unmarshalers. +type Generator struct { + out *bytes.Buffer + + pkgName string + pkgPath string + buildTags string + hashString string + + varCounter int + + noStdMarshalers bool + omitEmpty bool + disallowUnknownFields bool + fieldNamer FieldNamer + + // package path to local alias map for tracking imports + imports map[string]string + + // types that marshalers were requested for by user + marshalers map[reflect.Type]bool + + // types that encoders were already generated for + typesSeen map[reflect.Type]bool + + // types that encoders were requested for (e.g. by encoders of other types) + typesUnseen []reflect.Type + + // function name to relevant type maps to track names of de-/encoders in + // case of a name clash or unnamed structs + functionNames map[string]reflect.Type +} + +// NewGenerator initializes and returns a Generator. +func NewGenerator(filename string) *Generator { + ret := &Generator{ + imports: map[string]string{ + pkgWriter: "jwriter", + pkgLexer: "jlexer", + pkgEasyJSON: "easyjson", + "encoding/json": "json", + }, + fieldNamer: DefaultFieldNamer{}, + marshalers: make(map[reflect.Type]bool), + typesSeen: make(map[reflect.Type]bool), + functionNames: make(map[string]reflect.Type), + } + + // Use a file-unique prefix on all auxiliary funcs to avoid + // name clashes. + hash := fnv.New32() + hash.Write([]byte(filename)) + ret.hashString = fmt.Sprintf("%x", hash.Sum32()) + + return ret +} + +// SetPkg sets the name and path of output package. +func (g *Generator) SetPkg(name, path string) { + g.pkgName = name + g.pkgPath = path +} + +// SetBuildTags sets build tags for the output file. +func (g *Generator) SetBuildTags(tags string) { + g.buildTags = tags +} + +// SetFieldNamer sets field naming strategy. +func (g *Generator) SetFieldNamer(n FieldNamer) { + g.fieldNamer = n +} + +// UseSnakeCase sets snake_case field naming strategy. +func (g *Generator) UseSnakeCase() { + g.fieldNamer = SnakeCaseFieldNamer{} +} + +// UseLowerCamelCase sets lowerCamelCase field naming strategy. +func (g *Generator) UseLowerCamelCase() { + g.fieldNamer = LowerCamelCaseFieldNamer{} +} + +// NoStdMarshalers instructs not to generate standard MarshalJSON/UnmarshalJSON +// methods (only the custom interface). +func (g *Generator) NoStdMarshalers() { + g.noStdMarshalers = true +} + +// DisallowUnknownFields instructs not to skip unknown fields in json and return error. +func (g *Generator) DisallowUnknownFields() { + g.disallowUnknownFields = true +} + +// OmitEmpty triggers `json=",omitempty"` behaviour by default. +func (g *Generator) OmitEmpty() { + g.omitEmpty = true +} + +// addTypes requests to generate encoding/decoding funcs for the given type. +func (g *Generator) addType(t reflect.Type) { + if g.typesSeen[t] { + return + } + for _, t1 := range g.typesUnseen { + if t1 == t { + return + } + } + g.typesUnseen = append(g.typesUnseen, t) +} + +// Add requests to generate marshaler/unmarshalers and encoding/decoding +// funcs for the type of given object. +func (g *Generator) Add(obj interface{}) { + t := reflect.TypeOf(obj) + if t.Kind() == reflect.Ptr { + t = t.Elem() + } + g.addType(t) + g.marshalers[t] = true +} + +// printHeader prints package declaration and imports. +func (g *Generator) printHeader() { + if g.buildTags != "" { + fmt.Println("// +build ", g.buildTags) + fmt.Println() + } + fmt.Println("// Code generated by easyjson for marshaling/unmarshaling. DO NOT EDIT.") + fmt.Println() + fmt.Println("package ", g.pkgName) + fmt.Println() + + byAlias := map[string]string{} + var aliases []string + for path, alias := range g.imports { + aliases = append(aliases, alias) + byAlias[alias] = path + } + + sort.Strings(aliases) + fmt.Println("import (") + for _, alias := range aliases { + fmt.Printf(" %s %q\n", alias, byAlias[alias]) + } + + fmt.Println(")") + fmt.Println("") + fmt.Println("// suppress unused package warning") + fmt.Println("var (") + fmt.Println(" _ *json.RawMessage") + fmt.Println(" _ *jlexer.Lexer") + fmt.Println(" _ *jwriter.Writer") + fmt.Println(" _ easyjson.Marshaler") + fmt.Println(")") + + fmt.Println() +} + +// Run runs the generator and outputs generated code to out. +func (g *Generator) Run(out io.Writer) error { + g.out = &bytes.Buffer{} + + for len(g.typesUnseen) > 0 { + t := g.typesUnseen[len(g.typesUnseen)-1] + g.typesUnseen = g.typesUnseen[:len(g.typesUnseen)-1] + g.typesSeen[t] = true + + if err := g.genDecoder(t); err != nil { + return err + } + if err := g.genEncoder(t); err != nil { + return err + } + + if !g.marshalers[t] { + continue + } + + if err := g.genStructMarshaler(t); err != nil { + return err + } + if err := g.genStructUnmarshaler(t); err != nil { + return err + } + } + g.printHeader() + _, err := out.Write(g.out.Bytes()) + return err +} + +// fixes vendored paths +func fixPkgPathVendoring(pkgPath string) string { + const vendor = "/vendor/" + if i := strings.LastIndex(pkgPath, vendor); i != -1 { + return pkgPath[i+len(vendor):] + } + return pkgPath +} + +func fixAliasName(alias string) string { + alias = strings.Replace( + strings.Replace(alias, ".", "_", -1), + "-", + "_", + -1, + ) + + if alias[0] == 'v' { // to void conflicting with var names, say v1 + alias = "_" + alias + } + return alias +} + +// pkgAlias creates and returns and import alias for a given package. +func (g *Generator) pkgAlias(pkgPath string) string { + pkgPath = fixPkgPathVendoring(pkgPath) + if alias := g.imports[pkgPath]; alias != "" { + return alias + } + + for i := 0; ; i++ { + alias := fixAliasName(path.Base(pkgPath)) + if i > 0 { + alias += fmt.Sprint(i) + } + + exists := false + for _, v := range g.imports { + if v == alias { + exists = true + break + } + } + + if !exists { + g.imports[pkgPath] = alias + return alias + } + } +} + +// getType return the textual type name of given type that can be used in generated code. +func (g *Generator) getType(t reflect.Type) string { + if t.Name() == "" { + switch t.Kind() { + case reflect.Ptr: + return "*" + g.getType(t.Elem()) + case reflect.Slice: + return "[]" + g.getType(t.Elem()) + case reflect.Array: + return "[" + strconv.Itoa(t.Len()) + "]" + g.getType(t.Elem()) + case reflect.Map: + return "map[" + g.getType(t.Key()) + "]" + g.getType(t.Elem()) + } + } + + if t.Name() == "" || t.PkgPath() == "" { + if t.Kind() == reflect.Struct { + // the fields of an anonymous struct can have named types, + // and t.String() will not be sufficient because it does not + // remove the package name when it matches g.pkgPath. + // so we convert by hand + nf := t.NumField() + lines := make([]string, 0, nf) + for i := 0; i < nf; i++ { + f := t.Field(i) + var line string + if !f.Anonymous { + line = f.Name + " " + } // else the field is anonymous (an embedded type) + line += g.getType(f.Type) + t := f.Tag + if t != "" { + line += " " + escapeTag(t) + } + lines = append(lines, line) + } + return strings.Join([]string{"struct { ", strings.Join(lines, "; "), " }"}, "") + } + return t.String() + } else if t.PkgPath() == g.pkgPath { + return t.Name() + } + return g.pkgAlias(t.PkgPath()) + "." + t.Name() +} + +// escape a struct field tag string back to source code +func escapeTag(tag reflect.StructTag) string { + t := string(tag) + if strings.ContainsRune(t, '`') { + // there are ` in the string; we can't use ` to enclose the string + return strconv.Quote(t) + } + return "`" + t + "`" +} + +// uniqueVarName returns a file-unique name that can be used for generated variables. +func (g *Generator) uniqueVarName() string { + g.varCounter++ + return fmt.Sprint("v", g.varCounter) +} + +// safeName escapes unsafe characters in pkg/type name and returns a string that can be used +// in encoder/decoder names for the type. +func (g *Generator) safeName(t reflect.Type) string { + name := t.PkgPath() + if t.Name() == "" { + name += "anonymous" + } else { + name += "." + t.Name() + } + + parts := []string{} + part := []rune{} + for _, c := range name { + if unicode.IsLetter(c) || unicode.IsDigit(c) { + part = append(part, c) + } else if len(part) > 0 { + parts = append(parts, string(part)) + part = []rune{} + } + } + return joinFunctionNameParts(false, parts...) +} + +// functionName returns a function name for a given type with a given prefix. If a function +// with this prefix already exists for a type, it is returned. +// +// Method is used to track encoder/decoder names for the type. +func (g *Generator) functionName(prefix string, t reflect.Type) string { + prefix = joinFunctionNameParts(true, "easyjson", g.hashString, prefix) + name := joinFunctionNameParts(true, prefix, g.safeName(t)) + + // Most of the names will be unique, try a shortcut first. + if e, ok := g.functionNames[name]; !ok || e == t { + g.functionNames[name] = t + return name + } + + // Search if the function already exists. + for name1, t1 := range g.functionNames { + if t1 == t && strings.HasPrefix(name1, prefix) { + return name1 + } + } + + // Create a new name in the case of a clash. + for i := 1; ; i++ { + nm := fmt.Sprint(name, i) + if _, ok := g.functionNames[nm]; ok { + continue + } + g.functionNames[nm] = t + return nm + } +} + +// DefaultFieldsNamer implements trivial naming policy equivalent to encoding/json. +type DefaultFieldNamer struct{} + +func (DefaultFieldNamer) GetJSONFieldName(t reflect.Type, f reflect.StructField) string { + jsonName := strings.Split(f.Tag.Get("json"), ",")[0] + if jsonName != "" { + return jsonName + } else { + return f.Name + } +} + +// LowerCamelCaseFieldNamer +type LowerCamelCaseFieldNamer struct{} + +func isLower(b byte) bool { + return b <= 122 && b >= 97 +} + +func isUpper(b byte) bool { + return b >= 65 && b <= 90 +} + +// convert HTTPRestClient to httpRestClient +func lowerFirst(s string) string { + if s == "" { + return "" + } + + str := "" + strlen := len(s) + + /** + Loop each char + If is uppercase: + If is first char, LOWER it + If the following char is lower, LEAVE it + If the following char is upper OR numeric, LOWER it + If is the end of string, LEAVE it + Else lowercase + */ + + foundLower := false + for i := range s { + ch := s[i] + if isUpper(ch) { + if i == 0 { + str += string(ch + 32) + } else if !foundLower { // Currently just a stream of capitals, eg JSONRESTS[erver] + if strlen > (i+1) && isLower(s[i+1]) { + // Next char is lower, keep this a capital + str += string(ch) + } else { + // Either at end of string or next char is capital + str += string(ch + 32) + } + } else { + str += string(ch) + } + } else { + foundLower = true + str += string(ch) + } + } + + return str +} + +func (LowerCamelCaseFieldNamer) GetJSONFieldName(t reflect.Type, f reflect.StructField) string { + jsonName := strings.Split(f.Tag.Get("json"), ",")[0] + if jsonName != "" { + return jsonName + } else { + return lowerFirst(f.Name) + } +} + +// SnakeCaseFieldNamer implements CamelCase to snake_case conversion for fields names. +type SnakeCaseFieldNamer struct{} + +func camelToSnake(name string) string { + var ret bytes.Buffer + + multipleUpper := false + var lastUpper rune + var beforeUpper rune + + for _, c := range name { + // Non-lowercase character after uppercase is considered to be uppercase too. + isUpper := (unicode.IsUpper(c) || (lastUpper != 0 && !unicode.IsLower(c))) + + if lastUpper != 0 { + // Output a delimiter if last character was either the first uppercase character + // in a row, or the last one in a row (e.g. 'S' in "HTTPServer"). + // Do not output a delimiter at the beginning of the name. + + firstInRow := !multipleUpper + lastInRow := !isUpper + + if ret.Len() > 0 && (firstInRow || lastInRow) && beforeUpper != '_' { + ret.WriteByte('_') + } + ret.WriteRune(unicode.ToLower(lastUpper)) + } + + // Buffer uppercase char, do not output it yet as a delimiter may be required if the + // next character is lowercase. + if isUpper { + multipleUpper = (lastUpper != 0) + lastUpper = c + continue + } + + ret.WriteRune(c) + lastUpper = 0 + beforeUpper = c + multipleUpper = false + } + + if lastUpper != 0 { + ret.WriteRune(unicode.ToLower(lastUpper)) + } + return string(ret.Bytes()) +} + +func (SnakeCaseFieldNamer) GetJSONFieldName(t reflect.Type, f reflect.StructField) string { + jsonName := strings.Split(f.Tag.Get("json"), ",")[0] + if jsonName != "" { + return jsonName + } + + return camelToSnake(f.Name) +} + +func joinFunctionNameParts(keepFirst bool, parts ...string) string { + buf := bytes.NewBufferString("") + for i, part := range parts { + if i == 0 && keepFirst { + buf.WriteString(part) + } else { + if len(part) > 0 { + buf.WriteString(strings.ToUpper(string(part[0]))) + } + if len(part) > 1 { + buf.WriteString(part[1:]) + } + } + } + return buf.String() +} diff --git a/vendor/github.com/mailru/easyjson/helpers.go b/vendor/github.com/mailru/easyjson/helpers.go new file mode 100644 index 0000000000..b86b87d228 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/helpers.go @@ -0,0 +1,78 @@ +// Package easyjson contains marshaler/unmarshaler interfaces and helper functions. +package easyjson + +import ( + "io" + "io/ioutil" + "net/http" + "strconv" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// Marshaler is an easyjson-compatible marshaler interface. +type Marshaler interface { + MarshalEasyJSON(w *jwriter.Writer) +} + +// Marshaler is an easyjson-compatible unmarshaler interface. +type Unmarshaler interface { + UnmarshalEasyJSON(w *jlexer.Lexer) +} + +// Optional defines an undefined-test method for a type to integrate with 'omitempty' logic. +type Optional interface { + IsDefined() bool +} + +// Marshal returns data as a single byte slice. Method is suboptimal as the data is likely to be copied +// from a chain of smaller chunks. +func Marshal(v Marshaler) ([]byte, error) { + w := jwriter.Writer{} + v.MarshalEasyJSON(&w) + return w.BuildBytes() +} + +// MarshalToWriter marshals the data to an io.Writer. +func MarshalToWriter(v Marshaler, w io.Writer) (written int, err error) { + jw := jwriter.Writer{} + v.MarshalEasyJSON(&jw) + return jw.DumpTo(w) +} + +// MarshalToHTTPResponseWriter sets Content-Length and Content-Type headers for the +// http.ResponseWriter, and send the data to the writer. started will be equal to +// false if an error occurred before any http.ResponseWriter methods were actually +// invoked (in this case a 500 reply is possible). +func MarshalToHTTPResponseWriter(v Marshaler, w http.ResponseWriter) (started bool, written int, err error) { + jw := jwriter.Writer{} + v.MarshalEasyJSON(&jw) + if jw.Error != nil { + return false, 0, jw.Error + } + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Content-Length", strconv.Itoa(jw.Size())) + + started = true + written, err = jw.DumpTo(w) + return +} + +// Unmarshal decodes the JSON in data into the object. +func Unmarshal(data []byte, v Unmarshaler) error { + l := jlexer.Lexer{Data: data} + v.UnmarshalEasyJSON(&l) + return l.Error() +} + +// UnmarshalFromReader reads all the data in the reader and decodes as JSON into the object. +func UnmarshalFromReader(r io.Reader, v Unmarshaler) error { + data, err := ioutil.ReadAll(r) + if err != nil { + return err + } + l := jlexer.Lexer{Data: data} + v.UnmarshalEasyJSON(&l) + return l.Error() +} diff --git a/vendor/github.com/mailru/easyjson/jlexer/bytestostr.go b/vendor/github.com/mailru/easyjson/jlexer/bytestostr.go new file mode 100644 index 0000000000..ff7b27c5b2 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/jlexer/bytestostr.go @@ -0,0 +1,24 @@ +// This file will only be included to the build if neither +// easyjson_nounsafe nor appengine build tag is set. See README notes +// for more details. + +//+build !easyjson_nounsafe +//+build !appengine + +package jlexer + +import ( + "reflect" + "unsafe" +) + +// bytesToStr creates a string pointing at the slice to avoid copying. +// +// Warning: the string returned by the function should be used with care, as the whole input data +// chunk may be either blocked from being freed by GC because of a single string or the buffer.Data +// may be garbage-collected even when the string exists. +func bytesToStr(data []byte) string { + h := (*reflect.SliceHeader)(unsafe.Pointer(&data)) + shdr := reflect.StringHeader{Data: h.Data, Len: h.Len} + return *(*string)(unsafe.Pointer(&shdr)) +} diff --git a/vendor/github.com/mailru/easyjson/jlexer/bytestostr_nounsafe.go b/vendor/github.com/mailru/easyjson/jlexer/bytestostr_nounsafe.go new file mode 100644 index 0000000000..864d1be676 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/jlexer/bytestostr_nounsafe.go @@ -0,0 +1,13 @@ +// This file is included to the build if any of the buildtags below +// are defined. Refer to README notes for more details. + +//+build easyjson_nounsafe appengine + +package jlexer + +// bytesToStr creates a string normally from []byte +// +// Note that this method is roughly 1.5x slower than using the 'unsafe' method. +func bytesToStr(data []byte) string { + return string(data) +} diff --git a/vendor/github.com/mailru/easyjson/jlexer/error.go b/vendor/github.com/mailru/easyjson/jlexer/error.go new file mode 100644 index 0000000000..e90ec40d05 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/jlexer/error.go @@ -0,0 +1,15 @@ +package jlexer + +import "fmt" + +// LexerError implements the error interface and represents all possible errors that can be +// generated during parsing the JSON data. +type LexerError struct { + Reason string + Offset int + Data string +} + +func (l *LexerError) Error() string { + return fmt.Sprintf("parse error: %s near offset %d of '%s'", l.Reason, l.Offset, l.Data) +} diff --git a/vendor/github.com/mailru/easyjson/jlexer/lexer.go b/vendor/github.com/mailru/easyjson/jlexer/lexer.go new file mode 100644 index 0000000000..51f056615c --- /dev/null +++ b/vendor/github.com/mailru/easyjson/jlexer/lexer.go @@ -0,0 +1,1181 @@ +// Package jlexer contains a JSON lexer implementation. +// +// It is expected that it is mostly used with generated parser code, so the interface is tuned +// for a parser that knows what kind of data is expected. +package jlexer + +import ( + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "io" + "strconv" + "unicode" + "unicode/utf16" + "unicode/utf8" +) + +// tokenKind determines type of a token. +type tokenKind byte + +const ( + tokenUndef tokenKind = iota // No token. + tokenDelim // Delimiter: one of '{', '}', '[' or ']'. + tokenString // A string literal, e.g. "abc\u1234" + tokenNumber // Number literal, e.g. 1.5e5 + tokenBool // Boolean literal: true or false. + tokenNull // null keyword. +) + +// token describes a single token: type, position in the input and value. +type token struct { + kind tokenKind // Type of a token. + + boolValue bool // Value if a boolean literal token. + byteValue []byte // Raw value of a token. + delimValue byte +} + +// Lexer is a JSON lexer: it iterates over JSON tokens in a byte slice. +type Lexer struct { + Data []byte // Input data given to the lexer. + + start int // Start of the current token. + pos int // Current unscanned position in the input stream. + token token // Last scanned token, if token.kind != tokenUndef. + + firstElement bool // Whether current element is the first in array or an object. + wantSep byte // A comma or a colon character, which need to occur before a token. + + UseMultipleErrors bool // If we want to use multiple errors. + fatalError error // Fatal error occurred during lexing. It is usually a syntax error. + multipleErrors []*LexerError // Semantic errors occurred during lexing. Marshalling will be continued after finding this errors. +} + +// FetchToken scans the input for the next token. +func (r *Lexer) FetchToken() { + r.token.kind = tokenUndef + r.start = r.pos + + // Check if r.Data has r.pos element + // If it doesn't, it mean corrupted input data + if len(r.Data) < r.pos { + r.errParse("Unexpected end of data") + return + } + // Determine the type of a token by skipping whitespace and reading the + // first character. + for _, c := range r.Data[r.pos:] { + switch c { + case ':', ',': + if r.wantSep == c { + r.pos++ + r.start++ + r.wantSep = 0 + } else { + r.errSyntax() + } + + case ' ', '\t', '\r', '\n': + r.pos++ + r.start++ + + case '"': + if r.wantSep != 0 { + r.errSyntax() + } + + r.token.kind = tokenString + r.fetchString() + return + + case '{', '[': + if r.wantSep != 0 { + r.errSyntax() + } + r.firstElement = true + r.token.kind = tokenDelim + r.token.delimValue = r.Data[r.pos] + r.pos++ + return + + case '}', ']': + if !r.firstElement && (r.wantSep != ',') { + r.errSyntax() + } + r.wantSep = 0 + r.token.kind = tokenDelim + r.token.delimValue = r.Data[r.pos] + r.pos++ + return + + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-': + if r.wantSep != 0 { + r.errSyntax() + } + r.token.kind = tokenNumber + r.fetchNumber() + return + + case 'n': + if r.wantSep != 0 { + r.errSyntax() + } + + r.token.kind = tokenNull + r.fetchNull() + return + + case 't': + if r.wantSep != 0 { + r.errSyntax() + } + + r.token.kind = tokenBool + r.token.boolValue = true + r.fetchTrue() + return + + case 'f': + if r.wantSep != 0 { + r.errSyntax() + } + + r.token.kind = tokenBool + r.token.boolValue = false + r.fetchFalse() + return + + default: + r.errSyntax() + return + } + } + r.fatalError = io.EOF + return +} + +// isTokenEnd returns true if the char can follow a non-delimiter token +func isTokenEnd(c byte) bool { + return c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == '[' || c == ']' || c == '{' || c == '}' || c == ',' || c == ':' +} + +// fetchNull fetches and checks remaining bytes of null keyword. +func (r *Lexer) fetchNull() { + r.pos += 4 + if r.pos > len(r.Data) || + r.Data[r.pos-3] != 'u' || + r.Data[r.pos-2] != 'l' || + r.Data[r.pos-1] != 'l' || + (r.pos != len(r.Data) && !isTokenEnd(r.Data[r.pos])) { + + r.pos -= 4 + r.errSyntax() + } +} + +// fetchTrue fetches and checks remaining bytes of true keyword. +func (r *Lexer) fetchTrue() { + r.pos += 4 + if r.pos > len(r.Data) || + r.Data[r.pos-3] != 'r' || + r.Data[r.pos-2] != 'u' || + r.Data[r.pos-1] != 'e' || + (r.pos != len(r.Data) && !isTokenEnd(r.Data[r.pos])) { + + r.pos -= 4 + r.errSyntax() + } +} + +// fetchFalse fetches and checks remaining bytes of false keyword. +func (r *Lexer) fetchFalse() { + r.pos += 5 + if r.pos > len(r.Data) || + r.Data[r.pos-4] != 'a' || + r.Data[r.pos-3] != 'l' || + r.Data[r.pos-2] != 's' || + r.Data[r.pos-1] != 'e' || + (r.pos != len(r.Data) && !isTokenEnd(r.Data[r.pos])) { + + r.pos -= 5 + r.errSyntax() + } +} + +// fetchNumber scans a number literal token. +func (r *Lexer) fetchNumber() { + hasE := false + afterE := false + hasDot := false + + r.pos++ + for i, c := range r.Data[r.pos:] { + switch { + case c >= '0' && c <= '9': + afterE = false + case c == '.' && !hasDot: + hasDot = true + case (c == 'e' || c == 'E') && !hasE: + hasE = true + hasDot = true + afterE = true + case (c == '+' || c == '-') && afterE: + afterE = false + default: + r.pos += i + if !isTokenEnd(c) { + r.errSyntax() + } else { + r.token.byteValue = r.Data[r.start:r.pos] + } + return + } + } + + r.pos = len(r.Data) + r.token.byteValue = r.Data[r.start:] +} + +// findStringLen tries to scan into the string literal for ending quote char to determine required size. +// The size will be exact if no escapes are present and may be inexact if there are escaped chars. +func findStringLen(data []byte) (isValid, hasEscapes bool, length int) { + delta := 0 + + for i := 0; i < len(data); i++ { + switch data[i] { + case '\\': + i++ + delta++ + if i < len(data) && data[i] == 'u' { + delta++ + } + case '"': + return true, (delta > 0), (i - delta) + } + } + + return false, false, len(data) +} + +// getu4 decodes \uXXXX from the beginning of s, returning the hex value, +// or it returns -1. +func getu4(s []byte) rune { + if len(s) < 6 || s[0] != '\\' || s[1] != 'u' { + return -1 + } + var val rune + for i := 2; i < len(s) && i < 6; i++ { + var v byte + c := s[i] + switch c { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + v = c - '0' + case 'a', 'b', 'c', 'd', 'e', 'f': + v = c - 'a' + 10 + case 'A', 'B', 'C', 'D', 'E', 'F': + v = c - 'A' + 10 + default: + return -1 + } + + val <<= 4 + val |= rune(v) + } + return val +} + +// processEscape processes a single escape sequence and returns number of bytes processed. +func (r *Lexer) processEscape(data []byte) (int, error) { + if len(data) < 2 { + return 0, fmt.Errorf("syntax error at %v", string(data)) + } + + c := data[1] + switch c { + case '"', '/', '\\': + r.token.byteValue = append(r.token.byteValue, c) + return 2, nil + case 'b': + r.token.byteValue = append(r.token.byteValue, '\b') + return 2, nil + case 'f': + r.token.byteValue = append(r.token.byteValue, '\f') + return 2, nil + case 'n': + r.token.byteValue = append(r.token.byteValue, '\n') + return 2, nil + case 'r': + r.token.byteValue = append(r.token.byteValue, '\r') + return 2, nil + case 't': + r.token.byteValue = append(r.token.byteValue, '\t') + return 2, nil + case 'u': + rr := getu4(data) + if rr < 0 { + return 0, errors.New("syntax error") + } + + read := 6 + if utf16.IsSurrogate(rr) { + rr1 := getu4(data[read:]) + if dec := utf16.DecodeRune(rr, rr1); dec != unicode.ReplacementChar { + read += 6 + rr = dec + } else { + rr = unicode.ReplacementChar + } + } + var d [4]byte + s := utf8.EncodeRune(d[:], rr) + r.token.byteValue = append(r.token.byteValue, d[:s]...) + return read, nil + } + + return 0, errors.New("syntax error") +} + +// fetchString scans a string literal token. +func (r *Lexer) fetchString() { + r.pos++ + data := r.Data[r.pos:] + + isValid, hasEscapes, length := findStringLen(data) + if !isValid { + r.pos += length + r.errParse("unterminated string literal") + return + } + if !hasEscapes { + r.token.byteValue = data[:length] + r.pos += length + 1 + return + } + + r.token.byteValue = make([]byte, 0, length) + p := 0 + for i := 0; i < len(data); { + switch data[i] { + case '"': + r.pos += i + 1 + r.token.byteValue = append(r.token.byteValue, data[p:i]...) + i++ + return + + case '\\': + r.token.byteValue = append(r.token.byteValue, data[p:i]...) + off, err := r.processEscape(data[i:]) + if err != nil { + r.errParse(err.Error()) + return + } + i += off + p = i + + default: + i++ + } + } + r.errParse("unterminated string literal") +} + +// scanToken scans the next token if no token is currently available in the lexer. +func (r *Lexer) scanToken() { + if r.token.kind != tokenUndef || r.fatalError != nil { + return + } + + r.FetchToken() +} + +// consume resets the current token to allow scanning the next one. +func (r *Lexer) consume() { + r.token.kind = tokenUndef + r.token.delimValue = 0 +} + +// Ok returns true if no error (including io.EOF) was encountered during scanning. +func (r *Lexer) Ok() bool { + return r.fatalError == nil +} + +const maxErrorContextLen = 13 + +func (r *Lexer) errParse(what string) { + if r.fatalError == nil { + var str string + if len(r.Data)-r.pos <= maxErrorContextLen { + str = string(r.Data) + } else { + str = string(r.Data[r.pos:r.pos+maxErrorContextLen-3]) + "..." + } + r.fatalError = &LexerError{ + Reason: what, + Offset: r.pos, + Data: str, + } + } +} + +func (r *Lexer) errSyntax() { + r.errParse("syntax error") +} + +func (r *Lexer) errInvalidToken(expected string) { + if r.fatalError != nil { + return + } + if r.UseMultipleErrors { + r.pos = r.start + r.consume() + r.SkipRecursive() + switch expected { + case "[": + r.token.delimValue = ']' + r.token.kind = tokenDelim + case "{": + r.token.delimValue = '}' + r.token.kind = tokenDelim + } + r.addNonfatalError(&LexerError{ + Reason: fmt.Sprintf("expected %s", expected), + Offset: r.start, + Data: string(r.Data[r.start:r.pos]), + }) + return + } + + var str string + if len(r.token.byteValue) <= maxErrorContextLen { + str = string(r.token.byteValue) + } else { + str = string(r.token.byteValue[:maxErrorContextLen-3]) + "..." + } + r.fatalError = &LexerError{ + Reason: fmt.Sprintf("expected %s", expected), + Offset: r.pos, + Data: str, + } +} + +func (r *Lexer) GetPos() int { + return r.pos +} + +// Delim consumes a token and verifies that it is the given delimiter. +func (r *Lexer) Delim(c byte) { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + + if !r.Ok() || r.token.delimValue != c { + r.consume() // errInvalidToken can change token if UseMultipleErrors is enabled. + r.errInvalidToken(string([]byte{c})) + } else { + r.consume() + } +} + +// IsDelim returns true if there was no scanning error and next token is the given delimiter. +func (r *Lexer) IsDelim(c byte) bool { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + return !r.Ok() || r.token.delimValue == c +} + +// Null verifies that the next token is null and consumes it. +func (r *Lexer) Null() { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + if !r.Ok() || r.token.kind != tokenNull { + r.errInvalidToken("null") + } + r.consume() +} + +// IsNull returns true if the next token is a null keyword. +func (r *Lexer) IsNull() bool { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + return r.Ok() && r.token.kind == tokenNull +} + +// Skip skips a single token. +func (r *Lexer) Skip() { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + r.consume() +} + +// SkipRecursive skips next array or object completely, or just skips a single token if not +// an array/object. +// +// Note: no syntax validation is performed on the skipped data. +func (r *Lexer) SkipRecursive() { + r.scanToken() + var start, end byte + + if r.token.delimValue == '{' { + start, end = '{', '}' + } else if r.token.delimValue == '[' { + start, end = '[', ']' + } else { + r.consume() + return + } + + r.consume() + + level := 1 + inQuotes := false + wasEscape := false + + for i, c := range r.Data[r.pos:] { + switch { + case c == start && !inQuotes: + level++ + case c == end && !inQuotes: + level-- + if level == 0 { + r.pos += i + 1 + return + } + case c == '\\' && inQuotes: + wasEscape = !wasEscape + continue + case c == '"' && inQuotes: + inQuotes = wasEscape + case c == '"': + inQuotes = true + } + wasEscape = false + } + r.pos = len(r.Data) + r.fatalError = &LexerError{ + Reason: "EOF reached while skipping array/object or token", + Offset: r.pos, + Data: string(r.Data[r.pos:]), + } +} + +// Raw fetches the next item recursively as a data slice +func (r *Lexer) Raw() []byte { + r.SkipRecursive() + if !r.Ok() { + return nil + } + return r.Data[r.start:r.pos] +} + +// IsStart returns whether the lexer is positioned at the start +// of an input string. +func (r *Lexer) IsStart() bool { + return r.pos == 0 +} + +// Consumed reads all remaining bytes from the input, publishing an error if +// there is anything but whitespace remaining. +func (r *Lexer) Consumed() { + if r.pos > len(r.Data) || !r.Ok() { + return + } + + for _, c := range r.Data[r.pos:] { + if c != ' ' && c != '\t' && c != '\r' && c != '\n' { + r.AddError(&LexerError{ + Reason: "invalid character '" + string(c) + "' after top-level value", + Offset: r.pos, + Data: string(r.Data[r.pos:]), + }) + return + } + + r.pos++ + r.start++ + } +} + +func (r *Lexer) unsafeString() (string, []byte) { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + if !r.Ok() || r.token.kind != tokenString { + r.errInvalidToken("string") + return "", nil + } + bytes := r.token.byteValue + ret := bytesToStr(r.token.byteValue) + r.consume() + return ret, bytes +} + +// UnsafeString returns the string value if the token is a string literal. +// +// Warning: returned string may point to the input buffer, so the string should not outlive +// the input buffer. Intended pattern of usage is as an argument to a switch statement. +func (r *Lexer) UnsafeString() string { + ret, _ := r.unsafeString() + return ret +} + +// UnsafeBytes returns the byte slice if the token is a string literal. +func (r *Lexer) UnsafeBytes() []byte { + _, ret := r.unsafeString() + return ret +} + +// String reads a string literal. +func (r *Lexer) String() string { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + if !r.Ok() || r.token.kind != tokenString { + r.errInvalidToken("string") + return "" + } + ret := string(r.token.byteValue) + r.consume() + return ret +} + +// Bytes reads a string literal and base64 decodes it into a byte slice. +func (r *Lexer) Bytes() []byte { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + if !r.Ok() || r.token.kind != tokenString { + r.errInvalidToken("string") + return nil + } + ret := make([]byte, base64.StdEncoding.DecodedLen(len(r.token.byteValue))) + n, err := base64.StdEncoding.Decode(ret, r.token.byteValue) + if err != nil { + r.fatalError = &LexerError{ + Reason: err.Error(), + } + return nil + } + + r.consume() + return ret[:n] +} + +// Bool reads a true or false boolean keyword. +func (r *Lexer) Bool() bool { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + if !r.Ok() || r.token.kind != tokenBool { + r.errInvalidToken("bool") + return false + } + ret := r.token.boolValue + r.consume() + return ret +} + +func (r *Lexer) number() string { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + if !r.Ok() || r.token.kind != tokenNumber { + r.errInvalidToken("number") + return "" + } + ret := bytesToStr(r.token.byteValue) + r.consume() + return ret +} + +func (r *Lexer) Uint8() uint8 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseUint(s, 10, 8) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return uint8(n) +} + +func (r *Lexer) Uint16() uint16 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseUint(s, 10, 16) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return uint16(n) +} + +func (r *Lexer) Uint32() uint32 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseUint(s, 10, 32) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return uint32(n) +} + +func (r *Lexer) Uint64() uint64 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return n +} + +func (r *Lexer) Uint() uint { + return uint(r.Uint64()) +} + +func (r *Lexer) Int8() int8 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseInt(s, 10, 8) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return int8(n) +} + +func (r *Lexer) Int16() int16 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseInt(s, 10, 16) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return int16(n) +} + +func (r *Lexer) Int32() int32 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseInt(s, 10, 32) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return int32(n) +} + +func (r *Lexer) Int64() int64 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseInt(s, 10, 64) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return n +} + +func (r *Lexer) Int() int { + return int(r.Int64()) +} + +func (r *Lexer) Uint8Str() uint8 { + s, b := r.unsafeString() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseUint(s, 10, 8) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return uint8(n) +} + +func (r *Lexer) Uint16Str() uint16 { + s, b := r.unsafeString() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseUint(s, 10, 16) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return uint16(n) +} + +func (r *Lexer) Uint32Str() uint32 { + s, b := r.unsafeString() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseUint(s, 10, 32) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return uint32(n) +} + +func (r *Lexer) Uint64Str() uint64 { + s, b := r.unsafeString() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return n +} + +func (r *Lexer) UintStr() uint { + return uint(r.Uint64Str()) +} + +func (r *Lexer) UintptrStr() uintptr { + return uintptr(r.Uint64Str()) +} + +func (r *Lexer) Int8Str() int8 { + s, b := r.unsafeString() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseInt(s, 10, 8) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return int8(n) +} + +func (r *Lexer) Int16Str() int16 { + s, b := r.unsafeString() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseInt(s, 10, 16) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return int16(n) +} + +func (r *Lexer) Int32Str() int32 { + s, b := r.unsafeString() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseInt(s, 10, 32) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return int32(n) +} + +func (r *Lexer) Int64Str() int64 { + s, b := r.unsafeString() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseInt(s, 10, 64) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return n +} + +func (r *Lexer) IntStr() int { + return int(r.Int64Str()) +} + +func (r *Lexer) Float32() float32 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseFloat(s, 32) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return float32(n) +} + +func (r *Lexer) Float32Str() float32 { + s, b := r.unsafeString() + if !r.Ok() { + return 0 + } + n, err := strconv.ParseFloat(s, 32) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return float32(n) +} + +func (r *Lexer) Float64() float64 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseFloat(s, 64) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return n +} + +func (r *Lexer) Float64Str() float64 { + s, b := r.unsafeString() + if !r.Ok() { + return 0 + } + n, err := strconv.ParseFloat(s, 64) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return n +} + +func (r *Lexer) Error() error { + return r.fatalError +} + +func (r *Lexer) AddError(e error) { + if r.fatalError == nil { + r.fatalError = e + } +} + +func (r *Lexer) AddNonFatalError(e error) { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Data: string(r.Data[r.start:r.pos]), + Reason: e.Error(), + }) +} + +func (r *Lexer) addNonfatalError(err *LexerError) { + if r.UseMultipleErrors { + // We don't want to add errors with the same offset. + if len(r.multipleErrors) != 0 && r.multipleErrors[len(r.multipleErrors)-1].Offset == err.Offset { + return + } + r.multipleErrors = append(r.multipleErrors, err) + return + } + r.fatalError = err +} + +func (r *Lexer) GetNonFatalErrors() []*LexerError { + return r.multipleErrors +} + +// JsonNumber fetches and json.Number from 'encoding/json' package. +// Both int, float or string, contains them are valid values +func (r *Lexer) JsonNumber() json.Number { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + if !r.Ok() { + r.errInvalidToken("json.Number") + return json.Number("") + } + + switch r.token.kind { + case tokenString: + return json.Number(r.String()) + case tokenNumber: + return json.Number(r.Raw()) + case tokenNull: + r.Null() + return json.Number("") + default: + r.errSyntax() + return json.Number("") + } +} + +// Interface fetches an interface{} analogous to the 'encoding/json' package. +func (r *Lexer) Interface() interface{} { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + + if !r.Ok() { + return nil + } + switch r.token.kind { + case tokenString: + return r.String() + case tokenNumber: + return r.Float64() + case tokenBool: + return r.Bool() + case tokenNull: + r.Null() + return nil + } + + if r.token.delimValue == '{' { + r.consume() + + ret := map[string]interface{}{} + for !r.IsDelim('}') { + key := r.String() + r.WantColon() + ret[key] = r.Interface() + r.WantComma() + } + r.Delim('}') + + if r.Ok() { + return ret + } else { + return nil + } + } else if r.token.delimValue == '[' { + r.consume() + + var ret []interface{} + for !r.IsDelim(']') { + ret = append(ret, r.Interface()) + r.WantComma() + } + r.Delim(']') + + if r.Ok() { + return ret + } else { + return nil + } + } + r.errSyntax() + return nil +} + +// WantComma requires a comma to be present before fetching next token. +func (r *Lexer) WantComma() { + r.wantSep = ',' + r.firstElement = false +} + +// WantColon requires a colon to be present before fetching next token. +func (r *Lexer) WantColon() { + r.wantSep = ':' + r.firstElement = false +} diff --git a/vendor/github.com/mailru/easyjson/jwriter/writer.go b/vendor/github.com/mailru/easyjson/jwriter/writer.go new file mode 100644 index 0000000000..b9ed7ccaa8 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/jwriter/writer.go @@ -0,0 +1,390 @@ +// Package jwriter contains a JSON writer. +package jwriter + +import ( + "io" + "strconv" + "unicode/utf8" + + "github.com/mailru/easyjson/buffer" +) + +// Flags describe various encoding options. The behavior may be actually implemented in the encoder, but +// Flags field in Writer is used to set and pass them around. +type Flags int + +const ( + NilMapAsEmpty Flags = 1 << iota // Encode nil map as '{}' rather than 'null'. + NilSliceAsEmpty // Encode nil slice as '[]' rather than 'null'. +) + +// Writer is a JSON writer. +type Writer struct { + Flags Flags + + Error error + Buffer buffer.Buffer + NoEscapeHTML bool +} + +// Size returns the size of the data that was written out. +func (w *Writer) Size() int { + return w.Buffer.Size() +} + +// DumpTo outputs the data to given io.Writer, resetting the buffer. +func (w *Writer) DumpTo(out io.Writer) (written int, err error) { + return w.Buffer.DumpTo(out) +} + +// BuildBytes returns writer data as a single byte slice. You can optionally provide one byte slice +// as argument that it will try to reuse. +func (w *Writer) BuildBytes(reuse ...[]byte) ([]byte, error) { + if w.Error != nil { + return nil, w.Error + } + + return w.Buffer.BuildBytes(reuse...), nil +} + +// ReadCloser returns an io.ReadCloser that can be used to read the data. +// ReadCloser also resets the buffer. +func (w *Writer) ReadCloser() (io.ReadCloser, error) { + if w.Error != nil { + return nil, w.Error + } + + return w.Buffer.ReadCloser(), nil +} + +// RawByte appends raw binary data to the buffer. +func (w *Writer) RawByte(c byte) { + w.Buffer.AppendByte(c) +} + +// RawByte appends raw binary data to the buffer. +func (w *Writer) RawString(s string) { + w.Buffer.AppendString(s) +} + +// Raw appends raw binary data to the buffer or sets the error if it is given. Useful for +// calling with results of MarshalJSON-like functions. +func (w *Writer) Raw(data []byte, err error) { + switch { + case w.Error != nil: + return + case err != nil: + w.Error = err + case len(data) > 0: + w.Buffer.AppendBytes(data) + default: + w.RawString("null") + } +} + +// RawText encloses raw binary data in quotes and appends in to the buffer. +// Useful for calling with results of MarshalText-like functions. +func (w *Writer) RawText(data []byte, err error) { + switch { + case w.Error != nil: + return + case err != nil: + w.Error = err + case len(data) > 0: + w.String(string(data)) + default: + w.RawString("null") + } +} + +// Base64Bytes appends data to the buffer after base64 encoding it +func (w *Writer) Base64Bytes(data []byte) { + if data == nil { + w.Buffer.AppendString("null") + return + } + w.Buffer.AppendByte('"') + w.base64(data) + w.Buffer.AppendByte('"') +} + +func (w *Writer) Uint8(n uint8) { + w.Buffer.EnsureSpace(3) + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) +} + +func (w *Writer) Uint16(n uint16) { + w.Buffer.EnsureSpace(5) + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) +} + +func (w *Writer) Uint32(n uint32) { + w.Buffer.EnsureSpace(10) + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) +} + +func (w *Writer) Uint(n uint) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) +} + +func (w *Writer) Uint64(n uint64) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, n, 10) +} + +func (w *Writer) Int8(n int8) { + w.Buffer.EnsureSpace(4) + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) +} + +func (w *Writer) Int16(n int16) { + w.Buffer.EnsureSpace(6) + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) +} + +func (w *Writer) Int32(n int32) { + w.Buffer.EnsureSpace(11) + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) +} + +func (w *Writer) Int(n int) { + w.Buffer.EnsureSpace(21) + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) +} + +func (w *Writer) Int64(n int64) { + w.Buffer.EnsureSpace(21) + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, n, 10) +} + +func (w *Writer) Uint8Str(n uint8) { + w.Buffer.EnsureSpace(3) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Uint16Str(n uint16) { + w.Buffer.EnsureSpace(5) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Uint32Str(n uint32) { + w.Buffer.EnsureSpace(10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) UintStr(n uint) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Uint64Str(n uint64) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, n, 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) UintptrStr(n uintptr) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Int8Str(n int8) { + w.Buffer.EnsureSpace(4) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Int16Str(n int16) { + w.Buffer.EnsureSpace(6) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Int32Str(n int32) { + w.Buffer.EnsureSpace(11) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) IntStr(n int) { + w.Buffer.EnsureSpace(21) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Int64Str(n int64) { + w.Buffer.EnsureSpace(21) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, n, 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Float32(n float32) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = strconv.AppendFloat(w.Buffer.Buf, float64(n), 'g', -1, 32) +} + +func (w *Writer) Float32Str(n float32) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendFloat(w.Buffer.Buf, float64(n), 'g', -1, 32) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Float64(n float64) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = strconv.AppendFloat(w.Buffer.Buf, n, 'g', -1, 64) +} + +func (w *Writer) Float64Str(n float64) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendFloat(w.Buffer.Buf, float64(n), 'g', -1, 64) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Bool(v bool) { + w.Buffer.EnsureSpace(5) + if v { + w.Buffer.Buf = append(w.Buffer.Buf, "true"...) + } else { + w.Buffer.Buf = append(w.Buffer.Buf, "false"...) + } +} + +const chars = "0123456789abcdef" + +func isNotEscapedSingleChar(c byte, escapeHTML bool) bool { + // Note: might make sense to use a table if there are more chars to escape. With 4 chars + // it benchmarks the same. + if escapeHTML { + return c != '<' && c != '>' && c != '&' && c != '\\' && c != '"' && c >= 0x20 && c < utf8.RuneSelf + } else { + return c != '\\' && c != '"' && c >= 0x20 && c < utf8.RuneSelf + } +} + +func (w *Writer) String(s string) { + w.Buffer.AppendByte('"') + + // Portions of the string that contain no escapes are appended as + // byte slices. + + p := 0 // last non-escape symbol + + for i := 0; i < len(s); { + c := s[i] + + if isNotEscapedSingleChar(c, !w.NoEscapeHTML) { + // single-width character, no escaping is required + i++ + continue + } else if c < utf8.RuneSelf { + // single-with character, need to escape + w.Buffer.AppendString(s[p:i]) + switch c { + case '\t': + w.Buffer.AppendString(`\t`) + case '\r': + w.Buffer.AppendString(`\r`) + case '\n': + w.Buffer.AppendString(`\n`) + case '\\': + w.Buffer.AppendString(`\\`) + case '"': + w.Buffer.AppendString(`\"`) + default: + w.Buffer.AppendString(`\u00`) + w.Buffer.AppendByte(chars[c>>4]) + w.Buffer.AppendByte(chars[c&0xf]) + } + + i++ + p = i + continue + } + + // broken utf + runeValue, runeWidth := utf8.DecodeRuneInString(s[i:]) + if runeValue == utf8.RuneError && runeWidth == 1 { + w.Buffer.AppendString(s[p:i]) + w.Buffer.AppendString(`\ufffd`) + i++ + p = i + continue + } + + // jsonp stuff - tab separator and line separator + if runeValue == '\u2028' || runeValue == '\u2029' { + w.Buffer.AppendString(s[p:i]) + w.Buffer.AppendString(`\u202`) + w.Buffer.AppendByte(chars[runeValue&0xf]) + i += runeWidth + p = i + continue + } + i += runeWidth + } + w.Buffer.AppendString(s[p:]) + w.Buffer.AppendByte('"') +} + +const encode = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +const padChar = '=' + +func (w *Writer) base64(in []byte) { + + if len(in) == 0 { + return + } + + w.Buffer.EnsureSpace(((len(in)-1)/3 + 1) * 4) + + si := 0 + n := (len(in) / 3) * 3 + + for si < n { + // Convert 3x 8bit source bytes into 4 bytes + val := uint(in[si+0])<<16 | uint(in[si+1])<<8 | uint(in[si+2]) + + w.Buffer.Buf = append(w.Buffer.Buf, encode[val>>18&0x3F], encode[val>>12&0x3F], encode[val>>6&0x3F], encode[val&0x3F]) + + si += 3 + } + + remain := len(in) - si + if remain == 0 { + return + } + + // Add the remaining small block + val := uint(in[si+0]) << 16 + if remain == 2 { + val |= uint(in[si+1]) << 8 + } + + w.Buffer.Buf = append(w.Buffer.Buf, encode[val>>18&0x3F], encode[val>>12&0x3F]) + + switch remain { + case 2: + w.Buffer.Buf = append(w.Buffer.Buf, encode[val>>6&0x3F], byte(padChar)) + case 1: + w.Buffer.Buf = append(w.Buffer.Buf, byte(padChar), byte(padChar)) + } +} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Bool.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Bool.go new file mode 100644 index 0000000000..6978ee9715 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/opt/gotemplate_Bool.go @@ -0,0 +1,79 @@ +// generated by gotemplate + +package opt + +import ( + "fmt" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// template type Optional(A) + +// A 'gotemplate'-based type for providing optional semantics without using pointers. +type Bool struct { + V bool + Defined bool +} + +// Creates an optional type with a given value. +func OBool(v bool) Bool { + return Bool{V: v, Defined: true} +} + +// Get returns the value or given default in the case the value is undefined. +func (v Bool) Get(deflt bool) bool { + if !v.Defined { + return deflt + } + return v.V +} + +// MarshalEasyJSON does JSON marshaling using easyjson interface. +func (v Bool) MarshalEasyJSON(w *jwriter.Writer) { + if v.Defined { + w.Bool(v.V) + } else { + w.RawString("null") + } +} + +// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. +func (v *Bool) UnmarshalEasyJSON(l *jlexer.Lexer) { + if l.IsNull() { + l.Skip() + *v = Bool{} + } else { + v.V = l.Bool() + v.Defined = true + } +} + +// MarshalJSON implements a standard json marshaler interface. +func (v Bool) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + v.MarshalEasyJSON(&w) + return w.Buffer.BuildBytes(), w.Error +} + +// UnmarshalJSON implements a standard json unmarshaler interface. +func (v *Bool) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + v.UnmarshalEasyJSON(&l) + return l.Error() +} + +// IsDefined returns whether the value is defined, a function is required so that it can +// be used in an interface. +func (v Bool) IsDefined() bool { + return v.Defined +} + +// String implements a stringer interface using fmt.Sprint for the value. +func (v Bool) String() string { + if !v.Defined { + return "" + } + return fmt.Sprint(v.V) +} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Float32.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Float32.go new file mode 100644 index 0000000000..643cea359e --- /dev/null +++ b/vendor/github.com/mailru/easyjson/opt/gotemplate_Float32.go @@ -0,0 +1,79 @@ +// generated by gotemplate + +package opt + +import ( + "fmt" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// template type Optional(A) + +// A 'gotemplate'-based type for providing optional semantics without using pointers. +type Float32 struct { + V float32 + Defined bool +} + +// Creates an optional type with a given value. +func OFloat32(v float32) Float32 { + return Float32{V: v, Defined: true} +} + +// Get returns the value or given default in the case the value is undefined. +func (v Float32) Get(deflt float32) float32 { + if !v.Defined { + return deflt + } + return v.V +} + +// MarshalEasyJSON does JSON marshaling using easyjson interface. +func (v Float32) MarshalEasyJSON(w *jwriter.Writer) { + if v.Defined { + w.Float32(v.V) + } else { + w.RawString("null") + } +} + +// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. +func (v *Float32) UnmarshalEasyJSON(l *jlexer.Lexer) { + if l.IsNull() { + l.Skip() + *v = Float32{} + } else { + v.V = l.Float32() + v.Defined = true + } +} + +// MarshalJSON implements a standard json marshaler interface. +func (v Float32) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + v.MarshalEasyJSON(&w) + return w.Buffer.BuildBytes(), w.Error +} + +// UnmarshalJSON implements a standard json unmarshaler interface. +func (v *Float32) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + v.UnmarshalEasyJSON(&l) + return l.Error() +} + +// IsDefined returns whether the value is defined, a function is required so that it can +// be used in an interface. +func (v Float32) IsDefined() bool { + return v.Defined +} + +// String implements a stringer interface using fmt.Sprint for the value. +func (v Float32) String() string { + if !v.Defined { + return "" + } + return fmt.Sprint(v.V) +} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Float64.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Float64.go new file mode 100644 index 0000000000..75ae727578 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/opt/gotemplate_Float64.go @@ -0,0 +1,79 @@ +// generated by gotemplate + +package opt + +import ( + "fmt" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// template type Optional(A) + +// A 'gotemplate'-based type for providing optional semantics without using pointers. +type Float64 struct { + V float64 + Defined bool +} + +// Creates an optional type with a given value. +func OFloat64(v float64) Float64 { + return Float64{V: v, Defined: true} +} + +// Get returns the value or given default in the case the value is undefined. +func (v Float64) Get(deflt float64) float64 { + if !v.Defined { + return deflt + } + return v.V +} + +// MarshalEasyJSON does JSON marshaling using easyjson interface. +func (v Float64) MarshalEasyJSON(w *jwriter.Writer) { + if v.Defined { + w.Float64(v.V) + } else { + w.RawString("null") + } +} + +// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. +func (v *Float64) UnmarshalEasyJSON(l *jlexer.Lexer) { + if l.IsNull() { + l.Skip() + *v = Float64{} + } else { + v.V = l.Float64() + v.Defined = true + } +} + +// MarshalJSON implements a standard json marshaler interface. +func (v Float64) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + v.MarshalEasyJSON(&w) + return w.Buffer.BuildBytes(), w.Error +} + +// UnmarshalJSON implements a standard json unmarshaler interface. +func (v *Float64) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + v.UnmarshalEasyJSON(&l) + return l.Error() +} + +// IsDefined returns whether the value is defined, a function is required so that it can +// be used in an interface. +func (v Float64) IsDefined() bool { + return v.Defined +} + +// String implements a stringer interface using fmt.Sprint for the value. +func (v Float64) String() string { + if !v.Defined { + return "" + } + return fmt.Sprint(v.V) +} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Int.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Int.go new file mode 100644 index 0000000000..469742fee9 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/opt/gotemplate_Int.go @@ -0,0 +1,79 @@ +// generated by gotemplate + +package opt + +import ( + "fmt" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// template type Optional(A) + +// A 'gotemplate'-based type for providing optional semantics without using pointers. +type Int struct { + V int + Defined bool +} + +// Creates an optional type with a given value. +func OInt(v int) Int { + return Int{V: v, Defined: true} +} + +// Get returns the value or given default in the case the value is undefined. +func (v Int) Get(deflt int) int { + if !v.Defined { + return deflt + } + return v.V +} + +// MarshalEasyJSON does JSON marshaling using easyjson interface. +func (v Int) MarshalEasyJSON(w *jwriter.Writer) { + if v.Defined { + w.Int(v.V) + } else { + w.RawString("null") + } +} + +// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. +func (v *Int) UnmarshalEasyJSON(l *jlexer.Lexer) { + if l.IsNull() { + l.Skip() + *v = Int{} + } else { + v.V = l.Int() + v.Defined = true + } +} + +// MarshalJSON implements a standard json marshaler interface. +func (v Int) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + v.MarshalEasyJSON(&w) + return w.Buffer.BuildBytes(), w.Error +} + +// UnmarshalJSON implements a standard json unmarshaler interface. +func (v *Int) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + v.UnmarshalEasyJSON(&l) + return l.Error() +} + +// IsDefined returns whether the value is defined, a function is required so that it can +// be used in an interface. +func (v Int) IsDefined() bool { + return v.Defined +} + +// String implements a stringer interface using fmt.Sprint for the value. +func (v Int) String() string { + if !v.Defined { + return "" + } + return fmt.Sprint(v.V) +} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Int16.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Int16.go new file mode 100644 index 0000000000..b7723e2416 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/opt/gotemplate_Int16.go @@ -0,0 +1,79 @@ +// generated by gotemplate + +package opt + +import ( + "fmt" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// template type Optional(A) + +// A 'gotemplate'-based type for providing optional semantics without using pointers. +type Int16 struct { + V int16 + Defined bool +} + +// Creates an optional type with a given value. +func OInt16(v int16) Int16 { + return Int16{V: v, Defined: true} +} + +// Get returns the value or given default in the case the value is undefined. +func (v Int16) Get(deflt int16) int16 { + if !v.Defined { + return deflt + } + return v.V +} + +// MarshalEasyJSON does JSON marshaling using easyjson interface. +func (v Int16) MarshalEasyJSON(w *jwriter.Writer) { + if v.Defined { + w.Int16(v.V) + } else { + w.RawString("null") + } +} + +// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. +func (v *Int16) UnmarshalEasyJSON(l *jlexer.Lexer) { + if l.IsNull() { + l.Skip() + *v = Int16{} + } else { + v.V = l.Int16() + v.Defined = true + } +} + +// MarshalJSON implements a standard json marshaler interface. +func (v Int16) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + v.MarshalEasyJSON(&w) + return w.Buffer.BuildBytes(), w.Error +} + +// UnmarshalJSON implements a standard json unmarshaler interface. +func (v *Int16) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + v.UnmarshalEasyJSON(&l) + return l.Error() +} + +// IsDefined returns whether the value is defined, a function is required so that it can +// be used in an interface. +func (v Int16) IsDefined() bool { + return v.Defined +} + +// String implements a stringer interface using fmt.Sprint for the value. +func (v Int16) String() string { + if !v.Defined { + return "" + } + return fmt.Sprint(v.V) +} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Int32.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Int32.go new file mode 100644 index 0000000000..7c7637a381 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/opt/gotemplate_Int32.go @@ -0,0 +1,79 @@ +// generated by gotemplate + +package opt + +import ( + "fmt" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// template type Optional(A) + +// A 'gotemplate'-based type for providing optional semantics without using pointers. +type Int32 struct { + V int32 + Defined bool +} + +// Creates an optional type with a given value. +func OInt32(v int32) Int32 { + return Int32{V: v, Defined: true} +} + +// Get returns the value or given default in the case the value is undefined. +func (v Int32) Get(deflt int32) int32 { + if !v.Defined { + return deflt + } + return v.V +} + +// MarshalEasyJSON does JSON marshaling using easyjson interface. +func (v Int32) MarshalEasyJSON(w *jwriter.Writer) { + if v.Defined { + w.Int32(v.V) + } else { + w.RawString("null") + } +} + +// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. +func (v *Int32) UnmarshalEasyJSON(l *jlexer.Lexer) { + if l.IsNull() { + l.Skip() + *v = Int32{} + } else { + v.V = l.Int32() + v.Defined = true + } +} + +// MarshalJSON implements a standard json marshaler interface. +func (v Int32) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + v.MarshalEasyJSON(&w) + return w.Buffer.BuildBytes(), w.Error +} + +// UnmarshalJSON implements a standard json unmarshaler interface. +func (v *Int32) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + v.UnmarshalEasyJSON(&l) + return l.Error() +} + +// IsDefined returns whether the value is defined, a function is required so that it can +// be used in an interface. +func (v Int32) IsDefined() bool { + return v.Defined +} + +// String implements a stringer interface using fmt.Sprint for the value. +func (v Int32) String() string { + if !v.Defined { + return "" + } + return fmt.Sprint(v.V) +} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Int64.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Int64.go new file mode 100644 index 0000000000..e6ea6dc41e --- /dev/null +++ b/vendor/github.com/mailru/easyjson/opt/gotemplate_Int64.go @@ -0,0 +1,79 @@ +// generated by gotemplate + +package opt + +import ( + "fmt" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// template type Optional(A) + +// A 'gotemplate'-based type for providing optional semantics without using pointers. +type Int64 struct { + V int64 + Defined bool +} + +// Creates an optional type with a given value. +func OInt64(v int64) Int64 { + return Int64{V: v, Defined: true} +} + +// Get returns the value or given default in the case the value is undefined. +func (v Int64) Get(deflt int64) int64 { + if !v.Defined { + return deflt + } + return v.V +} + +// MarshalEasyJSON does JSON marshaling using easyjson interface. +func (v Int64) MarshalEasyJSON(w *jwriter.Writer) { + if v.Defined { + w.Int64(v.V) + } else { + w.RawString("null") + } +} + +// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. +func (v *Int64) UnmarshalEasyJSON(l *jlexer.Lexer) { + if l.IsNull() { + l.Skip() + *v = Int64{} + } else { + v.V = l.Int64() + v.Defined = true + } +} + +// MarshalJSON implements a standard json marshaler interface. +func (v Int64) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + v.MarshalEasyJSON(&w) + return w.Buffer.BuildBytes(), w.Error +} + +// UnmarshalJSON implements a standard json unmarshaler interface. +func (v *Int64) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + v.UnmarshalEasyJSON(&l) + return l.Error() +} + +// IsDefined returns whether the value is defined, a function is required so that it can +// be used in an interface. +func (v Int64) IsDefined() bool { + return v.Defined +} + +// String implements a stringer interface using fmt.Sprint for the value. +func (v Int64) String() string { + if !v.Defined { + return "" + } + return fmt.Sprint(v.V) +} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Int8.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Int8.go new file mode 100644 index 0000000000..ddc666580b --- /dev/null +++ b/vendor/github.com/mailru/easyjson/opt/gotemplate_Int8.go @@ -0,0 +1,79 @@ +// generated by gotemplate + +package opt + +import ( + "fmt" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// template type Optional(A) + +// A 'gotemplate'-based type for providing optional semantics without using pointers. +type Int8 struct { + V int8 + Defined bool +} + +// Creates an optional type with a given value. +func OInt8(v int8) Int8 { + return Int8{V: v, Defined: true} +} + +// Get returns the value or given default in the case the value is undefined. +func (v Int8) Get(deflt int8) int8 { + if !v.Defined { + return deflt + } + return v.V +} + +// MarshalEasyJSON does JSON marshaling using easyjson interface. +func (v Int8) MarshalEasyJSON(w *jwriter.Writer) { + if v.Defined { + w.Int8(v.V) + } else { + w.RawString("null") + } +} + +// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. +func (v *Int8) UnmarshalEasyJSON(l *jlexer.Lexer) { + if l.IsNull() { + l.Skip() + *v = Int8{} + } else { + v.V = l.Int8() + v.Defined = true + } +} + +// MarshalJSON implements a standard json marshaler interface. +func (v Int8) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + v.MarshalEasyJSON(&w) + return w.Buffer.BuildBytes(), w.Error +} + +// UnmarshalJSON implements a standard json unmarshaler interface. +func (v *Int8) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + v.UnmarshalEasyJSON(&l) + return l.Error() +} + +// IsDefined returns whether the value is defined, a function is required so that it can +// be used in an interface. +func (v Int8) IsDefined() bool { + return v.Defined +} + +// String implements a stringer interface using fmt.Sprint for the value. +func (v Int8) String() string { + if !v.Defined { + return "" + } + return fmt.Sprint(v.V) +} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_String.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_String.go new file mode 100644 index 0000000000..11c90b4ed5 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/opt/gotemplate_String.go @@ -0,0 +1,79 @@ +// generated by gotemplate + +package opt + +import ( + "fmt" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// template type Optional(A) + +// A 'gotemplate'-based type for providing optional semantics without using pointers. +type String struct { + V string + Defined bool +} + +// Creates an optional type with a given value. +func OString(v string) String { + return String{V: v, Defined: true} +} + +// Get returns the value or given default in the case the value is undefined. +func (v String) Get(deflt string) string { + if !v.Defined { + return deflt + } + return v.V +} + +// MarshalEasyJSON does JSON marshaling using easyjson interface. +func (v String) MarshalEasyJSON(w *jwriter.Writer) { + if v.Defined { + w.String(v.V) + } else { + w.RawString("null") + } +} + +// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. +func (v *String) UnmarshalEasyJSON(l *jlexer.Lexer) { + if l.IsNull() { + l.Skip() + *v = String{} + } else { + v.V = l.String() + v.Defined = true + } +} + +// MarshalJSON implements a standard json marshaler interface. +func (v String) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + v.MarshalEasyJSON(&w) + return w.Buffer.BuildBytes(), w.Error +} + +// UnmarshalJSON implements a standard json unmarshaler interface. +func (v *String) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + v.UnmarshalEasyJSON(&l) + return l.Error() +} + +// IsDefined returns whether the value is defined, a function is required so that it can +// be used in an interface. +func (v String) IsDefined() bool { + return v.Defined +} + +// String implements a stringer interface using fmt.Sprint for the value. +func (v String) String() string { + if !v.Defined { + return "" + } + return fmt.Sprint(v.V) +} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint.go new file mode 100644 index 0000000000..57efd3185a --- /dev/null +++ b/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint.go @@ -0,0 +1,79 @@ +// generated by gotemplate + +package opt + +import ( + "fmt" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// template type Optional(A) + +// A 'gotemplate'-based type for providing optional semantics without using pointers. +type Uint struct { + V uint + Defined bool +} + +// Creates an optional type with a given value. +func OUint(v uint) Uint { + return Uint{V: v, Defined: true} +} + +// Get returns the value or given default in the case the value is undefined. +func (v Uint) Get(deflt uint) uint { + if !v.Defined { + return deflt + } + return v.V +} + +// MarshalEasyJSON does JSON marshaling using easyjson interface. +func (v Uint) MarshalEasyJSON(w *jwriter.Writer) { + if v.Defined { + w.Uint(v.V) + } else { + w.RawString("null") + } +} + +// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. +func (v *Uint) UnmarshalEasyJSON(l *jlexer.Lexer) { + if l.IsNull() { + l.Skip() + *v = Uint{} + } else { + v.V = l.Uint() + v.Defined = true + } +} + +// MarshalJSON implements a standard json marshaler interface. +func (v Uint) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + v.MarshalEasyJSON(&w) + return w.Buffer.BuildBytes(), w.Error +} + +// UnmarshalJSON implements a standard json unmarshaler interface. +func (v *Uint) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + v.UnmarshalEasyJSON(&l) + return l.Error() +} + +// IsDefined returns whether the value is defined, a function is required so that it can +// be used in an interface. +func (v Uint) IsDefined() bool { + return v.Defined +} + +// String implements a stringer interface using fmt.Sprint for the value. +func (v Uint) String() string { + if !v.Defined { + return "" + } + return fmt.Sprint(v.V) +} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint16.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint16.go new file mode 100644 index 0000000000..f28e1d2ef2 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint16.go @@ -0,0 +1,79 @@ +// generated by gotemplate + +package opt + +import ( + "fmt" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// template type Optional(A) + +// A 'gotemplate'-based type for providing optional semantics without using pointers. +type Uint16 struct { + V uint16 + Defined bool +} + +// Creates an optional type with a given value. +func OUint16(v uint16) Uint16 { + return Uint16{V: v, Defined: true} +} + +// Get returns the value or given default in the case the value is undefined. +func (v Uint16) Get(deflt uint16) uint16 { + if !v.Defined { + return deflt + } + return v.V +} + +// MarshalEasyJSON does JSON marshaling using easyjson interface. +func (v Uint16) MarshalEasyJSON(w *jwriter.Writer) { + if v.Defined { + w.Uint16(v.V) + } else { + w.RawString("null") + } +} + +// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. +func (v *Uint16) UnmarshalEasyJSON(l *jlexer.Lexer) { + if l.IsNull() { + l.Skip() + *v = Uint16{} + } else { + v.V = l.Uint16() + v.Defined = true + } +} + +// MarshalJSON implements a standard json marshaler interface. +func (v Uint16) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + v.MarshalEasyJSON(&w) + return w.Buffer.BuildBytes(), w.Error +} + +// UnmarshalJSON implements a standard json unmarshaler interface. +func (v *Uint16) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + v.UnmarshalEasyJSON(&l) + return l.Error() +} + +// IsDefined returns whether the value is defined, a function is required so that it can +// be used in an interface. +func (v Uint16) IsDefined() bool { + return v.Defined +} + +// String implements a stringer interface using fmt.Sprint for the value. +func (v Uint16) String() string { + if !v.Defined { + return "" + } + return fmt.Sprint(v.V) +} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint32.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint32.go new file mode 100644 index 0000000000..9fb95c0db8 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint32.go @@ -0,0 +1,79 @@ +// generated by gotemplate + +package opt + +import ( + "fmt" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// template type Optional(A) + +// A 'gotemplate'-based type for providing optional semantics without using pointers. +type Uint32 struct { + V uint32 + Defined bool +} + +// Creates an optional type with a given value. +func OUint32(v uint32) Uint32 { + return Uint32{V: v, Defined: true} +} + +// Get returns the value or given default in the case the value is undefined. +func (v Uint32) Get(deflt uint32) uint32 { + if !v.Defined { + return deflt + } + return v.V +} + +// MarshalEasyJSON does JSON marshaling using easyjson interface. +func (v Uint32) MarshalEasyJSON(w *jwriter.Writer) { + if v.Defined { + w.Uint32(v.V) + } else { + w.RawString("null") + } +} + +// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. +func (v *Uint32) UnmarshalEasyJSON(l *jlexer.Lexer) { + if l.IsNull() { + l.Skip() + *v = Uint32{} + } else { + v.V = l.Uint32() + v.Defined = true + } +} + +// MarshalJSON implements a standard json marshaler interface. +func (v Uint32) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + v.MarshalEasyJSON(&w) + return w.Buffer.BuildBytes(), w.Error +} + +// UnmarshalJSON implements a standard json unmarshaler interface. +func (v *Uint32) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + v.UnmarshalEasyJSON(&l) + return l.Error() +} + +// IsDefined returns whether the value is defined, a function is required so that it can +// be used in an interface. +func (v Uint32) IsDefined() bool { + return v.Defined +} + +// String implements a stringer interface using fmt.Sprint for the value. +func (v Uint32) String() string { + if !v.Defined { + return "" + } + return fmt.Sprint(v.V) +} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint64.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint64.go new file mode 100644 index 0000000000..0e623c62d4 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint64.go @@ -0,0 +1,79 @@ +// generated by gotemplate + +package opt + +import ( + "fmt" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// template type Optional(A) + +// A 'gotemplate'-based type for providing optional semantics without using pointers. +type Uint64 struct { + V uint64 + Defined bool +} + +// Creates an optional type with a given value. +func OUint64(v uint64) Uint64 { + return Uint64{V: v, Defined: true} +} + +// Get returns the value or given default in the case the value is undefined. +func (v Uint64) Get(deflt uint64) uint64 { + if !v.Defined { + return deflt + } + return v.V +} + +// MarshalEasyJSON does JSON marshaling using easyjson interface. +func (v Uint64) MarshalEasyJSON(w *jwriter.Writer) { + if v.Defined { + w.Uint64(v.V) + } else { + w.RawString("null") + } +} + +// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. +func (v *Uint64) UnmarshalEasyJSON(l *jlexer.Lexer) { + if l.IsNull() { + l.Skip() + *v = Uint64{} + } else { + v.V = l.Uint64() + v.Defined = true + } +} + +// MarshalJSON implements a standard json marshaler interface. +func (v Uint64) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + v.MarshalEasyJSON(&w) + return w.Buffer.BuildBytes(), w.Error +} + +// UnmarshalJSON implements a standard json unmarshaler interface. +func (v *Uint64) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + v.UnmarshalEasyJSON(&l) + return l.Error() +} + +// IsDefined returns whether the value is defined, a function is required so that it can +// be used in an interface. +func (v Uint64) IsDefined() bool { + return v.Defined +} + +// String implements a stringer interface using fmt.Sprint for the value. +func (v Uint64) String() string { + if !v.Defined { + return "" + } + return fmt.Sprint(v.V) +} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint8.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint8.go new file mode 100644 index 0000000000..c629e4453a --- /dev/null +++ b/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint8.go @@ -0,0 +1,79 @@ +// generated by gotemplate + +package opt + +import ( + "fmt" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// template type Optional(A) + +// A 'gotemplate'-based type for providing optional semantics without using pointers. +type Uint8 struct { + V uint8 + Defined bool +} + +// Creates an optional type with a given value. +func OUint8(v uint8) Uint8 { + return Uint8{V: v, Defined: true} +} + +// Get returns the value or given default in the case the value is undefined. +func (v Uint8) Get(deflt uint8) uint8 { + if !v.Defined { + return deflt + } + return v.V +} + +// MarshalEasyJSON does JSON marshaling using easyjson interface. +func (v Uint8) MarshalEasyJSON(w *jwriter.Writer) { + if v.Defined { + w.Uint8(v.V) + } else { + w.RawString("null") + } +} + +// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. +func (v *Uint8) UnmarshalEasyJSON(l *jlexer.Lexer) { + if l.IsNull() { + l.Skip() + *v = Uint8{} + } else { + v.V = l.Uint8() + v.Defined = true + } +} + +// MarshalJSON implements a standard json marshaler interface. +func (v Uint8) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + v.MarshalEasyJSON(&w) + return w.Buffer.BuildBytes(), w.Error +} + +// UnmarshalJSON implements a standard json unmarshaler interface. +func (v *Uint8) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + v.UnmarshalEasyJSON(&l) + return l.Error() +} + +// IsDefined returns whether the value is defined, a function is required so that it can +// be used in an interface. +func (v Uint8) IsDefined() bool { + return v.Defined +} + +// String implements a stringer interface using fmt.Sprint for the value. +func (v Uint8) String() string { + if !v.Defined { + return "" + } + return fmt.Sprint(v.V) +} diff --git a/vendor/github.com/mailru/easyjson/opt/optional/opt.go b/vendor/github.com/mailru/easyjson/opt/optional/opt.go new file mode 100644 index 0000000000..277dd1a3bc --- /dev/null +++ b/vendor/github.com/mailru/easyjson/opt/optional/opt.go @@ -0,0 +1,80 @@ +// +build none + +package optional + +import ( + "fmt" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// template type Optional(A) +type A int + +// A 'gotemplate'-based type for providing optional semantics without using pointers. +type Optional struct { + V A + Defined bool +} + +// Creates an optional type with a given value. +func OOptional(v A) Optional { + return Optional{V: v, Defined: true} +} + +// Get returns the value or given default in the case the value is undefined. +func (v Optional) Get(deflt A) A { + if !v.Defined { + return deflt + } + return v.V +} + +// MarshalEasyJSON does JSON marshaling using easyjson interface. +func (v Optional) MarshalEasyJSON(w *jwriter.Writer) { + if v.Defined { + w.Optional(v.V) + } else { + w.RawString("null") + } +} + +// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. +func (v *Optional) UnmarshalEasyJSON(l *jlexer.Lexer) { + if l.IsNull() { + l.Skip() + *v = Optional{} + } else { + v.V = l.Optional() + v.Defined = true + } +} + +// MarshalJSON implements a standard json marshaler interface. +func (v Optional) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + v.MarshalEasyJSON(&w) + return w.Buffer.BuildBytes(), w.Error +} + +// UnmarshalJSON implements a standard json unmarshaler interface. +func (v *Optional) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + v.UnmarshalEasyJSON(&l) + return l.Error() +} + +// IsDefined returns whether the value is defined, a function is required so that it can +// be used in an interface. +func (v Optional) IsDefined() bool { + return v.Defined +} + +// String implements a stringer interface using fmt.Sprint for the value. +func (v Optional) String() string { + if !v.Defined { + return "" + } + return fmt.Sprint(v.V) +} diff --git a/vendor/github.com/mailru/easyjson/opt/opts.go b/vendor/github.com/mailru/easyjson/opt/opts.go new file mode 100644 index 0000000000..3617f7f9f5 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/opt/opts.go @@ -0,0 +1,22 @@ +package opt + +//go:generate sed -i "s/\\+build none/generated by gotemplate/" optional/opt.go +//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Int(int) +//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Uint(uint) + +//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Int8(int8) +//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Int16(int16) +//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Int32(int32) +//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Int64(int64) + +//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Uint8(uint8) +//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Uint16(uint16) +//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Uint32(uint32) +//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Uint64(uint64) + +//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Float32(float32) +//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Float64(float64) + +//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Bool(bool) +//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" String(string) +//go:generate sed -i "s/generated by gotemplate/+build none/" optional/opt.go diff --git a/vendor/github.com/mailru/easyjson/parser/parser.go b/vendor/github.com/mailru/easyjson/parser/parser.go new file mode 100644 index 0000000000..3639ed06b6 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/parser/parser.go @@ -0,0 +1,98 @@ +package parser + +import ( + "bytes" + "go/ast" + "go/parser" + "go/token" + "os/exec" + "strings" +) + +const structComment = "easyjson:json" + +type Parser struct { + PkgPath string + PkgName string + StructNames []string + AllStructs bool +} + +type visitor struct { + *Parser + + name string + explicit bool +} + +func (p *Parser) needType(comments string) bool { + for _, v := range strings.Split(comments, "\n") { + if strings.HasPrefix(v, structComment) { + return true + } + } + return false +} + +func (v *visitor) Visit(n ast.Node) (w ast.Visitor) { + switch n := n.(type) { + case *ast.Package: + return v + case *ast.File: + v.PkgName = n.Name.String() + return v + + case *ast.GenDecl: + v.explicit = v.needType(n.Doc.Text()) + + if !v.explicit && !v.AllStructs { + return nil + } + return v + case *ast.TypeSpec: + v.name = n.Name.String() + + // Allow to specify non-structs explicitly independent of '-all' flag. + if v.explicit { + v.StructNames = append(v.StructNames, v.name) + return nil + } + return v + case *ast.StructType: + v.StructNames = append(v.StructNames, v.name) + return nil + } + return nil +} + +func (p *Parser) Parse(fname string, isDir bool) error { + var err error + if p.PkgPath, err = getPkgPath(fname, isDir); err != nil { + return err + } + + fset := token.NewFileSet() + if isDir { + packages, err := parser.ParseDir(fset, fname, nil, parser.ParseComments) + if err != nil { + return err + } + + for _, pckg := range packages { + ast.Walk(&visitor{Parser: p}, pckg) + } + } else { + f, err := parser.ParseFile(fset, fname, nil, parser.ParseComments) + if err != nil { + return err + } + + ast.Walk(&visitor{Parser: p}, f) + } + return nil +} + +func getDefaultGoPath() (string, error) { + output, err := exec.Command("go", "env", "GOPATH").Output() + return string(bytes.TrimSpace(output)), err +} diff --git a/vendor/github.com/mailru/easyjson/parser/pkgpath.go b/vendor/github.com/mailru/easyjson/parser/pkgpath.go new file mode 100644 index 0000000000..155d1684d8 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/parser/pkgpath.go @@ -0,0 +1,171 @@ +package parser + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "os/exec" + "path" + "path/filepath" + "strconv" + "strings" + "sync" +) + +func getPkgPath(fname string, isDir bool) (string, error) { + if !filepath.IsAbs(fname) { + pwd, err := os.Getwd() + if err != nil { + return "", err + } + fname = filepath.Join(pwd, fname) + } + + goModPath, _ := goModPath(fname, isDir) + if strings.Contains(goModPath, "go.mod") { + pkgPath, err := getPkgPathFromGoMod(fname, isDir, goModPath) + if err != nil { + return "", err + } + + return pkgPath, nil + } + + return getPkgPathFromGOPATH(fname, isDir) +} + +var goModPathCache = struct { + paths map[string]string + sync.RWMutex +}{ + paths: make(map[string]string), +} + +// empty if no go.mod, GO111MODULE=off or go without go modules support +func goModPath(fname string, isDir bool) (string, error) { + root := fname + if !isDir { + root = filepath.Dir(fname) + } + + goModPathCache.RLock() + goModPath, ok := goModPathCache.paths[root] + goModPathCache.RUnlock() + if ok { + return goModPath, nil + } + + defer func() { + goModPathCache.Lock() + goModPathCache.paths[root] = goModPath + goModPathCache.Unlock() + }() + + cmd := exec.Command("go", "env", "GOMOD") + cmd.Dir = root + + stdout, err := cmd.Output() + if err != nil { + return "", err + } + + goModPath = string(bytes.TrimSpace(stdout)) + + return goModPath, nil +} + +func getPkgPathFromGoMod(fname string, isDir bool, goModPath string) (string, error) { + modulePath := getModulePath(goModPath) + if modulePath == "" { + return "", fmt.Errorf("cannot determine module path from %s", goModPath) + } + + rel := path.Join(modulePath, filePathToPackagePath(strings.TrimPrefix(fname, filepath.Dir(goModPath)))) + + if !isDir { + return path.Dir(rel), nil + } + + return path.Clean(rel), nil +} + +var ( + modulePrefix = []byte("\nmodule ") + pkgPathFromGoModCache = make(map[string]string) +) + +func getModulePath(goModPath string) string { + pkgPath, ok := pkgPathFromGoModCache[goModPath] + if ok { + return pkgPath + } + + defer func() { + pkgPathFromGoModCache[goModPath] = pkgPath + }() + + data, err := ioutil.ReadFile(goModPath) + if err != nil { + return "" + } + var i int + if bytes.HasPrefix(data, modulePrefix[1:]) { + i = 0 + } else { + i = bytes.Index(data, modulePrefix) + if i < 0 { + return "" + } + i++ + } + line := data[i:] + + // Cut line at \n, drop trailing \r if present. + if j := bytes.IndexByte(line, '\n'); j >= 0 { + line = line[:j] + } + if line[len(line)-1] == '\r' { + line = line[:len(line)-1] + } + line = line[len("module "):] + + // If quoted, unquote. + pkgPath = strings.TrimSpace(string(line)) + if pkgPath != "" && pkgPath[0] == '"' { + s, err := strconv.Unquote(pkgPath) + if err != nil { + return "" + } + pkgPath = s + } + return pkgPath +} + +func getPkgPathFromGOPATH(fname string, isDir bool) (string, error) { + gopath := os.Getenv("GOPATH") + if gopath == "" { + var err error + gopath, err = getDefaultGoPath() + if err != nil { + return "", fmt.Errorf("cannot determine GOPATH: %s", err) + } + } + + for _, p := range strings.Split(gopath, string(filepath.ListSeparator)) { + prefix := filepath.Join(p, "src") + string(filepath.Separator) + if rel := strings.TrimPrefix(fname, prefix); rel != fname { + if !isDir { + return path.Dir(filePathToPackagePath(rel)), nil + } else { + return path.Clean(filePathToPackagePath(rel)), nil + } + } + } + + return "", fmt.Errorf("file '%v' is not in GOPATH", fname) +} + +func filePathToPackagePath(path string) string { + return filepath.ToSlash(path) +} diff --git a/vendor/github.com/mailru/easyjson/raw.go b/vendor/github.com/mailru/easyjson/raw.go new file mode 100644 index 0000000000..81bd002e19 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/raw.go @@ -0,0 +1,45 @@ +package easyjson + +import ( + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// RawMessage is a raw piece of JSON (number, string, bool, object, array or +// null) that is extracted without parsing and output as is during marshaling. +type RawMessage []byte + +// MarshalEasyJSON does JSON marshaling using easyjson interface. +func (v *RawMessage) MarshalEasyJSON(w *jwriter.Writer) { + if len(*v) == 0 { + w.RawString("null") + } else { + w.Raw(*v, nil) + } +} + +// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. +func (v *RawMessage) UnmarshalEasyJSON(l *jlexer.Lexer) { + *v = RawMessage(l.Raw()) +} + +// UnmarshalJSON implements encoding/json.Unmarshaler interface. +func (v *RawMessage) UnmarshalJSON(data []byte) error { + *v = data + return nil +} + +var nullBytes = []byte("null") + +// MarshalJSON implements encoding/json.Marshaler interface. +func (v RawMessage) MarshalJSON() ([]byte, error) { + if len(v) == 0 { + return nullBytes, nil + } + return v, nil +} + +// IsDefined is required for integration with omitempty easyjson logic. +func (v *RawMessage) IsDefined() bool { + return len(*v) > 0 +} diff --git a/vendor/github.com/mailru/easyjson/tests/custom_map_key_type.go b/vendor/github.com/mailru/easyjson/tests/custom_map_key_type.go new file mode 100644 index 0000000000..099bd06dc5 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/tests/custom_map_key_type.go @@ -0,0 +1,29 @@ +package tests + +import fmt "fmt" + +//easyjson:json +type CustomMapKeyType struct { + Map map[customKeyType]int +} + +type customKeyType [2]byte + +func (k customKeyType) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%02x"`, k)), nil +} + +func (k *customKeyType) UnmarshalJSON(b []byte) error { + _, err := fmt.Sscanf(string(b), `"%02x%02x"`, &k[0], &k[1]) + return err +} + +var customMapKeyTypeValue CustomMapKeyType + +func init() { + customMapKeyTypeValue.Map = map[customKeyType]int{ + customKeyType{0x01, 0x02}: 3, + } +} + +var customMapKeyTypeValueString = `{"Map":{"0102":3}}` diff --git a/vendor/github.com/mailru/easyjson/tests/data.go b/vendor/github.com/mailru/easyjson/tests/data.go new file mode 100644 index 0000000000..6ae90a0db0 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/tests/data.go @@ -0,0 +1,802 @@ +package tests + +import ( + "fmt" + "math" + "net" + "time" + + "github.com/mailru/easyjson" + "github.com/mailru/easyjson/opt" +) + +type PrimitiveTypes struct { + String string + Bool bool + + Int int + Int8 int8 + Int16 int16 + Int32 int32 + Int64 int64 + + Uint uint + Uint8 uint8 + Uint16 uint16 + Uint32 uint32 + Uint64 uint64 + + IntString int `json:",string"` + Int8String int8 `json:",string"` + Int16String int16 `json:",string"` + Int32String int32 `json:",string"` + Int64String int64 `json:",string"` + + UintString uint `json:",string"` + Uint8String uint8 `json:",string"` + Uint16String uint16 `json:",string"` + Uint32String uint32 `json:",string"` + Uint64String uint64 `json:",string"` + + Float32 float32 + Float64 float64 + + Float32String float32 `json:",string"` + Float64String float64 `json:",string"` + + Ptr *string + PtrNil *string +} + +var str = "bla" + +var primitiveTypesValue = PrimitiveTypes{ + String: "test", Bool: true, + + Int: math.MinInt32, + Int8: math.MinInt8, + Int16: math.MinInt16, + Int32: math.MinInt32, + Int64: math.MinInt64, + + Uint: math.MaxUint32, + Uint8: math.MaxUint8, + Uint16: math.MaxUint16, + Uint32: math.MaxUint32, + Uint64: math.MaxUint64, + + IntString: math.MinInt32, + Int8String: math.MinInt8, + Int16String: math.MinInt16, + Int32String: math.MinInt32, + Int64String: math.MinInt64, + + UintString: math.MaxUint32, + Uint8String: math.MaxUint8, + Uint16String: math.MaxUint16, + Uint32String: math.MaxUint32, + Uint64String: math.MaxUint64, + + Float32: 1.5, + Float64: math.MaxFloat64, + + Float32String: 1.5, + Float64String: math.MaxFloat64, + + Ptr: &str, +} + +var primitiveTypesString = "{" + + `"String":"test","Bool":true,` + + + `"Int":` + fmt.Sprint(math.MinInt32) + `,` + + `"Int8":` + fmt.Sprint(math.MinInt8) + `,` + + `"Int16":` + fmt.Sprint(math.MinInt16) + `,` + + `"Int32":` + fmt.Sprint(math.MinInt32) + `,` + + `"Int64":` + fmt.Sprint(int64(math.MinInt64)) + `,` + + + `"Uint":` + fmt.Sprint(uint32(math.MaxUint32)) + `,` + + `"Uint8":` + fmt.Sprint(math.MaxUint8) + `,` + + `"Uint16":` + fmt.Sprint(math.MaxUint16) + `,` + + `"Uint32":` + fmt.Sprint(uint32(math.MaxUint32)) + `,` + + `"Uint64":` + fmt.Sprint(uint64(math.MaxUint64)) + `,` + + + `"IntString":"` + fmt.Sprint(math.MinInt32) + `",` + + `"Int8String":"` + fmt.Sprint(math.MinInt8) + `",` + + `"Int16String":"` + fmt.Sprint(math.MinInt16) + `",` + + `"Int32String":"` + fmt.Sprint(math.MinInt32) + `",` + + `"Int64String":"` + fmt.Sprint(int64(math.MinInt64)) + `",` + + + `"UintString":"` + fmt.Sprint(uint32(math.MaxUint32)) + `",` + + `"Uint8String":"` + fmt.Sprint(math.MaxUint8) + `",` + + `"Uint16String":"` + fmt.Sprint(math.MaxUint16) + `",` + + `"Uint32String":"` + fmt.Sprint(uint32(math.MaxUint32)) + `",` + + `"Uint64String":"` + fmt.Sprint(uint64(math.MaxUint64)) + `",` + + + `"Float32":` + fmt.Sprint(1.5) + `,` + + `"Float64":` + fmt.Sprint(math.MaxFloat64) + `,` + + + `"Float32String":"` + fmt.Sprint(1.5) + `",` + + `"Float64String":"` + fmt.Sprint(math.MaxFloat64) + `",` + + + `"Ptr":"bla",` + + `"PtrNil":null` + + + "}" + +type ( + NamedString string + NamedBool bool + + NamedInt int + NamedInt8 int8 + NamedInt16 int16 + NamedInt32 int32 + NamedInt64 int64 + + NamedUint uint + NamedUint8 uint8 + NamedUint16 uint16 + NamedUint32 uint32 + NamedUint64 uint64 + + NamedFloat32 float32 + NamedFloat64 float64 + + NamedStrPtr *string +) + +type NamedPrimitiveTypes struct { + String NamedString + Bool NamedBool + + Int NamedInt + Int8 NamedInt8 + Int16 NamedInt16 + Int32 NamedInt32 + Int64 NamedInt64 + + Uint NamedUint + Uint8 NamedUint8 + Uint16 NamedUint16 + Uint32 NamedUint32 + Uint64 NamedUint64 + + Float32 NamedFloat32 + Float64 NamedFloat64 + + Ptr NamedStrPtr + PtrNil NamedStrPtr +} + +var namedPrimitiveTypesValue = NamedPrimitiveTypes{ + String: "test", + Bool: true, + + Int: math.MinInt32, + Int8: math.MinInt8, + Int16: math.MinInt16, + Int32: math.MinInt32, + Int64: math.MinInt64, + + Uint: math.MaxUint32, + Uint8: math.MaxUint8, + Uint16: math.MaxUint16, + Uint32: math.MaxUint32, + Uint64: math.MaxUint64, + + Float32: 1.5, + Float64: math.MaxFloat64, + + Ptr: NamedStrPtr(&str), +} + +var namedPrimitiveTypesString = "{" + + `"String":"test",` + + `"Bool":true,` + + + `"Int":` + fmt.Sprint(math.MinInt32) + `,` + + `"Int8":` + fmt.Sprint(math.MinInt8) + `,` + + `"Int16":` + fmt.Sprint(math.MinInt16) + `,` + + `"Int32":` + fmt.Sprint(math.MinInt32) + `,` + + `"Int64":` + fmt.Sprint(int64(math.MinInt64)) + `,` + + + `"Uint":` + fmt.Sprint(uint32(math.MaxUint32)) + `,` + + `"Uint8":` + fmt.Sprint(math.MaxUint8) + `,` + + `"Uint16":` + fmt.Sprint(math.MaxUint16) + `,` + + `"Uint32":` + fmt.Sprint(uint32(math.MaxUint32)) + `,` + + `"Uint64":` + fmt.Sprint(uint64(math.MaxUint64)) + `,` + + + `"Float32":` + fmt.Sprint(1.5) + `,` + + `"Float64":` + fmt.Sprint(math.MaxFloat64) + `,` + + + `"Ptr":"bla",` + + `"PtrNil":null` + + "}" + +type SubStruct struct { + Value string + Value2 string + unexpored bool +} + +type SubP struct { + V string +} + +type SubStructAlias SubStruct + +type Structs struct { + SubStruct + *SubP + + Value2 int + + Sub1 SubStruct `json:"substruct"` + Sub2 *SubStruct + SubNil *SubStruct + + SubSlice []SubStruct + SubSliceNil []SubStruct + + SubPtrSlice []*SubStruct + SubPtrSliceNil []*SubStruct + + SubA1 SubStructAlias + SubA2 *SubStructAlias + + Anonymous struct { + V string + I int + } + Anonymous1 *struct { + V string + } + + AnonymousSlice []struct{ V int } + AnonymousPtrSlice []*struct{ V int } + + Slice []string + + unexported bool +} + +var structsValue = Structs{ + SubStruct: SubStruct{Value: "test"}, + SubP: &SubP{V: "subp"}, + + Value2: 5, + + Sub1: SubStruct{Value: "test1", Value2: "v"}, + Sub2: &SubStruct{Value: "test2", Value2: "v2"}, + + SubSlice: []SubStruct{ + {Value: "s1"}, + {Value: "s2"}, + }, + + SubPtrSlice: []*SubStruct{ + {Value: "p1"}, + {Value: "p2"}, + }, + + SubA1: SubStructAlias{Value: "test3", Value2: "v3"}, + SubA2: &SubStructAlias{Value: "test4", Value2: "v4"}, + + Anonymous: struct { + V string + I int + }{V: "bla", I: 5}, + + Anonymous1: &struct { + V string + }{V: "bla1"}, + + AnonymousSlice: []struct{ V int }{{1}, {2}}, + AnonymousPtrSlice: []*struct{ V int }{{3}, {4}}, + + Slice: []string{"test5", "test6"}, +} + +var structsString = "{" + + `"Value2":5,` + + + `"substruct":{"Value":"test1","Value2":"v"},` + + `"Sub2":{"Value":"test2","Value2":"v2"},` + + `"SubNil":null,` + + + `"SubSlice":[{"Value":"s1","Value2":""},{"Value":"s2","Value2":""}],` + + `"SubSliceNil":null,` + + + `"SubPtrSlice":[{"Value":"p1","Value2":""},{"Value":"p2","Value2":""}],` + + `"SubPtrSliceNil":null,` + + + `"SubA1":{"Value":"test3","Value2":"v3"},` + + `"SubA2":{"Value":"test4","Value2":"v4"},` + + + `"Anonymous":{"V":"bla","I":5},` + + `"Anonymous1":{"V":"bla1"},` + + + `"AnonymousSlice":[{"V":1},{"V":2}],` + + `"AnonymousPtrSlice":[{"V":3},{"V":4}],` + + + `"Slice":["test5","test6"],` + + + // Embedded fields go last. + `"V":"subp",` + + `"Value":"test"` + + "}" + +type OmitEmpty struct { + // NOTE: first field is empty to test comma printing. + + StrE, StrNE string `json:",omitempty"` + PtrE, PtrNE *string `json:",omitempty"` + + IntNE int `json:"intField,omitempty"` + IntE int `json:",omitempty"` + + // NOTE: omitempty has no effect on non-pointer struct fields. + SubE, SubNE SubStruct `json:",omitempty"` + SubPE, SubPNE *SubStruct `json:",omitempty"` +} + +var omitEmptyValue = OmitEmpty{ + StrNE: "str", + PtrNE: &str, + IntNE: 6, + SubNE: SubStruct{Value: "1", Value2: "2"}, + SubPNE: &SubStruct{Value: "3", Value2: "4"}, +} + +var omitEmptyString = "{" + + `"StrNE":"str",` + + `"PtrNE":"bla",` + + `"intField":6,` + + `"SubE":{"Value":"","Value2":""},` + + `"SubNE":{"Value":"1","Value2":"2"},` + + `"SubPNE":{"Value":"3","Value2":"4"}` + + "}" + +type Opts struct { + StrNull opt.String + StrEmpty opt.String + Str opt.String + StrOmitempty opt.String `json:",omitempty"` + + IntNull opt.Int + IntZero opt.Int + Int opt.Int +} + +var optsValue = Opts{ + StrEmpty: opt.OString(""), + Str: opt.OString("test"), + + IntZero: opt.OInt(0), + Int: opt.OInt(5), +} + +var optsString = `{` + + `"StrNull":null,` + + `"StrEmpty":"",` + + `"Str":"test",` + + `"IntNull":null,` + + `"IntZero":0,` + + `"Int":5` + + `}` + +type Raw struct { + Field easyjson.RawMessage + Field2 string +} + +var rawValue = Raw{ + Field: []byte(`{"a" : "b"}`), + Field2: "test", +} + +var rawString = `{` + + `"Field":{"a" : "b"},` + + `"Field2":"test"` + + `}` + +type StdMarshaler struct { + T time.Time + IP net.IP +} + +var stdMarshalerValue = StdMarshaler{ + T: time.Date(2016, 01, 02, 14, 15, 10, 0, time.UTC), + IP: net.IPv4(192, 168, 0, 1), +} +var stdMarshalerString = `{` + + `"T":"2016-01-02T14:15:10Z",` + + `"IP":"192.168.0.1"` + + `}` + +type UserMarshaler struct { + V vMarshaler + T tMarshaler +} + +type vMarshaler net.IP + +func (v vMarshaler) MarshalJSON() ([]byte, error) { + return []byte(`"0::0"`), nil +} + +func (v *vMarshaler) UnmarshalJSON([]byte) error { + *v = vMarshaler(net.IPv6zero) + return nil +} + +type tMarshaler net.IP + +func (v tMarshaler) MarshalText() ([]byte, error) { + return []byte(`[0::0]`), nil +} + +func (v *tMarshaler) UnmarshalText([]byte) error { + *v = tMarshaler(net.IPv6zero) + return nil +} + +var userMarshalerValue = UserMarshaler{ + V: vMarshaler(net.IPv6zero), + T: tMarshaler(net.IPv6zero), +} +var userMarshalerString = `{` + + `"V":"0::0",` + + `"T":"[0::0]"` + + `}` + +type unexportedStruct struct { + Value string +} + +var unexportedStructValue = unexportedStruct{"test"} +var unexportedStructString = `{"Value":"test"}` + +type ExcludedField struct { + Process bool `json:"process"` + DoNotProcess bool `json:"-"` + DoNotProcess1 bool `json:"-"` +} + +var excludedFieldValue = ExcludedField{ + Process: true, + DoNotProcess: false, + DoNotProcess1: false, +} +var excludedFieldString = `{"process":true}` + +type Slices struct { + ByteSlice []byte + EmptyByteSlice []byte + NilByteSlice []byte + IntSlice []int + EmptyIntSlice []int + NilIntSlice []int +} + +var sliceValue = Slices{ + ByteSlice: []byte("abc"), + EmptyByteSlice: []byte{}, + NilByteSlice: []byte(nil), + IntSlice: []int{1, 2, 3, 4, 5}, + EmptyIntSlice: []int{}, + NilIntSlice: []int(nil), +} + +var sliceString = `{` + + `"ByteSlice":"YWJj",` + + `"EmptyByteSlice":"",` + + `"NilByteSlice":null,` + + `"IntSlice":[1,2,3,4,5],` + + `"EmptyIntSlice":[],` + + `"NilIntSlice":null` + + `}` + +type Arrays struct { + ByteArray [3]byte + EmptyByteArray [0]byte + IntArray [5]int + EmptyIntArray [0]int +} + +var arrayValue = Arrays{ + ByteArray: [3]byte{'a', 'b', 'c'}, + EmptyByteArray: [0]byte{}, + IntArray: [5]int{1, 2, 3, 4, 5}, + EmptyIntArray: [0]int{}, +} + +var arrayString = `{` + + `"ByteArray":"YWJj",` + + `"EmptyByteArray":"",` + + `"IntArray":[1,2,3,4,5],` + + `"EmptyIntArray":[]` + + `}` + +var arrayOverflowString = `{` + + `"ByteArray":"YWJjbnNk",` + + `"EmptyByteArray":"YWJj",` + + `"IntArray":[1,2,3,4,5,6],` + + `"EmptyIntArray":[7,8]` + + `}` + +var arrayUnderflowValue = Arrays{ + ByteArray: [3]byte{'x', 0, 0}, + EmptyByteArray: [0]byte{}, + IntArray: [5]int{1, 2, 0, 0, 0}, + EmptyIntArray: [0]int{}, +} + +var arrayUnderflowString = `{` + + `"ByteArray":"eA==",` + + `"IntArray":[1,2]` + + `}` + +type Str string + +type Maps struct { + Map map[string]string + InterfaceMap map[string]interface{} + NilMap map[string]string + + CustomMap map[Str]Str +} + +var mapsValue = Maps{ + Map: map[string]string{"A": "b"}, // only one item since map iteration is randomized + InterfaceMap: map[string]interface{}{"G": float64(1)}, + + CustomMap: map[Str]Str{"c": "d"}, +} + +var mapsString = `{` + + `"Map":{"A":"b"},` + + `"InterfaceMap":{"G":1},` + + `"NilMap":null,` + + `"CustomMap":{"c":"d"}` + + `}` + +type NamedSlice []Str +type NamedMap map[Str]Str + +type DeepNest struct { + SliceMap map[Str][]Str + SliceMap1 map[Str][]Str + SliceMap2 map[Str][]Str + NamedSliceMap map[Str]NamedSlice + NamedMapMap map[Str]NamedMap + MapSlice []map[Str]Str + NamedSliceSlice []NamedSlice + NamedMapSlice []NamedMap + NamedStringSlice []NamedString +} + +var deepNestValue = DeepNest{ + SliceMap: map[Str][]Str{ + "testSliceMap": []Str{ + "0", + "1", + }, + }, + SliceMap1: map[Str][]Str{ + "testSliceMap1": []Str(nil), + }, + SliceMap2: map[Str][]Str{ + "testSliceMap2": []Str{}, + }, + NamedSliceMap: map[Str]NamedSlice{ + "testNamedSliceMap": NamedSlice{ + "2", + "3", + }, + }, + NamedMapMap: map[Str]NamedMap{ + "testNamedMapMap": NamedMap{ + "key1": "value1", + }, + }, + MapSlice: []map[Str]Str{ + map[Str]Str{ + "testMapSlice": "someValue", + }, + }, + NamedSliceSlice: []NamedSlice{ + NamedSlice{ + "someValue1", + "someValue2", + }, + NamedSlice{ + "someValue3", + "someValue4", + }, + }, + NamedMapSlice: []NamedMap{ + NamedMap{ + "key2": "value2", + }, + NamedMap{ + "key3": "value3", + }, + }, + NamedStringSlice: []NamedString{ + "value4", "value5", + }, +} + +var deepNestString = `{` + + `"SliceMap":{` + + `"testSliceMap":["0","1"]` + + `},` + + `"SliceMap1":{` + + `"testSliceMap1":null` + + `},` + + `"SliceMap2":{` + + `"testSliceMap2":[]` + + `},` + + `"NamedSliceMap":{` + + `"testNamedSliceMap":["2","3"]` + + `},` + + `"NamedMapMap":{` + + `"testNamedMapMap":{"key1":"value1"}` + + `},` + + `"MapSlice":[` + + `{"testMapSlice":"someValue"}` + + `],` + + `"NamedSliceSlice":[` + + `["someValue1","someValue2"],` + + `["someValue3","someValue4"]` + + `],` + + `"NamedMapSlice":[` + + `{"key2":"value2"},` + + `{"key3":"value3"}` + + `],` + + `"NamedStringSlice":["value4","value5"]` + + `}` + +//easyjson:json +type Ints []int + +var IntsValue = Ints{1, 2, 3, 4, 5} + +var IntsString = `[1,2,3,4,5]` + +//easyjson:json +type MapStringString map[string]string + +var mapStringStringValue = MapStringString{"a": "b"} + +var mapStringStringString = `{"a":"b"}` + +type RequiredOptionalStruct struct { + FirstName string `json:"first_name,required"` + Lastname string `json:"last_name"` +} + +//easyjson:json +type EncodingFlagsTestMap struct { + F map[string]string +} + +//easyjson:json +type EncodingFlagsTestSlice struct { + F []string +} + +type StructWithInterface struct { + Field1 int `json:"f1"` + Field2 interface{} `json:"f2"` + Field3 string `json:"f3"` +} + +type EmbeddedStruct struct { + Field1 int `json:"f1"` + Field2 string `json:"f2"` +} + +var structWithInterfaceString = `{"f1":1,"f2":{"f1":11,"f2":"22"},"f3":"3"}` +var structWithInterfaceValueFilled = StructWithInterface{1, &EmbeddedStruct{11, "22"}, "3"} + +//easyjson:json +type MapIntString map[int]string + +var mapIntStringValue = MapIntString{3: "hi"} +var mapIntStringValueString = `{"3":"hi"}` + +//easyjson:json +type MapInt32String map[int32]string + +var mapInt32StringValue = MapInt32String{-354634382: "life"} +var mapInt32StringValueString = `{"-354634382":"life"}` + +//easyjson:json +type MapInt64String map[int64]string + +var mapInt64StringValue = MapInt64String{-3546343826724305832: "life"} +var mapInt64StringValueString = `{"-3546343826724305832":"life"}` + +//easyjson:json +type MapUintString map[uint]string + +var mapUintStringValue = MapUintString{42: "life"} +var mapUintStringValueString = `{"42":"life"}` + +//easyjson:json +type MapUint32String map[uint32]string + +var mapUint32StringValue = MapUint32String{354634382: "life"} +var mapUint32StringValueString = `{"354634382":"life"}` + +//easyjson:json +type MapUint64String map[uint64]string + +var mapUint64StringValue = MapUint64String{3546343826724305832: "life"} +var mapUint64StringValueString = `{"3546343826724305832":"life"}` + +//easyjson:json +type MapUintptrString map[uintptr]string + +var mapUintptrStringValue = MapUintptrString{272679208: "obj"} +var mapUintptrStringValueString = `{"272679208":"obj"}` + +type MyInt int + +//easyjson:json +type MapMyIntString map[MyInt]string + +var mapMyIntStringValue = MapMyIntString{MyInt(42): "life"} +var mapMyIntStringValueString = `{"42":"life"}` + +//easyjson:json +type IntKeyedMapStruct struct { + Foo MapMyIntString `json:"foo"` + Bar map[int16]MapUint32String `json:"bar"` +} + +var intKeyedMapStructValue = IntKeyedMapStruct{ + Foo: mapMyIntStringValue, + Bar: map[int16]MapUint32String{32: mapUint32StringValue}, +} +var intKeyedMapStructValueString = `{` + + `"foo":{"42":"life"},` + + `"bar":{"32":{"354634382":"life"}}` + + `}` + +type IntArray [2]int + +//easyjson:json +type IntArrayStruct struct { + Pointer *IntArray `json:"pointer"` + Value IntArray `json:"value"` +} + +var intArrayStructValue = IntArrayStruct{ + Pointer: &IntArray{1, 2}, + Value: IntArray{1, 2}, +} + +var intArrayStructValueString = `{` + + `"pointer":[1,2],` + + `"value":[1,2]` + + `}` + +type MyUInt8 uint8 + +//easyjson:json +type MyUInt8Slice []MyUInt8 + +var myUInt8SliceValue = MyUInt8Slice{1, 2, 3, 4, 5} + +var myUInt8SliceString = `[1,2,3,4,5]` + +//easyjson:json +type MyUInt8Array [2]MyUInt8 + +var myUInt8ArrayValue = MyUInt8Array{1, 2} + +var myUInt8ArrayString = `[1,2]` diff --git a/vendor/github.com/mailru/easyjson/tests/disallow_unknown.go b/vendor/github.com/mailru/easyjson/tests/disallow_unknown.go new file mode 100644 index 0000000000..5b884c64ca --- /dev/null +++ b/vendor/github.com/mailru/easyjson/tests/disallow_unknown.go @@ -0,0 +1,8 @@ +package tests + +//easyjson:json +type DisallowUnknown struct { + FieldOne string `json:"field_one"` +} + +var disallowUnknownString = `{"field_one": "one", "field_two": "two"}` diff --git a/vendor/github.com/mailru/easyjson/tests/embedded_type.go b/vendor/github.com/mailru/easyjson/tests/embedded_type.go new file mode 100644 index 0000000000..346cf4ab34 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/tests/embedded_type.go @@ -0,0 +1,30 @@ +package tests + +//easyjson:json +type EmbeddedType struct { + EmbeddedInnerType + Inner struct { + EmbeddedInnerType + } + Field2 int + EmbeddedInnerType2 `json:"named"` +} + +type EmbeddedInnerType struct { + Field1 int +} + +type EmbeddedInnerType2 struct { + Field3 int +} + +var embeddedTypeValue EmbeddedType + +func init() { + embeddedTypeValue.Field1 = 1 + embeddedTypeValue.Field2 = 2 + embeddedTypeValue.Inner.Field1 = 3 + embeddedTypeValue.Field3 = 4 +} + +var embeddedTypeValueString = `{"Inner":{"Field1":3},"Field2":2,"named":{"Field3":4},"Field1":1}` diff --git a/vendor/github.com/mailru/easyjson/tests/errors.go b/vendor/github.com/mailru/easyjson/tests/errors.go new file mode 100644 index 0000000000..14360fcc29 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/tests/errors.go @@ -0,0 +1,26 @@ +package tests + +//easyjson:json +type ErrorIntSlice []int + +//easyjson:json +type ErrorBoolSlice []bool + +//easyjson:json +type ErrorUintSlice []uint + +//easyjson:json +type ErrorStruct struct { + Int int `json:"int"` + String string `json:"string"` + Slice []int `json:"slice"` + IntSlice []int `json:"int_slice"` +} + +type ErrorNestedStruct struct { + ErrorStruct ErrorStruct `json:"error_struct"` + Int int `json:"int"` +} + +//easyjson:json +type ErrorIntMap map[uint32]string diff --git a/vendor/github.com/mailru/easyjson/tests/named_type.go b/vendor/github.com/mailru/easyjson/tests/named_type.go new file mode 100644 index 0000000000..0ff8dfeb37 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/tests/named_type.go @@ -0,0 +1,22 @@ +package tests + +//easyjson:json +type NamedType struct { + Inner struct { + // easyjson is mistakenly naming the type of this field 'tests.MyString' in the generated output + // something about a named type inside an anonmymous type is triggering this bug + Field MyString `tag:"value"` + Field2 int "tag:\"value with ` in it\"" + } +} + +type MyString string + +var namedTypeValue NamedType + +func init() { + namedTypeValue.Inner.Field = "test" + namedTypeValue.Inner.Field2 = 123 +} + +var namedTypeValueString = `{"Inner":{"Field":"test","Field2":123}}` diff --git a/vendor/github.com/mailru/easyjson/tests/nested_easy.go b/vendor/github.com/mailru/easyjson/tests/nested_easy.go new file mode 100644 index 0000000000..6309a49f9f --- /dev/null +++ b/vendor/github.com/mailru/easyjson/tests/nested_easy.go @@ -0,0 +1,25 @@ +package tests + +import ( + "github.com/mailru/easyjson" + "github.com/mailru/easyjson/jwriter" +) + +//easyjson:json +type NestedInterfaces struct { + Value interface{} + Slice []interface{} + Map map[string]interface{} +} + +type NestedEasyMarshaler struct { + EasilyMarshaled bool +} + +var _ easyjson.Marshaler = &NestedEasyMarshaler{} + +func (i *NestedEasyMarshaler) MarshalEasyJSON(w *jwriter.Writer) { + // We use this method only to indicate that easyjson.Marshaler + // interface was really used while encoding. + i.EasilyMarshaled = true +} \ No newline at end of file diff --git a/vendor/github.com/mailru/easyjson/tests/nothing.go b/vendor/github.com/mailru/easyjson/tests/nothing.go new file mode 100644 index 0000000000..35334f5f5e --- /dev/null +++ b/vendor/github.com/mailru/easyjson/tests/nothing.go @@ -0,0 +1,3 @@ +package tests + +// No structs in this file diff --git a/vendor/github.com/mailru/easyjson/tests/omitempty.go b/vendor/github.com/mailru/easyjson/tests/omitempty.go new file mode 100644 index 0000000000..ede5eb95a7 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/tests/omitempty.go @@ -0,0 +1,12 @@ +package tests + +//easyjson:json +type OmitEmptyDefault struct { + Field string + Str string + Str1 string `json:"s,!omitempty"` + Str2 string `json:",!omitempty"` +} + +var omitEmptyDefaultValue = OmitEmptyDefault{Field: "test"} +var omitEmptyDefaultString = `{"Field":"test","s":"","Str2":""}` diff --git a/vendor/github.com/mailru/easyjson/tests/reference_to_pointer.go b/vendor/github.com/mailru/easyjson/tests/reference_to_pointer.go new file mode 100644 index 0000000000..6768e53da7 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/tests/reference_to_pointer.go @@ -0,0 +1,10 @@ +package tests + +type Struct1 struct { +} + +//easyjson:json +type Struct2 struct { + From *Struct1 `json:"from,omitempty"` + Through *Struct1 `json:"through,omitempty"` +} diff --git a/vendor/github.com/mailru/easyjson/tests/snake.go b/vendor/github.com/mailru/easyjson/tests/snake.go new file mode 100644 index 0000000000..9b64f86120 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/tests/snake.go @@ -0,0 +1,10 @@ +package tests + +//easyjson:json +type SnakeStruct struct { + WeirdHTTPStuff bool + CustomNamedField string `json:"cUsToM"` +} + +var snakeStructValue SnakeStruct +var snakeStructString = `{"weird_http_stuff":false,"cUsToM":""}` diff --git a/vendor/github.com/openshift/cluster-api-actuator-pkg/Gopkg.lock b/vendor/github.com/openshift/cluster-api-actuator-pkg/Gopkg.lock index ec4530ef37..fbdbb1111f 100644 --- a/vendor/github.com/openshift/cluster-api-actuator-pkg/Gopkg.lock +++ b/vendor/github.com/openshift/cluster-api-actuator-pkg/Gopkg.lock @@ -9,6 +9,22 @@ revision = "dfffe386c33fb24c34ee501e5723df5b97b98514" version = "v0.30.0" +[[projects]] + digest = "1:c0952fb3cf9506cff577b4edf4458889570dcbd2902a7b90a1fd96bfbb97ccd8" + name = "github.com/PuerkitoBio/purell" + packages = ["."] + pruneopts = "" + revision = "44968752391892e1b0d0b821ee79e9a85fa13049" + version = "v1.1.1" + +[[projects]] + branch = "master" + digest = "1:331a419049c2be691e5ba1d24342fc77c7e767a80c666a18fd8a9f7b82419c1c" + name = "github.com/PuerkitoBio/urlesc" + packages = ["."] + pruneopts = "" + revision = "de5bf2ad457846296e2031421a34e2568e304e35" + [[projects]] branch = "master" digest = "1:c0bec5f9b98d0bc872ff5e834fac186b807b656683bd29cb82fb207a1513fabb" @@ -60,6 +76,38 @@ pruneopts = "" revision = "7536572e8d55209135cd5e7ccf7fce43dca217ab" +[[projects]] + digest = "1:c8052dcf3ec378a9a6bc4f00ecc10d6d5eb3cc1f8faaf6b2f70f047e8881d446" + name = "github.com/go-openapi/jsonpointer" + packages = ["."] + pruneopts = "" + revision = "ef5f0afec364d3b9396b7b77b43dbe26bf1f8004" + version = "v0.18.0" + +[[projects]] + digest = "1:1824e5330b35b2a2418d06aa55629cc59ad454b72e338aa125ba8ff98f16298b" + name = "github.com/go-openapi/jsonreference" + packages = ["."] + pruneopts = "" + revision = "8483a886a90412cd6858df4ea3483dce9c8e35a3" + version = "v0.18.0" + +[[projects]] + digest = "1:54af405aae840f810418f3d25211012af1c4bfd56d07d3de6482a7a3b762528a" + name = "github.com/go-openapi/spec" + packages = ["."] + pruneopts = "" + revision = "5b6cdde3200976e3ecceb2868706ee39b6aff3e4" + version = "v0.18.0" + +[[projects]] + digest = "1:417789264f7cc44cbb3431ac997473e085018b01bdd98df57e6039981428aca4" + name = "github.com/go-openapi/swag" + packages = ["."] + pruneopts = "" + revision = "1d29f06aebd59ccdf11ae04aa0334ded96e2d909" + version = "v0.18.0" + [[projects]] digest = "1:a51f75337287a485731485c646d701e237246f7c5d0e221dee18ca37b672538e" name = "github.com/gobuffalo/envy" @@ -213,6 +261,18 @@ revision = "1624edc4454b8682399def8740d46db5e4362ba4" version = "v1.1.5" +[[projects]] + branch = "master" + digest = "1:02e7e5941a0607565391047b76eabdfff2c83285813b6d0479dfc63c36c21820" + name = "github.com/mailru/easyjson" + packages = [ + "buffer", + "jlexer", + "jwriter", + ] + pruneopts = "" + revision = "6243d8e04c3f819e79757e8bc3faa15c3cb27003" + [[projects]] digest = "1:3d8a9dd6693e55d63b28634d66d11d647cd0b65362dedc18d686db01aa5f8678" name = "github.com/markbates/inflect" @@ -326,19 +386,23 @@ "pkg/client/clientset_generated/clientset/scheme", "pkg/client/clientset_generated/clientset/typed/cluster/v1alpha1", "pkg/client/clientset_generated/clientset/typed/machine/v1beta1", + "pkg/controller/node", + "pkg/controller/noderefutil", + "pkg/util", ] pruneopts = "" revision = "91fca585a85b163ddfd119fd09c128c9feadddca" [[projects]] - digest = "1:10243032799a565349dae0db5846e3ae41946eac594ce013a4254d29563639ff" + branch = "master" + digest = "1:8439cd39e3006f645c7b3941b2dd8e26218c867e8a420aaf3a9a9bd49e1acc07" name = "github.com/openshift/cluster-autoscaler-operator" packages = [ "pkg/apis", "pkg/apis/autoscaling/v1alpha1", ] pruneopts = "" - revision = "4bcabb30b24b7289ea2b935f5a9cf0b89784835d" + revision = "73c46659d0e2c0ac03e6e207d52ff0c025b04786" [[projects]] digest = "1:daf50f3575d80f3788ed91f9c14f8b77eb941aa47f0ce352028d45be29581caf" @@ -573,6 +637,7 @@ "unicode/cldr", "unicode/norm", "unicode/rangetable", + "width", ] pruneopts = "" revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" @@ -887,12 +952,15 @@ branch = "master" digest = "1:bb17aab96138a89eb0550fbf135a9812f6be8bc9805080e36c9efe50f607261e" name = "k8s.io/kube-openapi" - packages = ["pkg/util/proto"] + packages = [ + "pkg/common", + "pkg/util/proto", + ] pruneopts = "" revision = "5d05df014ac640f14b5e777958248251c2ef5e86" [[projects]] - digest = "1:6ce9939983cd47f4c21c1eeaf9a187ab01ca9e036364946eb60ce45286ab2191" + digest = "0:" name = "sigs.k8s.io/controller-runtime" packages = [ "pkg/cache", @@ -954,6 +1022,14 @@ pruneopts = "" revision = "5818a3a284a11812aaed11d5ca0bcadec2c50e83" +[[projects]] + digest = "1:321081b4a44256715f2b68411d8eda9a17f17ebfe6f0cc61d2cc52d11c08acfa" + name = "sigs.k8s.io/yaml" + packages = ["."] + pruneopts = "" + revision = "fd68e9863619f6ec2fdd8625fe1f02e7c877e480" + version = "v1.1.0" + [solve-meta] analyzer-name = "dep" analyzer-version = 1 @@ -965,6 +1041,7 @@ "github.com/openshift/api/config/v1", "github.com/openshift/cluster-api/pkg/apis/machine/v1beta1", "github.com/openshift/cluster-api/pkg/client/clientset_generated/clientset", + "github.com/openshift/cluster-api/pkg/controller/node", "github.com/openshift/cluster-autoscaler-operator/pkg/apis", "github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1", "github.com/openshift/cluster-version-operator/lib/resourcemerge", @@ -973,13 +1050,16 @@ "k8s.io/api/apps/v1beta2", "k8s.io/api/batch/v1", "k8s.io/api/core/v1", + "k8s.io/api/policy/v1beta1", "k8s.io/api/rbac/v1", "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1", "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset", "k8s.io/apimachinery/pkg/api/resource", "k8s.io/apimachinery/pkg/apis/meta/v1", "k8s.io/apimachinery/pkg/labels", + "k8s.io/apimachinery/pkg/runtime", "k8s.io/apimachinery/pkg/types", + "k8s.io/apimachinery/pkg/util/intstr", "k8s.io/apimachinery/pkg/util/sets", "k8s.io/apimachinery/pkg/util/uuid", "k8s.io/apimachinery/pkg/util/wait", @@ -988,6 +1068,7 @@ "k8s.io/client-go/plugin/pkg/client/auth/gcp", "k8s.io/client-go/rest", "k8s.io/client-go/tools/clientcmd", + "k8s.io/client-go/tools/clientcmd/api", "k8s.io/code-generator/cmd/deepcopy-gen", "sigs.k8s.io/controller-runtime/pkg/client", "sigs.k8s.io/controller-runtime/pkg/client/config", diff --git a/vendor/github.com/openshift/cluster-api-actuator-pkg/Gopkg.toml b/vendor/github.com/openshift/cluster-api-actuator-pkg/Gopkg.toml index 45f6e0a922..ff20b1857b 100644 --- a/vendor/github.com/openshift/cluster-api-actuator-pkg/Gopkg.toml +++ b/vendor/github.com/openshift/cluster-api-actuator-pkg/Gopkg.toml @@ -43,14 +43,17 @@ required = [ [[constraint]] name = "github.com/openshift/cluster-api" - revision = "91fca585a85b163ddfd119fd09c128c9feadddca" + revision = "0c3e884db79556cf786aa8436f5be977ef10c211" + +[[constraint]] + name = "github.com/openshift/cluster-autoscaler-operator" + branch = "master" # We need to specify fsnotify source to avoid dep panic [[override]] name = "gopkg.in/fsnotify.v1" source = "https://github.com/fsnotify/fsnotify.git" - [[override]] name = "k8s.io/api" version = "kubernetes-1.12.5" @@ -69,4 +72,4 @@ required = [ [[override]] name = "k8s.io/kube-aggregator" - branch = "release-1.12" \ No newline at end of file + branch = "release-1.12" diff --git a/vendor/github.com/openshift/cluster-api-actuator-pkg/Makefile b/vendor/github.com/openshift/cluster-api-actuator-pkg/Makefile index 39283c26e6..724366c9f1 100644 --- a/vendor/github.com/openshift/cluster-api-actuator-pkg/Makefile +++ b/vendor/github.com/openshift/cluster-api-actuator-pkg/Makefile @@ -25,7 +25,7 @@ check: fmt vet lint test ## Check your code .PHONY: test test: # Run unit test - $(DOCKER_CMD) go test -race -cover ./pkg/... + $(DOCKER_CMD) go test -race -cover `go list ./... | grep -v github.com/openshift/cluster-api-actuator-pkg/pkg/e2e` .PHONY: lint lint: ## Go lint your code @@ -39,6 +39,25 @@ fmt: ## Go fmt your code vet: ## Apply go vet to all go files hack/go-vet.sh ./... +.PHONY: test-e2e +test-e2e: ## Run openshift specific e2e test + go test -timeout 60m \ + -v github.com/openshift/cluster-api-actuator-pkg/pkg/e2e \ + -kubeconfig $${KUBECONFIG:-~/.kube/config} \ + -machine-api-namespace $${NAMESPACE:-openshift-machine-api} \ + -ginkgo.v \ + -args -v 5 -logtostderr true + +.PHONY: k8s-e2e +k8s-e2e: ## Run k8s specific e2e test + go test -timeout 30m \ + -v github.com/openshift/cluster-api-actuator-pkg/pkg/e2e \ + -kubeconfig $${KUBECONFIG:-~/.kube/config} \ + -machine-api-namespace $${NAMESPACE:-kube-system} \ + -ginkgo.v \ + -args -v 5 -logtostderr true + + .PHONY: help help: @grep -E '^[a-zA-Z/0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/vendor/github.com/openshift/cluster-api-actuator-pkg/OWNERS b/vendor/github.com/openshift/cluster-api-actuator-pkg/OWNERS index 1ef1c3b9a0..c5fc3377bb 100644 --- a/vendor/github.com/openshift/cluster-api-actuator-pkg/OWNERS +++ b/vendor/github.com/openshift/cluster-api-actuator-pkg/OWNERS @@ -6,6 +6,6 @@ approvers: - ingvagabund - paulfantom - spangenberg - - trawler - vikaschoudhary16 - bison + - michaelgugino diff --git a/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/actuators/actuators.go b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/actuators/actuators.go new file mode 100644 index 0000000000..cee8e2c0ed --- /dev/null +++ b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/actuators/actuators.go @@ -0,0 +1,432 @@ +package actuators + +import ( + "context" + "fmt" + "strings" + + "github.com/golang/glog" + g "github.com/onsi/ginkgo" + o "github.com/onsi/gomega" + e2e "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/framework" + mapiv1beta1 "github.com/openshift/cluster-api/pkg/apis/machine/v1beta1" + corev1 "k8s.io/api/core/v1" + kpolicyapi "k8s.io/api/policy/v1beta1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/apimachinery/pkg/util/uuid" + "k8s.io/apimachinery/pkg/util/wait" + runtimeclient "sigs.k8s.io/controller-runtime/pkg/client" +) + +var nodeDrainLabels = map[string]string{ + e2e.WorkerRoleLabel: "", + "node-draining-test": string(uuid.NewUUID()), +} + +func machineFromMachineset(machineset *mapiv1beta1.MachineSet) *mapiv1beta1.Machine { + randomUUID := string(uuid.NewUUID()) + + machine := &mapiv1beta1.Machine{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: machineset.Namespace, + Name: "machine-" + randomUUID[:6], + Labels: machineset.Labels, + }, + Spec: machineset.Spec.Template.Spec, + } + if machine.Spec.ObjectMeta.Labels == nil { + machine.Spec.ObjectMeta.Labels = map[string]string{} + } + for key := range nodeDrainLabels { + if _, exists := machine.Spec.ObjectMeta.Labels[key]; exists { + continue + } + machine.Spec.ObjectMeta.Labels[key] = nodeDrainLabels[key] + } + return machine +} + +func waitUntilNodesAreReady(client runtimeclient.Client, listOpt *runtimeclient.ListOptions, nodeCount int) error { + return wait.PollImmediate(e2e.RetryMedium, e2e.WaitLong, func() (bool, error) { + nodes := corev1.NodeList{} + if err := client.List(context.TODO(), listOpt, &nodes); err != nil { + glog.Errorf("Error querying api for Node object: %v, retrying...", err) + return false, nil + } + // expecting nodeGroupSize nodes + readyNodes := 0 + for _, node := range nodes.Items { + if _, exists := node.Labels[e2e.WorkerRoleLabel]; !exists { + continue + } + + if !e2e.IsNodeReady(&node) { + continue + } + + readyNodes++ + } + + if readyNodes < nodeCount { + glog.Errorf("Expecting %v nodes with %#v labels in Ready state, got %v", nodeCount, nodeDrainLabels, readyNodes) + return false, nil + } + + glog.Infof("Expected number (%v) of nodes with %v label in Ready state found", nodeCount, nodeDrainLabels) + return true, nil + }) +} + +func waitUntilNodesAreDeleted(client runtimeclient.Client, listOpt *runtimeclient.ListOptions) error { + return wait.PollImmediate(e2e.RetryMedium, e2e.WaitLong, func() (bool, error) { + nodes := corev1.NodeList{} + if err := client.List(context.TODO(), listOpt, &nodes); err != nil { + glog.Errorf("Error querying api for Node object: %v, retrying...", err) + return false, nil + } + // expecting nodeGroupSize nodes + nodeCounter := 0 + for _, node := range nodes.Items { + if _, exists := node.Labels[e2e.WorkerRoleLabel]; !exists { + continue + } + + if !e2e.IsNodeReady(&node) { + continue + } + + nodeCounter++ + } + + if nodeCounter > 0 { + glog.Errorf("Expecting to found 0 nodes with %#v labels , got %v", nodeDrainLabels, nodeCounter) + return false, nil + } + + glog.Infof("Found 0 number of nodes with %v label as expected", nodeDrainLabels) + return true, nil + }) +} + +func replicationControllerWorkload(namespace string) *corev1.ReplicationController { + var replicas int32 = 20 + return &corev1.ReplicationController{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pdb-workload", + Namespace: namespace, + }, + Spec: corev1.ReplicationControllerSpec{ + Replicas: &replicas, + Selector: map[string]string{ + "app": "nginx", + }, + Template: &corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Name: "nginx", + Labels: map[string]string{ + "app": "nginx", + }, + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: "work", + Image: "busybox", + Command: []string{"sleep", "10h"}, + Resources: corev1.ResourceRequirements{ + Requests: corev1.ResourceList{ + "cpu": resource.MustParse("50m"), + "memory": resource.MustParse("50Mi"), + }, + }, + }, + }, + NodeSelector: nodeDrainLabels, + Tolerations: []corev1.Toleration{ + { + Key: "kubemark", + Operator: corev1.TolerationOpExists, + }, + }, + }, + }, + }, + } +} + +func podDisruptionBudget(namespace string) *kpolicyapi.PodDisruptionBudget { + maxUnavailable := intstr.FromInt(1) + return &kpolicyapi.PodDisruptionBudget{ + ObjectMeta: metav1.ObjectMeta{ + Name: "nginx-pdb", + Namespace: namespace, + }, + Spec: kpolicyapi.PodDisruptionBudgetSpec{ + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "app": "nginx", + }, + }, + MaxUnavailable: &maxUnavailable, + }, + } +} + +var _ = g.Describe("[Feature:Machines] Actuator should", func() { + defer g.GinkgoRecover() + + g.It("drain node before removing machine resource", func() { + var err error + client, err := e2e.LoadClient() + o.Expect(err).NotTo(o.HaveOccurred()) + + delObjects := make(map[string]runtime.Object) + + defer func() { + // Remove resources + for key := range delObjects { + glog.Infof("Deleting object %q", key) + if err := client.Delete(context.TODO(), delObjects[key]); err != nil { + glog.Errorf("Unable to delete object %q: %v", key, err) + } + } + + listOpt := &runtimeclient.ListOptions{} + listOpt.MatchingLabels(nodeDrainLabels) + // TODO(jchaloup): we need to make sure this gets called no matter what + // and waits until all labeled nodes are gone. Though, it it does not + // happend in the timeout set, it will not happen ever. + err := waitUntilNodesAreDeleted(client, listOpt) + o.Expect(err).NotTo(o.HaveOccurred()) + }() + + g.By("Taking the first worker machineset (assuming only worker machines are backed by machinesets)") + machinesets := mapiv1beta1.MachineSetList{} + err = wait.PollImmediate(e2e.RetryMedium, e2e.WaitShort, func() (bool, error) { + if err := client.List(context.TODO(), &runtimeclient.ListOptions{}, &machinesets); err != nil { + glog.Errorf("Error querying api for machineset object: %v, retrying...", err) + return false, nil + } + if len(machinesets.Items) < 1 { + glog.Errorf("Expected at least one machineset, have none") + return false, nil + } + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + g.By("Creating two new machines, one for node about to be drained, other for moving workload from drained node") + // Create two machines + machine1 := machineFromMachineset(&machinesets.Items[0]) + machine1.Name = "machine1" + + err = func() error { + if err := client.Create(context.TODO(), machine1); err != nil { + return fmt.Errorf("unable to create machine %q: %v", machine1.Name, err) + } + delObjects["machine1"] = machine1 + + machine2 := machineFromMachineset(&machinesets.Items[0]) + machine2.Name = "machine2" + + if err := client.Create(context.TODO(), machine2); err != nil { + return fmt.Errorf("unable to create machine %q: %v", machine2.Name, err) + } + delObjects["machine2"] = machine2 + + return nil + }() + o.Expect(err).NotTo(o.HaveOccurred()) + + g.By("Waiting until both new nodes are ready") + listOpt := &runtimeclient.ListOptions{} + listOpt.MatchingLabels(nodeDrainLabels) + err = waitUntilNodesAreReady(client, listOpt, 2) + o.Expect(err).NotTo(o.HaveOccurred()) + + g.By("Creating RC with workload") + rc := replicationControllerWorkload("default") + err = client.Create(context.TODO(), rc) + o.Expect(err).NotTo(o.HaveOccurred()) + delObjects["rc"] = rc + + g.By("Creating PDB for RC") + pdb := podDisruptionBudget("default") + err = client.Create(context.TODO(), pdb) + o.Expect(err).NotTo(o.HaveOccurred()) + delObjects["pdb"] = pdb + + g.By("Wait until all replicas are ready") + err = wait.PollImmediate(e2e.RetryMedium, e2e.WaitLong, func() (bool, error) { + rcObj := corev1.ReplicationController{} + key := types.NamespacedName{ + Namespace: rc.Namespace, + Name: rc.Name, + } + if err := client.Get(context.TODO(), key, &rcObj); err != nil { + glog.Errorf("Error querying api RC %q object: %v, retrying...", rc.Name, err) + return false, nil + } + if rcObj.Status.ReadyReplicas == 0 { + glog.Infof("Waiting for at least one RC ready replica (%v/%v)", rcObj.Status.ReadyReplicas, rcObj.Status.Replicas) + return false, nil + } + glog.Infof("Waiting for RC ready replicas (%v/%v)", rcObj.Status.ReadyReplicas, rcObj.Status.Replicas) + if rcObj.Status.Replicas != rcObj.Status.ReadyReplicas { + return false, nil + } + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + // TODO(jchaloup): delete machine that has at least half of the RC pods + + // All pods are distributed evenly among all nodes so it's fine to drain + // random node and observe reconciliation of pods on the other one. + g.By("Delete machine to trigger node draining") + err = client.Delete(context.TODO(), machine1) + o.Expect(err).NotTo(o.HaveOccurred()) + delete(delObjects, "machine1") + + // We still should be able to list the machine as until rc.replicas-1 are running on the other node + g.By("Observing and verifying node draining") + var drainedNodeName string + err = wait.PollImmediate(e2e.RetryMedium, e2e.WaitLong, func() (bool, error) { + machine := mapiv1beta1.Machine{} + + key := types.NamespacedName{ + Namespace: machine1.Namespace, + Name: machine1.Name, + } + if err := client.Get(context.TODO(), key, &machine); err != nil { + glog.Errorf("Error querying api machine %q object: %v, retrying...", machine1.Name, err) + return false, nil + } + if machine.Status.NodeRef == nil || machine.Status.NodeRef.Kind != "Node" { + glog.Error("Machine %q not linked to a node", machine.Name) + } + + drainedNodeName = machine.Status.NodeRef.Name + node := corev1.Node{} + + if err := client.Get(context.TODO(), types.NamespacedName{Name: drainedNodeName}, &node); err != nil { + glog.Errorf("Error querying api node %q object: %v, retrying...", drainedNodeName, err) + return false, nil + } + + if !node.Spec.Unschedulable { + glog.Errorf("Node %q is expected to be marked as unschedulable, it is not", node.Name) + return false, nil + } + + glog.Infof("Node %q is mark unschedulable as expected", node.Name) + + pods := corev1.PodList{} + listOpt := &runtimeclient.ListOptions{} + listOpt.MatchingLabels(rc.Spec.Selector) + if err := client.List(context.TODO(), listOpt, &pods); err != nil { + glog.Errorf("Error querying api for Pods object: %v, retrying...", err) + return false, nil + } + + // expecting nodeGroupSize nodes + podCounter := 0 + for _, pod := range pods.Items { + if pod.Spec.NodeName != machine.Status.NodeRef.Name { + continue + } + if !pod.DeletionTimestamp.IsZero() { + continue + } + podCounter++ + } + + glog.Infof("Have %v pods scheduled to node %q", podCounter, machine.Status.NodeRef.Name) + + // Verify we have enough pods running as well + rcObj := corev1.ReplicationController{} + key = types.NamespacedName{ + Namespace: rc.Namespace, + Name: rc.Name, + } + if err := client.Get(context.TODO(), key, &rcObj); err != nil { + glog.Errorf("Error querying api RC %q object: %v, retrying...", rc.Name, err) + return false, nil + } + + // The point of the test is to make sure majority of the pods is rescheduled + // to other nodes. Pod disruption budget makes sure at most one pod + // owned by the RC is not Ready. So no need to test it. Though, usefull to have it printed. + glog.Infof("RC ReadyReplicas/Replicas: %v/%v", rcObj.Status.ReadyReplicas, rcObj.Status.Replicas) + + // This makes sure at most one replica is not ready + if rcObj.Status.Replicas-rcObj.Status.ReadyReplicas > 1 { + return false, fmt.Errorf("pod disruption budget not respected, node was not properly drained") + } + + // Depends on timing though a machine can be deleted even before there is only + // one pod left on the node (that is being evicted). + if podCounter > 2 { + glog.Infof("Expecting at most 2 pods to be scheduled to drained node %q, got %v", machine.Status.NodeRef.Name, podCounter) + return false, nil + } + + glog.Info("Expected result: all pods from the RC up to last one or two got scheduled to a different node while respecting PDB") + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + g.By("Validating the machine is deleted") + err = wait.PollImmediate(e2e.RetryMedium, e2e.WaitShort, func() (bool, error) { + machine := mapiv1beta1.Machine{} + + key := types.NamespacedName{ + Namespace: machine1.Namespace, + Name: machine1.Name, + } + err := client.Get(context.TODO(), key, &machine) + if err == nil { + glog.Errorf("Machine %q not yet deleted", machine1.Name) + return false, nil + } + + if !strings.Contains(err.Error(), "not found") { + glog.Errorf("Error querying api machine %q object: %v, retrying...", machine1.Name, err) + return false, nil + } + + glog.Infof("Machine %q successfully deleted", machine1.Name) + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + // Validate underlying node is removed as well + err = wait.PollImmediate(e2e.RetryMedium, e2e.WaitLong, func() (bool, error) { + node := corev1.Node{} + + key := types.NamespacedName{ + Name: drainedNodeName, + } + err := client.Get(context.TODO(), key, &node) + if err == nil { + glog.Errorf("Node %q not yet deleted", drainedNodeName) + return false, nil + } + + if !strings.Contains(err.Error(), "not found") { + glog.Errorf("Error querying api node %q object: %v, retrying...", drainedNodeName, err) + return false, nil + } + + glog.Infof("Node %q successfully deleted", drainedNodeName) + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + }) + +}) diff --git a/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/autoscaler/autoscaler.go b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/autoscaler/autoscaler.go new file mode 100644 index 0000000000..f01c39ae32 --- /dev/null +++ b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/autoscaler/autoscaler.go @@ -0,0 +1,365 @@ +package autoscaler + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/golang/glog" + g "github.com/onsi/ginkgo" + o "github.com/onsi/gomega" + e2e "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/framework" + mapiv1beta1 "github.com/openshift/cluster-api/pkg/apis/machine/v1beta1" + caov1alpha1 "github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1" + batchv1 "k8s.io/api/batch/v1" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/uuid" + "k8s.io/apimachinery/pkg/util/wait" + runtimeclient "sigs.k8s.io/controller-runtime/pkg/client" +) + +func newWorkLoad() *batchv1.Job { + backoffLimit := int32(4) + completions := int32(50) + parallelism := int32(50) + activeDeadlineSeconds := int64(100) + return &batchv1.Job{ + ObjectMeta: metav1.ObjectMeta{ + Name: "workload", + Namespace: "default", + }, + TypeMeta: metav1.TypeMeta{ + Kind: "Job", + APIVersion: "batch/v1", + }, + Spec: batchv1.JobSpec{ + Template: corev1.PodTemplateSpec{ + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: "workload", + Image: "busybox", + Command: []string{ + "sleep", + "300", + }, + Resources: corev1.ResourceRequirements{ + Requests: corev1.ResourceList{ + "memory": resource.MustParse("500Mi"), + "cpu": resource.MustParse("500m"), + }, + }, + }, + }, + RestartPolicy: corev1.RestartPolicy("Never"), + NodeSelector: map[string]string{ + "node-role.kubernetes.io/worker": "", + }, + Tolerations: []corev1.Toleration{ + { + Key: "kubemark", + Operator: corev1.TolerationOpExists, + }, + }, + }, + }, + ActiveDeadlineSeconds: &activeDeadlineSeconds, + BackoffLimit: &backoffLimit, + Completions: &completions, + Parallelism: ¶llelism, + }, + } +} + +func labelMachineSetNodes(client runtimeclient.Client, ms *mapiv1beta1.MachineSet, nodeTestLabel string) error { + return wait.PollImmediate(e2e.RetryMedium, e2e.WaitShort, func() (bool, error) { + scaledMachines := mapiv1beta1.MachineList{} + if err := client.List(context.TODO(), runtimeclient.MatchingLabels(ms.Spec.Selector.MatchLabels), &scaledMachines); err != nil { + glog.Errorf("Error querying api for machineset object: %v, retrying...", err) + return false, nil + } + + // get all linked nodes and label them + for _, machine := range scaledMachines.Items { + if machine.Status.NodeRef == nil { + glog.Errorf("Machine %q does not have node reference set", machine.Name) + return false, nil + } + node := corev1.Node{} + if err := client.Get(context.TODO(), types.NamespacedName{Name: machine.Status.NodeRef.Name}, &node); err != nil { + glog.Errorf("error querying api for node object: %v, retrying...", err) + return false, nil + } + + labelNode := false + if node.Labels == nil { + labelNode = true + } else if _, exists := node.Labels[nodeTestLabel]; !exists { + labelNode = true + } + + if labelNode { + nodeCopy := node.DeepCopy() + if nodeCopy.Labels == nil { + nodeCopy.Labels = make(map[string]string) + } + nodeCopy.Labels[nodeTestLabel] = "" + if err := client.Update(context.TODO(), nodeCopy); err != nil { + glog.Errorf("error updating api for node object: %v, retrying...", err) + return false, nil + } + glog.Infof("Labeling node %q with %q label", nodeCopy.Name, nodeTestLabel) + } + } + return true, nil + }) +} + +var _ = g.Describe("[Feature:Machines] Autoscaler should", func() { + defer g.GinkgoRecover() + + g.It("scale out", func() { + var err error + client, err := e2e.LoadClient() + o.Expect(err).NotTo(o.HaveOccurred()) + glog.Info("Get one machineSet") + machineSetList := mapiv1beta1.MachineSetList{} + err = wait.PollImmediate(1*time.Second, e2e.WaitMedium, func() (bool, error) { + if err := client.List(context.TODO(), runtimeclient.InNamespace(e2e.TestContext.MachineApiNamespace), &machineSetList); err != nil { + glog.Errorf("error querying api for nodeList object: %v, retrying...", err) + return false, err + } + return len(machineSetList.Items) > 0, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + // When we add support for machineDeployments on the installer, cluster-autoscaler and cluster-autoscaler-operator + // we need to test against deployments instead so we skip this test. + targetMachineSet := machineSetList.Items[0] + if ownerReferences := targetMachineSet.GetOwnerReferences(); len(ownerReferences) > 0 { + // glog.Infof("MachineSet %s is owned by a machineDeployment. Please run tests against machineDeployment instead", targetMachineSet.Name) + g.Skip(fmt.Sprintf("MachineSet %s is owned by a machineDeployment. Please run tests against machineDeployment instead", targetMachineSet.Name)) + } + + glog.Infof("Create ClusterAutoscaler and MachineAutoscaler objects. Targeting machineSet %s", targetMachineSet.Name) + initialNumberOfReplicas := targetMachineSet.Spec.Replicas + tenSecondString := "10s" + clusterAutoscaler := caov1alpha1.ClusterAutoscaler{ + ObjectMeta: metav1.ObjectMeta{ + Name: "default", + Namespace: e2e.TestContext.MachineApiNamespace, + }, + TypeMeta: metav1.TypeMeta{ + Kind: "ClusterAutoscaler", + APIVersion: "autoscaling.openshift.io/v1alpha1", + }, + Spec: caov1alpha1.ClusterAutoscalerSpec{ + ScaleDown: &caov1alpha1.ScaleDownConfig{ + Enabled: true, + DelayAfterAdd: &tenSecondString, + DelayAfterDelete: &tenSecondString, + DelayAfterFailure: &tenSecondString, + UnneededTime: &tenSecondString, + }, + }, + } + machineAutoscaler := caov1alpha1.MachineAutoscaler{ + ObjectMeta: metav1.ObjectMeta{ + GenerateName: fmt.Sprintf("autoscale-%s", targetMachineSet.Name), + Namespace: e2e.TestContext.MachineApiNamespace, + }, + TypeMeta: metav1.TypeMeta{ + Kind: "MachineAutoscaler", + APIVersion: "autoscaling.openshift.io/v1alpha1", + }, + Spec: caov1alpha1.MachineAutoscalerSpec{ + MaxReplicas: *initialNumberOfReplicas + 1, + MinReplicas: 1, + ScaleTargetRef: caov1alpha1.CrossVersionObjectReference{ + Name: targetMachineSet.Name, + Kind: "MachineSet", + APIVersion: "machine.openshift.io/v1beta1", + }, + }, + } + err = wait.PollImmediate(1*time.Second, e2e.WaitMedium, func() (bool, error) { + if err := client.Create(context.TODO(), &clusterAutoscaler); err != nil { + if !strings.Contains(err.Error(), "already exists") { + glog.Errorf("error querying api for clusterAutoscaler object: %v, retrying...", err) + return false, err + } + } + if err := client.Create(context.TODO(), &machineAutoscaler); err != nil { + if !strings.Contains(err.Error(), "already exists") { + glog.Errorf("error querying api for machineAutoscaler object: %v, retrying...", err) + return false, err + } + } + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + workLoad := newWorkLoad() + + // We want to clean up these objects on any subsequent error. + defer func() { + if workLoad != nil { + cascadeDelete := metav1.DeletePropagationForeground + wait.PollImmediate(1*time.Second, e2e.WaitShort, func() (bool, error) { + if err := client.Delete(context.TODO(), workLoad, func(opt *runtimeclient.DeleteOptions) { + opt.PropagationPolicy = &cascadeDelete + }); err != nil { + glog.Errorf("error querying api for workLoad object: %v, retrying...", err) + return false, nil + } + return true, nil + }) + glog.Info("Deleted workload object") + } + + wait.PollImmediate(1*time.Second, e2e.WaitShort, func() (bool, error) { + if err := client.Delete(context.TODO(), &machineAutoscaler); err != nil { + glog.Errorf("error querying api for machineAutoscaler object: %v, retrying...", err) + return false, nil + } + return true, nil + }) + glog.Info("Deleted machineAutoscaler object") + + wait.PollImmediate(1*time.Second, e2e.WaitShort, func() (bool, error) { + if err := client.Delete(context.TODO(), &clusterAutoscaler); err != nil { + glog.Errorf("error querying api for clusterAutoscaler object: %v, retrying...", err) + return false, nil + } + return true, nil + }) + glog.Info("Deleted clusterAutoscaler object") + }() + + nodeTestLabel := fmt.Sprintf("machine.openshift.io/autoscaling-test-%v", string(uuid.NewUUID())) + + // Label all nodes belonging to the machineset (before scale up phase) + err = labelMachineSetNodes(client, &targetMachineSet, nodeTestLabel) + o.Expect(err).NotTo(o.HaveOccurred()) + + glog.Info("Get nodeList") + nodeList := corev1.NodeList{} + err = wait.PollImmediate(1*time.Second, e2e.WaitMedium, func() (bool, error) { + if err := client.List(context.TODO(), runtimeclient.MatchingLabels(map[string]string{nodeTestLabel: ""}), &nodeList); err != nil { + glog.Errorf("error querying api for nodeList object: %v, retrying...", err) + return false, err + } + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + nodeGroupInitialTotalNodes := len(nodeList.Items) + glog.Infof("Cluster initial number of nodes in node group %v is %d", targetMachineSet.Name, nodeGroupInitialTotalNodes) + + glog.Info("Create workload") + + err = wait.PollImmediate(1*time.Second, e2e.WaitMedium, func() (bool, error) { + if err := client.Create(context.TODO(), workLoad); err != nil { + glog.Errorf("error querying api for workLoad object: %v, retrying...", err) + return false, err + } + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + glog.Info("Waiting for cluster to scale out number of replicas") + err = wait.PollImmediate(5*time.Second, e2e.WaitLong, func() (bool, error) { + msKey := types.NamespacedName{ + Namespace: e2e.TestContext.MachineApiNamespace, + Name: targetMachineSet.Name, + } + ms := &mapiv1beta1.MachineSet{} + if err := client.Get(context.TODO(), msKey, ms); err != nil { + glog.Errorf("error querying api for clusterAutoscaler object: %v, retrying...", err) + return false, nil + } + glog.Infof("MachineSet %s. Initial number of replicas: %d. Current number of replicas: %d", targetMachineSet.Name, *initialNumberOfReplicas, *ms.Spec.Replicas) + return *ms.Spec.Replicas > *initialNumberOfReplicas, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + glog.Info("Waiting for cluster to scale up nodes") + err = wait.PollImmediate(5*time.Second, e2e.WaitLong, func() (bool, error) { + scaledMachines := mapiv1beta1.MachineList{} + if err := client.List(context.TODO(), runtimeclient.MatchingLabels(targetMachineSet.Spec.Selector.MatchLabels), &scaledMachines); err != nil { + glog.Errorf("Error querying api for machineset object: %v, retrying...", err) + return false, nil + } + + // get all linked nodes and label them + nodeCounter := 0 + for _, machine := range scaledMachines.Items { + if machine.Status.NodeRef == nil { + glog.Errorf("Machine %q does not have node reference set", machine.Name) + return false, nil + } + nodeCounter++ + } + + glog.Infof("Expecting at least one new node to come up. Initial number of node group nodes: %d. Current number of nodes in the group: %d", nodeGroupInitialTotalNodes, nodeCounter) + return nodeCounter > nodeGroupInitialTotalNodes, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + // Label all nodes belonging to the machineset (after scale up phase) + err = labelMachineSetNodes(client, &targetMachineSet, nodeTestLabel) + o.Expect(err).NotTo(o.HaveOccurred()) + + glog.Info("Delete workload") + err = wait.PollImmediate(5*time.Second, e2e.WaitMedium, func() (bool, error) { + cascadeDelete := metav1.DeletePropagationForeground + if err := client.Delete(context.TODO(), workLoad, func(opt *runtimeclient.DeleteOptions) { + opt.PropagationPolicy = &cascadeDelete + }); err != nil { + glog.Errorf("error querying api for workLoad object: %v, retrying...", err) + return false, nil + } + workLoad = nil + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + // As we have just deleted the workload the autoscaler will + // start to scale down the unneeded nodes. We wait for that + // condition; if successful we assert that (a smoke test of) + // scale down is functional. + glog.Info("Wait for cluster to have at most initial number of replicas") + err = wait.PollImmediate(5*time.Second, e2e.WaitLong, func() (bool, error) { + msKey := types.NamespacedName{ + Namespace: e2e.TestContext.MachineApiNamespace, + Name: targetMachineSet.Name, + } + ms := &mapiv1beta1.MachineSet{} + if err := client.Get(context.TODO(), msKey, ms); err != nil { + glog.Errorf("error querying api for machineSet object: %v, retrying...", err) + return false, nil + } + glog.Infof("Initial number of replicas: %d. Current number of replicas: %d", *initialNumberOfReplicas, *ms.Spec.Replicas) + if *ms.Spec.Replicas > *initialNumberOfReplicas { + return false, nil + } + + // Make sure all scaled down nodes are really gove (so they don't affect tests run after this one) + scaledNodes := corev1.NodeList{} + if err := client.List(context.TODO(), runtimeclient.MatchingLabels(map[string]string{nodeTestLabel: ""}), &scaledNodes); err != nil { + glog.Errorf("Error querying api for node objects: %v, retrying...", err) + return false, nil + } + scaledNodesLen := int32(len(scaledNodes.Items)) + glog.Infof("Current number of replicas: %d. Current number of nodes: %d", *ms.Spec.Replicas, scaledNodesLen) + // get all linked nodes (so we can wait later on their deletion) + return scaledNodesLen <= *ms.Spec.Replicas && scaledNodesLen <= *initialNumberOfReplicas, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + }) + +}) diff --git a/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/e2e_test.go b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/e2e_test.go new file mode 100644 index 0000000000..0c8a94ceeb --- /dev/null +++ b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/e2e_test.go @@ -0,0 +1,38 @@ +package e2e + +import ( + "testing" + + "github.com/golang/glog" + g "github.com/onsi/ginkgo" + o "github.com/onsi/gomega" + + osconfigv1 "github.com/openshift/api/config/v1" + mapiv1beta1 "github.com/openshift/cluster-api/pkg/apis/machine/v1beta1" + caov1alpha1 "github.com/openshift/cluster-autoscaler-operator/pkg/apis" + "k8s.io/client-go/kubernetes/scheme" + + _ "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/actuators" + _ "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/autoscaler" + _ "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/infra" + _ "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/operators" +) + +func init() { + if err := mapiv1beta1.AddToScheme(scheme.Scheme); err != nil { + glog.Fatal(err) + } + + if err := caov1alpha1.AddToScheme(scheme.Scheme); err != nil { + glog.Fatal(err) + } + + if err := osconfigv1.AddToScheme(scheme.Scheme); err != nil { + glog.Fatal(err) + } +} + +func TestE2E(t *testing.T) { + o.RegisterFailHandler(g.Fail) + g.RunSpecs(t, "Machine Suite") +} diff --git a/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/framework/common.go b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/framework/common.go new file mode 100644 index 0000000000..1bc0e4f857 --- /dev/null +++ b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/framework/common.go @@ -0,0 +1,11 @@ +package framework + +import "time" + +const ( + WorkerRoleLabel = "node-role.kubernetes.io/worker" + WaitShort = 1 * time.Minute + WaitMedium = 3 * time.Minute + WaitLong = 10 * time.Minute + RetryMedium = 5 * time.Second +) diff --git a/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/framework/framework.go b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/framework/framework.go index 1c7a0b9d07..5f8d22dc9f 100644 --- a/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/framework/framework.go +++ b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/framework/framework.go @@ -1,6 +1,7 @@ package framework import ( + "context" "flag" "fmt" "os/exec" @@ -9,18 +10,17 @@ import ( "github.com/golang/glog" - "k8s.io/client-go/tools/clientcmd" - + "github.com/openshift/cluster-api/pkg/client/clientset_generated/clientset" appsv1beta2 "k8s.io/api/apps/v1beta2" + corev1 "k8s.io/api/core/v1" + apiextensionsclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" - - // apiregistrationclientset "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset" - - "github.com/openshift/cluster-api/pkg/client/clientset_generated/clientset" - apiextensionsclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" + "k8s.io/client-go/tools/clientcmd" + clientcmdapi "k8s.io/client-go/tools/clientcmd/api" + runtimeclient "sigs.k8s.io/controller-runtime/pkg/client" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -43,8 +43,6 @@ const ( TimeoutPoolMachineRunningInterval = 10 * time.Minute ) -var kubeconfig string - // ClusterID set by -cluster-id flag var ClusterID string @@ -61,8 +59,17 @@ var nodelinkControllerImage string var libvirtURI string var libvirtPK string +type TestContextType struct { + KubeConfig string + MachineApiNamespace string + Host string +} + +var TestContext TestContextType + func init() { - flag.StringVar(&kubeconfig, "kubeconfig", "", "kubeconfig file") + flag.StringVar(&TestContext.KubeConfig, "kubeconfig", "", "kubeconfig file") + flag.StringVar(&TestContext.MachineApiNamespace, "machine-api-namespace", "openshift-machine-api", "Default machine API namespace") flag.StringVar(&ClusterID, "cluster-id", "", "cluster ID") flag.StringVar(&sshkey, "ssh-key", "", "Path to private ssh to connect to instances (e.g. to download kubeconfig or copy docker images)") flag.StringVar(&sshuser, "ssh-user", "ec2-user", "Ssh user to connect to instances") @@ -113,11 +120,11 @@ func NewFramework() (*Framework, error) { if sshkey == "" { return nil, fmt.Errorf("-sshkey not set") } - if kubeconfig == "" { + if TestContext.KubeConfig == "" { return nil, fmt.Errorf("-kubeconfig not set") } f := &Framework{ - Kubeconfig: kubeconfig, + Kubeconfig: TestContext.KubeConfig, SSH: &SSHConfig{ Key: sshkey, User: sshuser, @@ -372,3 +379,64 @@ func (f *Framework) UploadDockerImageToInstance(image, targetMachine string) err glog.V(2).Info(string(out)) return nil } + +// RestclientConfig builds a REST client config +func RestclientConfig() (*clientcmdapi.Config, error) { + glog.Infof(">>> kubeConfig: %s", TestContext.KubeConfig) + if TestContext.KubeConfig == "" { + return nil, fmt.Errorf("KubeConfig must be specified to load client config") + } + c, err := clientcmd.LoadFromFile(TestContext.KubeConfig) + if err != nil { + return nil, fmt.Errorf("error loading KubeConfig: %v", err.Error()) + } + return c, nil +} + +// LoadConfig builds config from kubernetes config +func LoadConfig() (*rest.Config, error) { + c, err := RestclientConfig() + if err != nil { + if TestContext.KubeConfig == "" { + return rest.InClusterConfig() + } + return nil, err + } + return clientcmd.NewDefaultClientConfig(*c, &clientcmd.ConfigOverrides{ClusterInfo: clientcmdapi.Cluster{Server: TestContext.Host}}).ClientConfig() +} + +// LoadClient builds controller runtime client that accepts any registered type +func LoadClient() (runtimeclient.Client, error) { + config, err := LoadConfig() + if err != nil { + return nil, fmt.Errorf("error creating client: %v", err.Error()) + } + return runtimeclient.New(config, runtimeclient.Options{}) +} + +func IsNodeReady(node *corev1.Node) bool { + for _, c := range node.Status.Conditions { + if c.Type == corev1.NodeReady { + return c.Status == corev1.ConditionTrue + } + } + return false +} + +func WaitUntilAllNodesAreReady(client runtimeclient.Client) error { + return wait.PollImmediate(1*time.Second, time.Minute, func() (bool, error) { + nodeList := corev1.NodeList{} + if err := client.List(context.TODO(), &runtimeclient.ListOptions{}, &nodeList); err != nil { + glog.Errorf("error querying api for nodeList object: %v, retrying...", err) + return false, nil + } + // All nodes needs to be ready + for _, node := range nodeList.Items { + if !IsNodeReady(&node) { + glog.Errorf("Node %q is not ready", node.Name) + return false, nil + } + } + return true, nil + }) +} diff --git a/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/infra/infra.go b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/infra/infra.go new file mode 100644 index 0000000000..9791f5c941 --- /dev/null +++ b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/infra/infra.go @@ -0,0 +1,270 @@ +package infra + +import ( + "context" + "errors" + "fmt" + "time" + + "github.com/golang/glog" + g "github.com/onsi/ginkgo" + o "github.com/onsi/gomega" + e2e "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/framework" + mapiv1beta1 "github.com/openshift/cluster-api/pkg/apis/machine/v1beta1" + controllernode "github.com/openshift/cluster-api/pkg/controller/node" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/util/uuid" + "k8s.io/apimachinery/pkg/util/wait" + runtimeclient "sigs.k8s.io/controller-runtime/pkg/client" +) + +var _ = g.Describe("[Feature:Machines] Machines should", func() { + defer g.GinkgoRecover() + + g.It("be linked with nodes", func() { + var err error + client, err := e2e.LoadClient() + o.Expect(err).NotTo(o.HaveOccurred()) + + listOptions := runtimeclient.ListOptions{ + Namespace: e2e.TestContext.MachineApiNamespace, + } + machineList := mapiv1beta1.MachineList{} + nodeList := corev1.NodeList{} + + err = wait.PollImmediate(5*time.Second, e2e.WaitShort, func() (bool, error) { + if err := client.List(context.TODO(), &listOptions, &machineList); err != nil { + glog.Errorf("error querying api for machineList object: %v, retrying...", err) + return false, nil + } + if err := client.List(context.TODO(), &listOptions, &nodeList); err != nil { + glog.Errorf("error querying api for nodeList object: %v, retrying...", err) + return false, nil + } + + // Every machine needs to be linked to a node, though some nodes do not have to linked to any machines + glog.Infof("Expecting at least the same number of machines as nodes, have %v nodes and %v machines", len(nodeList.Items), len(machineList.Items)) + if len(machineList.Items) > len(nodeList.Items) { + return false, nil + } + + nodeNameToMachineAnnotation := make(map[string]string) + for _, node := range nodeList.Items { + nodeNameToMachineAnnotation[node.Name] = node.Annotations[controllernode.MachineAnnotationKey] + } + for _, machine := range machineList.Items { + if machine.Status.NodeRef == nil { + glog.Errorf("machine %s has no NodeRef, retrying...", machine.Name) + return false, nil + } + nodeName := machine.Status.NodeRef.Name + if nodeNameToMachineAnnotation[nodeName] != fmt.Sprintf("%s/%s", e2e.TestContext.MachineApiNamespace, machine.Name) { + glog.Errorf("node name %s does not match expected machine name %s, retrying...", nodeName, machine.Name) + return false, nil + } + glog.Infof("Machine %q is linked to node %q", machine.Name, nodeName) + } + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + }) + + g.It("have ability to additively reconcile taints", func() { + var err error + client, err := e2e.LoadClient() + o.Expect(err).NotTo(o.HaveOccurred()) + + g.By("Verify machine taints are getting applied to node") + err = func() error { + listOptions := runtimeclient.ListOptions{ + Namespace: e2e.TestContext.MachineApiNamespace, + } + machineList := mapiv1beta1.MachineList{} + + if err := client.List(context.TODO(), &listOptions, &machineList); err != nil { + return fmt.Errorf("error querying api for machineList object: %v", err) + } + g.By("Got the machine list") + machine := machineList.Items[0] + if machine.Status.NodeRef == nil { + return fmt.Errorf("machine %s has no NodeRef", machine.Name) + } + g.By(fmt.Sprintf("Got the machine %s", machine.Name)) + nodeName := machine.Status.NodeRef.Name + nodeKey := types.NamespacedName{ + Namespace: e2e.TestContext.MachineApiNamespace, + Name: nodeName, + } + node := &corev1.Node{} + + if err := client.Get(context.TODO(), nodeKey, node); err != nil { + return fmt.Errorf("error querying api for node object: %v", err) + } + g.By(fmt.Sprintf("Got the node %s from machine, %s", node.Name, machine.Name)) + nodeTaint := corev1.Taint{ + Key: "not-from-machine", + Value: "true", + Effect: corev1.TaintEffectNoSchedule, + } + // Do not remove any taint, just extend the list + // The test removes the nodes anyway, so the list will not grow over time much + node.Spec.Taints = append(node.Spec.Taints, nodeTaint) + if err := client.Update(context.TODO(), node); err != nil { + return fmt.Errorf("error updating node object with non-machine taint: %v", err) + } + g.By("Updated node object with taint") + machineTaint := corev1.Taint{ + Key: fmt.Sprintf("from-machine-%v", string(uuid.NewUUID())), + Value: "true", + Effect: corev1.TaintEffectNoSchedule, + } + + // Do not remove any taint, just extend the list + // The test removes the machine anyway, so the list will not grow over time much + machine.Spec.Taints = append(machine.Spec.Taints, machineTaint) + if err := client.Update(context.TODO(), &machine); err != nil { + return fmt.Errorf("error updating machine object with taint: %v", err) + } + + g.By("Updated machine object with taint") + var expectedTaints = sets.NewString("not-from-machine", machineTaint.Key) + err := wait.PollImmediate(1*time.Second, e2e.WaitLong, func() (bool, error) { + if err := client.Get(context.TODO(), nodeKey, node); err != nil { + glog.Errorf("error querying api for node object: %v", err) + return false, nil + } + glog.Info("Got the node again for verification of taints") + var observedTaints = sets.NewString() + for _, taint := range node.Spec.Taints { + observedTaints.Insert(taint.Key) + } + if expectedTaints.Difference(observedTaints).HasAny("not-from-machine", machineTaint.Key) == false { + glog.Infof("expected : %v, observed %v , difference %v, ", expectedTaints, observedTaints, expectedTaints.Difference(observedTaints)) + return true, nil + } + glog.Infof("Did not find all expected taints on the node. Missing: %v", expectedTaints.Difference(observedTaints)) + return false, nil + }) + return err + }() + o.Expect(err).NotTo(o.HaveOccurred()) + }) + + g.It("be replaced with new one when deleted", func() { + var err error + client, err := e2e.LoadClient() + o.Expect(err).NotTo(o.HaveOccurred()) + + // Assume cluster state + err = e2e.WaitUntilAllNodesAreReady(client) + o.Expect(err).NotTo(o.HaveOccurred()) + + glog.Info("Get machineList") + machineList := mapiv1beta1.MachineList{} + err = wait.PollImmediate(1*time.Second, e2e.WaitShort, func() (bool, error) { + if err := client.List(context.TODO(), runtimeclient.InNamespace(e2e.TestContext.MachineApiNamespace), &machineList); err != nil { + glog.Errorf("error querying api for machineList object: %v, retrying...", err) + return false, nil + } + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + glog.Info("Get nodeList") + nodeList := corev1.NodeList{} + err = wait.PollImmediate(1*time.Second, e2e.WaitShort, func() (bool, error) { + if err := client.List(context.TODO(), nil, &nodeList); err != nil { + glog.Errorf("error querying api for nodeList object: %v, retrying...", err) + return false, nil + } + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + clusterInitialTotalNodes := len(nodeList.Items) + clusterInitialTotalMachines := len(machineList.Items) + var triagedWorkerMachine *mapiv1beta1.Machine + var triagedWorkerNode *corev1.Node + + glog.Infof("Initial number of nodes: %v, initial number of machines: %v", clusterInitialTotalNodes, clusterInitialTotalMachines) + + err = func() error { + for _, machine := range machineList.Items { + if machine.Status.NodeRef == nil { + glog.Infof("Machine %q is not linked to any node", machine.Name) + continue + } + node := corev1.Node{} + if err := client.Get(context.TODO(), types.NamespacedName{Name: machine.Status.NodeRef.Name}, &node); err != nil { + glog.Errorf("error querying api for node object: %v, retrying...", err) + continue + } + + if node.Labels == nil { + continue + } + + if _, exists := node.Labels["node-role.kubernetes.io/worker"]; !exists { + continue + } + + triagedWorkerNode = node.DeepCopy() + triagedWorkerMachine = machine.DeepCopy() + break + } + if triagedWorkerMachine == nil { + return errors.New("Unable to find any worker machine") + } + return nil + }() + o.Expect(err).NotTo(o.HaveOccurred()) + + glog.Infof("Delete machine %v", triagedWorkerMachine.Name) + err = wait.PollImmediate(1*time.Second, e2e.WaitShort, func() (bool, error) { + if err := client.Delete(context.TODO(), triagedWorkerMachine); err != nil { + glog.Errorf("error querying api for Deployment object: %v, retrying...", err) + return false, nil + } + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + err = wait.PollImmediate(5*time.Second, e2e.WaitMedium, func() (bool, error) { + if err := client.List(context.TODO(), runtimeclient.InNamespace(e2e.TestContext.MachineApiNamespace), &machineList); err != nil { + glog.Errorf("error querying api for machineList object: %v, retrying...", err) + return false, nil + } + glog.Info("Expect new machine to come up") + return len(machineList.Items) == clusterInitialTotalMachines, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + err = wait.PollImmediate(5*time.Second, e2e.WaitLong, func() (bool, error) { + if err := client.List(context.TODO(), nil, &nodeList); err != nil { + glog.Errorf("error querying api for nodeList object: %v, retrying...", err) + return false, nil + } + glog.Info("Expect deleted machine node to go away") + for _, n := range nodeList.Items { + if n.Name == triagedWorkerNode.Name { + return false, nil + } + } + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + err = wait.PollImmediate(5*time.Second, e2e.WaitLong, func() (bool, error) { + if err := client.List(context.TODO(), nil, &nodeList); err != nil { + glog.Errorf("error querying api for nodeList object: %v, retrying...", err) + return false, nil + } + glog.Info("Expect new node to come up") + return len(nodeList.Items) == clusterInitialTotalNodes, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + }) + +}) diff --git a/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/openshift/suites/smoke_suite.go b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/openshift/suites/smoke_suite.go index a407ada9c9..83dcfd9e6e 100644 --- a/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/openshift/suites/smoke_suite.go +++ b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/openshift/suites/smoke_suite.go @@ -364,7 +364,7 @@ func (tc *testConfig) ExpectNewNodeWhenDeletingMachine(ctx context.Context) erro var triagedWorkerNode corev1.Node MachineLoop: for _, m := range machineList.Items { - if m.Labels["sigs.k8s.io/cluster-api-machine-role"] == "worker" { + if m.Labels["machine.openshift.io/cluster-api-machine-role"] == "worker" { for _, n := range nodeList.Items { if m.Status.NodeRef == nil { glog.Errorf("no NodeRef found in machine %v", m.Name) @@ -471,6 +471,7 @@ func (tc *testConfig) ExpectAutoscalerScalesOut(ctx context.Context) error { glog.Infof("Create ClusterAutoscaler and MachineAutoscaler objects. Targeting machineSet %s", targetMachineSet.Name) initialNumberOfReplicas := targetMachineSet.Spec.Replicas + tenSeconds := "10s" clusterAutoscaler := caov1alpha1.ClusterAutoscaler{ ObjectMeta: metav1.ObjectMeta{ Name: "default", @@ -483,10 +484,10 @@ func (tc *testConfig) ExpectAutoscalerScalesOut(ctx context.Context) error { Spec: caov1alpha1.ClusterAutoscalerSpec{ ScaleDown: &caov1alpha1.ScaleDownConfig{ Enabled: true, - DelayAfterAdd: "10s", - DelayAfterDelete: "10s", - DelayAfterFailure: "10s", - UnneededTime: "10s", + DelayAfterAdd: &tenSeconds, + DelayAfterDelete: &tenSeconds, + DelayAfterFailure: &tenSeconds, + UnneededTime: &tenSeconds, }, }, } diff --git a/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/operators/cluster-autoscaler-operator.go b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/operators/cluster-autoscaler-operator.go new file mode 100644 index 0000000000..b0c79bc886 --- /dev/null +++ b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/operators/cluster-autoscaler-operator.go @@ -0,0 +1,75 @@ +package operators + +import ( + "context" + "time" + + "github.com/golang/glog" + g "github.com/onsi/ginkgo" + o "github.com/onsi/gomega" + osconfigv1 "github.com/openshift/api/config/v1" + e2e "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/framework" + cvoresourcemerge "github.com/openshift/cluster-version-operator/lib/resourcemerge" + kappsapi "k8s.io/api/apps/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" +) + +var _ = g.Describe("[Feature:Operators] Cluster autoscaler operator should", func() { + defer g.GinkgoRecover() + + g.It("be available", func() { + var err error + client, err := e2e.LoadClient() + o.Expect(err).NotTo(o.HaveOccurred()) + + key := types.NamespacedName{ + Namespace: e2e.TestContext.MachineApiNamespace, + Name: "cluster-autoscaler-operator", + } + d := &kappsapi.Deployment{} + + err = wait.PollImmediate(1*time.Second, e2e.WaitShort, func() (bool, error) { + if err := client.Get(context.TODO(), key, d); err != nil { + glog.Errorf("error querying api for Deployment object: %v, retrying...", err) + return false, nil + } + if d.Status.ReadyReplicas < 1 { + return false, nil + } + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + }) +}) + +var _ = g.Describe("[Feature:Operators] Cluster autoscaler cluster operator should", func() { + defer g.GinkgoRecover() + + g.It("be available", func() { + var err error + client, err := e2e.LoadClient() + o.Expect(err).NotTo(o.HaveOccurred()) + + key := types.NamespacedName{ + Namespace: e2e.TestContext.MachineApiNamespace, + Name: "cluster-autoscaler", + } + clusterOperator := &osconfigv1.ClusterOperator{} + + err = wait.PollImmediate(1*time.Second, e2e.WaitShort, func() (bool, error) { + if err := client.Get(context.TODO(), key, clusterOperator); err != nil { + glog.Errorf("error querying api for OperatorStatus object: %v, retrying...", err) + return false, nil + } + if available := cvoresourcemerge.FindOperatorStatusCondition(clusterOperator.Status.Conditions, osconfigv1.OperatorAvailable); available != nil { + if available.Status == osconfigv1.ConditionTrue { + return true, nil + } + } + return false, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + }) + +}) diff --git a/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/operators/machine-api-operator.go b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/operators/machine-api-operator.go new file mode 100644 index 0000000000..7aeee062ec --- /dev/null +++ b/vendor/github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/operators/machine-api-operator.go @@ -0,0 +1,165 @@ +package operators + +import ( + "context" + "fmt" + "time" + + "github.com/golang/glog" + g "github.com/onsi/ginkgo" + o "github.com/onsi/gomega" + osconfigv1 "github.com/openshift/api/config/v1" + e2e "github.com/openshift/cluster-api-actuator-pkg/pkg/e2e/framework" + cvoresourcemerge "github.com/openshift/cluster-version-operator/lib/resourcemerge" + kappsapi "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" + runtimeclient "sigs.k8s.io/controller-runtime/pkg/client" +) + +var _ = g.Describe("[Feature:Operators] Machine API operator should", func() { + defer g.GinkgoRecover() + + g.It("be available", func() { + var err error + client, err := e2e.LoadClient() + o.Expect(err).NotTo(o.HaveOccurred()) + + key := types.NamespacedName{ + Namespace: e2e.TestContext.MachineApiNamespace, + Name: "machine-api-operator", + } + d := &kappsapi.Deployment{} + + err = wait.PollImmediate(1*time.Second, e2e.WaitShort, func() (bool, error) { + if err := client.Get(context.TODO(), key, d); err != nil { + glog.Errorf("error querying api for Deployment object: %v, retrying...", err) + return false, nil + } + glog.Infof("Have %v ready replicas, expecting 1", d.Status.ReadyReplicas) + if d.Status.ReadyReplicas < 1 { + return false, nil + } + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + }) + + g.It("reconcile controllers deployment", func() { + var err error + client, err := e2e.LoadClient() + o.Expect(err).NotTo(o.HaveOccurred()) + + key := types.NamespacedName{ + Namespace: e2e.TestContext.MachineApiNamespace, + Name: "clusterapi-manager-controllers", + } + d := &kappsapi.Deployment{} + + glog.Info("Get deployment") + err = wait.PollImmediate(1*time.Second, e2e.WaitShort, func() (bool, error) { + if err := client.Get(context.TODO(), key, d); err != nil { + glog.Errorf("error querying api for Deployment object: %v, retrying...", err) + return false, nil + } + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + g.By("Getting pod owned by the deployment") + var deploymentPod *corev1.Pod + err = wait.PollImmediate(1*time.Second, e2e.WaitShort, func() (bool, error) { + pods := corev1.PodList{} + listOpt := &runtimeclient.ListOptions{} + listOpt.MatchingLabels(d.Spec.Selector.MatchLabels) + if err := client.List(context.TODO(), listOpt, &pods); err != nil { + glog.Errorf("error querying api for Deployment object: %v, retrying...", err) + return false, nil + } + if len(pods.Items) != 1 { + glog.Errorf("expected exactly one pod running, have %v", len(pods.Items)) + return false, nil + } + deploymentPod = &pods.Items[0] + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + glog.Info("Delete deployment") + err = wait.PollImmediate(1*time.Second, e2e.WaitShort, func() (bool, error) { + if err := client.Delete(context.TODO(), d); err != nil { + glog.Errorf("error querying api for Deployment object: %v, retrying...", err) + return false, nil + } + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + + glog.Info("Verify deployment is recreated") + err = wait.PollImmediate(1*time.Second, e2e.WaitLong, func() (bool, error) { + if err := client.Get(context.TODO(), key, d); err != nil { + glog.Errorf("error querying api for Deployment object: %v, retrying...", err) + return false, nil + } + if d.Status.ReadyReplicas < 1 || !d.DeletionTimestamp.IsZero() { + return false, nil + } + + pods := corev1.PodList{} + listOpt := &runtimeclient.ListOptions{} + listOpt.MatchingLabels(d.Spec.Selector.MatchLabels) + if err := client.List(context.TODO(), listOpt, &pods); err != nil { + glog.Errorf("error querying api for Deployment object: %v, retrying...", err) + return false, nil + } + + for _, pod := range pods.Items { + fmt.Printf("pod(%v): %#v\n", pod.Name, pod.Status.Phase) + if pod.Name == deploymentPod.Name { + glog.Infof("Ignoring old deployment pod %v", pod.Name) + continue + } + if pod.Status.Phase != corev1.PodRunning { + glog.Errorf("Deployment pod %v not yet running, retrying...", pod.Name) + return false, nil + } + } + + return true, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + }) + +}) + +var _ = g.Describe("[Feature:Operators] Machine API cluster operator should", func() { + defer g.GinkgoRecover() + + g.It("be available", func() { + var err error + client, err := e2e.LoadClient() + o.Expect(err).NotTo(o.HaveOccurred()) + + key := types.NamespacedName{ + Namespace: e2e.TestContext.MachineApiNamespace, + Name: "machine-api", + } + clusterOperator := &osconfigv1.ClusterOperator{} + + err = wait.PollImmediate(1*time.Second, e2e.WaitShort, func() (bool, error) { + if err := client.Get(context.TODO(), key, clusterOperator); err != nil { + glog.Errorf("error querying api for OperatorStatus object: %v, retrying...", err) + return false, nil + } + if available := cvoresourcemerge.FindOperatorStatusCondition(clusterOperator.Status.Conditions, osconfigv1.OperatorAvailable); available != nil { + if available.Status == osconfigv1.ConditionTrue { + return true, nil + } + } + return false, nil + }) + o.Expect(err).NotTo(o.HaveOccurred()) + }) + +}) diff --git a/vendor/github.com/openshift/cluster-api/Dockerfile b/vendor/github.com/openshift/cluster-api/Dockerfile index f0d00be9f8..8c49ba98f4 100644 --- a/vendor/github.com/openshift/cluster-api/Dockerfile +++ b/vendor/github.com/openshift/cluster-api/Dockerfile @@ -16,16 +16,16 @@ FROM golang:1.11.5 as builder # Copy in the go src -WORKDIR $GOPATH/src/sigs.k8s.io/cluster-api +WORKDIR $GOPATH/src/github.com/openshift/cluster-api COPY pkg/ pkg/ COPY cmd/ cmd/ COPY vendor/ vendor/ # Build -RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-extldflags "-static"' -o manager sigs.k8s.io/cluster-api/cmd/manager +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-extldflags "-static"' -o manager github.com/openshift/cluster-api/cmd/manager # Copy the controller-manager into a thin image FROM gcr.io/distroless/static:latest WORKDIR / -COPY --from=builder /go/src/sigs.k8s.io/cluster-api/manager . +COPY --from=builder /go/src/github.com/openshift/cluster-api/manager . ENTRYPOINT ["/manager"] diff --git a/vendor/github.com/openshift/cluster-api/pkg/apis/cluster/v1alpha1/doc.go b/vendor/github.com/openshift/cluster-api/pkg/apis/cluster/v1alpha1/doc.go index 9bd92e4352..269c574e93 100644 --- a/vendor/github.com/openshift/cluster-api/pkg/apis/cluster/v1alpha1/doc.go +++ b/vendor/github.com/openshift/cluster-api/pkg/apis/cluster/v1alpha1/doc.go @@ -17,7 +17,7 @@ limitations under the License. // Package v1alpha1 contains API Schema definitions for the cluster v1alpha1 API group // +k8s:openapi-gen=true // +k8s:deepcopy-gen=package,register -// +k8s:conversion-gen=sigs.k8s.io/cluster-api/pkg/apis/cluster +// +k8s:conversion-gen=github.com/openshift/cluster-api/pkg/apis/cluster // +k8s:defaulter-gen=TypeMeta // +groupName=cluster.k8s.io package v1alpha1 diff --git a/vendor/github.com/openshift/cluster-api/pkg/apis/cluster/v1alpha1/register.go b/vendor/github.com/openshift/cluster-api/pkg/apis/cluster/v1alpha1/register.go index d4b8529670..0b2c132c58 100644 --- a/vendor/github.com/openshift/cluster-api/pkg/apis/cluster/v1alpha1/register.go +++ b/vendor/github.com/openshift/cluster-api/pkg/apis/cluster/v1alpha1/register.go @@ -19,7 +19,7 @@ limitations under the License. // Package v1alpha1 contains API Schema definitions for the cluster v1alpha1 API group // +k8s:openapi-gen=true // +k8s:deepcopy-gen=package,register -// +k8s:conversion-gen=sigs.k8s.io/cluster-api/pkg/apis/cluster +// +k8s:conversion-gen=github.com/openshift/cluster-api/pkg/apis/cluster // +k8s:defaulter-gen=TypeMeta // +groupName=cluster.k8s.io package v1alpha1 diff --git a/vendor/github.com/openshift/cluster-api/pkg/apis/machine/v1beta1/doc.go b/vendor/github.com/openshift/cluster-api/pkg/apis/machine/v1beta1/doc.go index ca985dc5b9..349faed081 100644 --- a/vendor/github.com/openshift/cluster-api/pkg/apis/machine/v1beta1/doc.go +++ b/vendor/github.com/openshift/cluster-api/pkg/apis/machine/v1beta1/doc.go @@ -17,7 +17,7 @@ limitations under the License. // Package v1beta1 contains API Schema definitions for the machine v1beta1 API group // +k8s:openapi-gen=true // +k8s:deepcopy-gen=package,register -// +k8s:conversion-gen=sigs.k8s.io/cluster-api/pkg/apis/machine +// +k8s:conversion-gen=github.com/openshift/cluster-api/pkg/apis/machine // +k8s:defaulter-gen=TypeMeta // +groupName=machine.openshift.io package v1beta1 diff --git a/vendor/github.com/openshift/cluster-api/pkg/apis/machine/v1beta1/register.go b/vendor/github.com/openshift/cluster-api/pkg/apis/machine/v1beta1/register.go index 5062825dc8..586d1d898f 100644 --- a/vendor/github.com/openshift/cluster-api/pkg/apis/machine/v1beta1/register.go +++ b/vendor/github.com/openshift/cluster-api/pkg/apis/machine/v1beta1/register.go @@ -19,7 +19,7 @@ limitations under the License. // Package v1beta1 contains API Schema definitions for the machine v1beta1 API group // +k8s:openapi-gen=true // +k8s:deepcopy-gen=package,register -// +k8s:conversion-gen=sigs.k8s.io/cluster-api/pkg/apis/machine +// +k8s:conversion-gen=github.com/openshift/cluster-api/pkg/apis/machine // +k8s:defaulter-gen=TypeMeta // +groupName=machine.openshift.io package v1beta1 diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/.gitignore b/vendor/github.com/openshift/cluster-autoscaler-operator/.gitignore index 5362f2a6aa..85ce61b423 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/.gitignore +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/.gitignore @@ -1,5 +1,6 @@ /bin/ /build/ +/deploy/ # Temporary Build Files build/_output diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/Gopkg.lock b/vendor/github.com/openshift/cluster-autoscaler-operator/Gopkg.lock index c64df1fead..e10ed8739e 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/Gopkg.lock +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/Gopkg.lock @@ -261,34 +261,36 @@ [[projects]] branch = "master" - digest = "1:d60f58238786f29df539514efed06fae076de3d0db6aadf37c17c70449c3657a" + digest = "1:530300f70d660c91f34b5343390a0b79208553aa230ee2081f0122f0d6c79476" name = "github.com/openshift/api" packages = [ "config/v1", "security/v1", ] pruneopts = "NT" - revision = "83b2fe56301417028bd52e56edd75768e2ea051c" + revision = "21e40de482627b2047cbf430594540413539a442" [[projects]] branch = "master" - digest = "1:9e30e424d3f3e33499ef969c4eec3d7f9cbff3d504ce54f79e141895c3ad211e" + digest = "1:fd2167e64935d15d90ebc7f7e9c3823cb0410813a2f6950538554cc99efccc9d" name = "github.com/openshift/client-go" packages = [ "config/clientset/versioned", + "config/clientset/versioned/fake", "config/clientset/versioned/scheme", "config/clientset/versioned/typed/config/v1", + "config/clientset/versioned/typed/config/v1/fake", ] pruneopts = "NT" - revision = "960f72aa32a8e9b4dd769b90ff1cb5bd4c898eec" + revision = "f8b9b0633d7fe283277fc35b437428aed9ec5464" [[projects]] branch = "master" - digest = "1:d472843fad24d8cf23fc738a99d66b201630bb2cda03233a6989eb13193a5236" + digest = "1:af62f5be153110ed62358a19a6f758616d8d8fbb0f91dbe1847d2e7fc9ceeafc" name = "github.com/openshift/cluster-version-operator" packages = ["lib/resourcemerge"] pruneopts = "NT" - revision = "eec5a8fda3f50f21eef3d06546f2a1b80e93ca94" + revision = "00b7e79e19fd5fc0d6d962597d545b01a55dd294" [[projects]] digest = "1:93b1d84c5fa6d1ea52f4114c37714cddd84d5b78f151b62bb101128dd51399bf" @@ -314,6 +316,14 @@ revision = "5f041e8faa004a95c88a202771f4cc3e991971e6" version = "v2.0.1" +[[projects]] + digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" + name = "github.com/pmezard/go-difflib" + packages = ["difflib"] + pruneopts = "NT" + revision = "792786c7400a136282c1664665ae0a8db921c6c2" + version = "v1.0.0" + [[projects]] digest = "1:9d8420bbf131d1618bde6530af37c3799340d3762cc47210c1d9532a4c3a2779" name = "github.com/spf13/pflag" @@ -322,6 +332,14 @@ revision = "298182f68c66c05229eb03ac171abe6e309ee79a" version = "v1.0.3" +[[projects]] + digest = "1:8e8fc2cb42cfa0a18fda0c9c4034092faa7aac773da5efdde8828eb4b96c001d" + name = "github.com/stretchr/testify" + packages = ["assert"] + pruneopts = "NT" + revision = "ffdc059bfe9ce6a4e144ba849dbedead332c6053" + version = "v1.3.0" + [[projects]] digest = "1:22f696cee54865fb8e9ff91df7b633f6b8f22037a8015253c6b6a71ca82219c7" name = "go.uber.org/atomic" @@ -585,6 +603,7 @@ name = "k8s.io/client-go" packages = [ "discovery", + "discovery/fake", "dynamic", "kubernetes", "kubernetes/scheme", @@ -626,6 +645,7 @@ "rest", "rest/watch", "restmapper", + "testing", "third_party/forked/golang/template", "tools/auth", "tools/cache", @@ -768,14 +788,20 @@ analyzer-version = 1 input-imports = [ "github.com/blang/semver", + "github.com/go-openapi/spec", "github.com/golang/glog", "github.com/openshift/api/config/v1", "github.com/openshift/client-go/config/clientset/versioned", + "github.com/openshift/client-go/config/clientset/versioned/fake", "github.com/openshift/cluster-version-operator/lib/resourcemerge", + "github.com/stretchr/testify/assert", "k8s.io/api/apps/v1", + "k8s.io/api/batch/v1", "k8s.io/api/core/v1", "k8s.io/apimachinery/pkg/api/equality", "k8s.io/apimachinery/pkg/api/errors", + "k8s.io/apimachinery/pkg/api/meta", + "k8s.io/apimachinery/pkg/api/resource", "k8s.io/apimachinery/pkg/apis/meta/v1", "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", "k8s.io/apimachinery/pkg/runtime", @@ -793,6 +819,7 @@ "k8s.io/code-generator/cmd/lister-gen", "k8s.io/code-generator/cmd/openapi-gen", "k8s.io/gengo/args", + "k8s.io/kube-openapi/pkg/common", "sigs.k8s.io/controller-runtime/pkg/client", "sigs.k8s.io/controller-runtime/pkg/client/config", "sigs.k8s.io/controller-runtime/pkg/controller", diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/Gopkg.toml b/vendor/github.com/openshift/cluster-autoscaler-operator/Gopkg.toml index 25263f84e5..08622f51ef 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/Gopkg.toml +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/Gopkg.toml @@ -39,6 +39,18 @@ required = [ name = "sigs.k8s.io/controller-runtime" version = "v0.1.4" +[[override]] + name = "github.com/openshift/api" + branch = "master" + +[[override]] + name = "github.com/openshift/client-go" + branch = "master" + +[[override]] + name = "github.com/openshift/cluster-version-operator" + branch = "master" + [prune] go-tests = true non-go = true diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/Makefile b/vendor/github.com/openshift/cluster-autoscaler-operator/Makefile index 7c2638fb9a..3dac927549 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/Makefile +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/Makefile @@ -33,10 +33,26 @@ depend: depend-update: dep ensure -update +# This is a hack. The operator-sdk doesn't currently let you configure +# output paths for the generated CRDs. It also requires that they +# already exist in order to regenerate the OpenAPI bits, so we do some +# copying around here. .PHONY: generate -generate: - $(DOCKER_CMD) ./vendor/k8s.io/code-generator/generate-groups.sh deepcopy \ - "$(REPO_PATH)/pkg/apis" "$(REPO_PATH)/pkg/apis" "autoscaling:v1alpha1" +generate: ## Code generation (requires operator-sdk >= v0.5.0) + mkdir -p deploy/crds + + cp install/0000_50_cluster-autoscaler-operator_01_clusterautoscaler.crd.yaml \ + deploy/crds/autoscaling_v1alpha1_clusterautoscaler_crd.yaml + cp install/0000_50_cluster-autoscaler-operator_02_machineautoscaler.crd.yaml \ + deploy/crds/autoscaling_v1alpha1_machineautoscaler_crd.yaml + + operator-sdk generate k8s + operator-sdk generate openapi + + cp deploy/crds/autoscaling_v1alpha1_clusterautoscaler_crd.yaml \ + install/0000_50_cluster-autoscaler-operator_01_clusterautoscaler.crd.yaml + cp deploy/crds/autoscaling_v1alpha1_machineautoscaler_crd.yaml \ + install/0000_50_cluster-autoscaler-operator_02_machineautoscaler.crd.yaml .PHONY: build build: ## build binaries @@ -60,7 +76,7 @@ test: ## Run unit tests .PHONY: test-e2e test-e2e: ## Run e2e tests - go run ./test/e2e/*.go -alsologtostderr + go run ./test/e2e/*.go -alsologtostderr $${NAMESPACE:+--namespace=$${NAMESPACE}} $${FOCUS:+--focus=$${FOCUS}} .PHONY: lint lint: ## Go lint your code diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/cluster-autoscaler-operator-patch.yaml b/vendor/github.com/openshift/cluster-autoscaler-operator/cluster-autoscaler-operator-patch.yaml new file mode 100644 index 0000000000..8fefa853a9 --- /dev/null +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/cluster-autoscaler-operator-patch.yaml @@ -0,0 +1,22 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: cluster-autoscaler-operator + namespace: openshift-cluster-api +spec: + template: + spec: + containers: + - name: cluster-autoscaler-operator + image: quay.io/openshift/origin-cluster-autoscaler-operator:v4.0 + env: + - name: WATCH_NAMESPACE + value: kube-system + valueFrom: + - name: CLUSTER_AUTOSCALER_NAMESPACE + value: kube-system + valueFrom: + - name: LEADER_ELECTION_NAMESPACE + value: kube-system + valueFrom: diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/examples/machineautoscaler.yaml b/vendor/github.com/openshift/cluster-autoscaler-operator/examples/machineautoscaler.yaml index 9991189c66..941ac6b3b5 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/examples/machineautoscaler.yaml +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/examples/machineautoscaler.yaml @@ -8,6 +8,6 @@ spec: minReplicas: 1 maxReplicas: 12 scaleTargetRef: - apiVersion: cluster.k8s.io/v1alpha1 + apiVersion: machine.openshift.io/v1beta1 kind: MachineSet - name: worker + name: worker-us-east-1a diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_01_clusterautoscaler.crd.yaml b/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_01_clusterautoscaler.crd.yaml index bb501c3d7c..c82adcc18b 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_01_clusterautoscaler.crd.yaml +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_01_clusterautoscaler.crd.yaml @@ -1,8 +1,7 @@ -# TODO(bison): Add schema. ---- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: + creationTimestamp: null name: clusterautoscalers.autoscaling.openshift.io spec: group: autoscaling.openshift.io @@ -12,4 +11,92 @@ spec: plural: clusterautoscalers singular: clusterautoscaler scope: Cluster + subresources: + status: {} + validation: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + metadata: + type: object + spec: + properties: + maxPodGracePeriod: + format: int32 + type: integer + podPriorityThreshold: + format: int32 + type: integer + resourceLimits: + properties: + cores: + properties: + max: + format: int32 + type: integer + min: + format: int32 + minimum: 0 + type: integer + required: + - min + - max + type: object + gpus: + items: + properties: + type: + minLength: 1 + type: string + required: + - type + type: object + type: array + maxNodesTotal: + format: int32 + minimum: 0 + type: integer + memory: + properties: + max: + format: int32 + type: integer + min: + format: int32 + minimum: 0 + type: integer + required: + - min + - max + type: object + type: object + scaleDown: + properties: + delayAfterAdd: + pattern: ([0-9]*(\.[0-9]*)?[a-z]+)+ + type: string + delayAfterDelete: + pattern: ([0-9]*(\.[0-9]*)?[a-z]+)+ + type: string + delayAfterFailure: + pattern: ([0-9]*(\.[0-9]*)?[a-z]+)+ + type: string + enabled: + type: boolean + unneededTime: + pattern: ([0-9]*(\.[0-9]*)?[a-z]+)+ + type: string + required: + - enabled + type: object + type: object + status: + type: object version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_02_machineautoscaler.crd.yaml b/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_02_machineautoscaler.crd.yaml index 292517f66f..129f90bcb4 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_02_machineautoscaler.crd.yaml +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_02_machineautoscaler.crd.yaml @@ -1,37 +1,95 @@ -# TODO(bison): Add schema. ---- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: + creationTimestamp: null name: machineautoscalers.autoscaling.openshift.io spec: - group: autoscaling.openshift.io - names: - kind: MachineAutoscaler - listKind: MachineAutoscalerList - plural: machineautoscalers - singular: machineautoscaler - scope: Namespaced - version: v1alpha1 - subresources: - status: {} additionalPrinterColumns: - JSONPath: .spec.scaleTargetRef.kind - name: Ref Kind description: Kind of object scaled + name: Ref Kind type: string - JSONPath: .spec.scaleTargetRef.name - name: Ref Name description: Name of object scaled + name: Ref Name type: string - JSONPath: .spec.minReplicas - name: Min description: Min number of replicas + name: Min type: integer - JSONPath: .spec.maxReplicas - name: Max description: Max number of replicas + name: Max type: integer - - JSONPath: .metadata.creationTimestamp + - JSONPath: .metadata.creationTimestamp name: Age - type: date + type: date + group: autoscaling.openshift.io + names: + kind: MachineAutoscaler + listKind: MachineAutoscalerList + plural: machineautoscalers + singular: machineautoscaler + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + metadata: + type: object + spec: + properties: + maxReplicas: + format: int32 + minimum: 1 + type: integer + minReplicas: + format: int32 + minimum: 0 + type: integer + scaleTargetRef: + properties: + apiVersion: + type: string + kind: + minLength: 1 + type: string + name: + minLength: 1 + type: string + required: + - kind + - name + type: object + required: + - minReplicas + - maxReplicas + - scaleTargetRef + type: object + status: + properties: + lastTargetRef: + properties: + apiVersion: + type: string + kind: + minLength: 1 + type: string + name: + minLength: 1 + type: string + required: + - kind + - name + type: object + type: object + version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_03_rbac.yaml b/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_03_rbac.yaml index ed41ec75d1..78d65b2bbd 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_03_rbac.yaml +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_03_rbac.yaml @@ -10,6 +10,15 @@ rules: - "*" verbs: - "*" +- apiGroups: + - config.openshift.io + resources: + - clusteroperators + - clusteroperators/status + verbs: + - create + - get + - update --- kind: Role diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_04_deployment.yaml b/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_04_deployment.yaml index 7c6cd1310a..cd6001ea57 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_04_deployment.yaml +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_04_deployment.yaml @@ -16,6 +16,7 @@ spec: labels: k8s-app: cluster-autoscaler-operator spec: + priorityClassName: system-node-critical serviceAccountName: cluster-autoscaler-operator containers: - name: cluster-autoscaler-operator @@ -40,9 +41,6 @@ spec: - name: CLUSTER_AUTOSCALER_IMAGE value: docker.io/openshift/origin-cluster-autoscaler:v4.0 resources: - limits: - cpu: 20m - memory: 50Mi requests: cpu: 20m memory: 50Mi diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_05_clusteroperator.yaml b/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_05_clusteroperator.yaml new file mode 100644 index 0000000000..fa2ba78eaf --- /dev/null +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/install/0000_50_cluster-autoscaler-operator_05_clusteroperator.yaml @@ -0,0 +1,5 @@ +apiVersion: config.openshift.io/v1 +kind: ClusterOperator +metadata: + name: cluster-autoscaler +spec: {} \ No newline at end of file diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/kustomization.yaml b/vendor/github.com/openshift/cluster-autoscaler-operator/kustomization.yaml index e83e47f88b..67a473ff64 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/kustomization.yaml +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/kustomization.yaml @@ -11,3 +11,6 @@ resources: - install/0000_50_cluster-autoscaler-operator_02_machineautoscaler.crd.yaml - install/0000_50_cluster-autoscaler-operator_03_rbac.yaml - install/0000_50_cluster-autoscaler-operator_04_deployment.yaml + +patches: +- cluster-autoscaler-operator-patch.yaml diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/clusterautoscaler_types.go b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/clusterautoscaler_types.go index 633859e5df..947fabbf47 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/clusterautoscaler_types.go +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/clusterautoscaler_types.go @@ -25,6 +25,7 @@ type ClusterAutoscalerStatus struct { // ClusterAutoscaler is the Schema for the clusterautoscalers API // +k8s:openapi-gen=true +// +kubebuilder:subresource:status type ClusterAutoscaler struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` @@ -43,6 +44,7 @@ type ClusterAutoscalerList struct { } type ResourceLimits struct { + // +kubebuilder:validation:Minimum=0 MaxNodesTotal *int32 `json:"maxNodesTotal,omitempty"` Cores *ResourceRange `json:"cores,omitempty"` Memory *ResourceRange `json:"memory,omitempty"` @@ -50,19 +52,26 @@ type ResourceLimits struct { } type GPULimit struct { + // TODO: Should this match on known GPU types? + // +kubebuilder:validation:MinLength=1 Type string `json:"type"` ResourceRange } type ResourceRange struct { + // +kubebuilder:validation:Minimum=0 Min int32 `json:"min"` Max int32 `json:"max"` } type ScaleDownConfig struct { - Enabled bool `json:"enabled"` - DelayAfterAdd string `json:"delayAfterAdd"` - DelayAfterDelete string `json:"delayAfterDelete"` - DelayAfterFailure string `json:"delayAfterFailure"` - UnneededTime string `json:"unneededTime,omitempty"` + Enabled bool `json:"enabled"` + // +kubebuilder:validation:Pattern=([0-9]*(\.[0-9]*)?[a-z]+)+ + DelayAfterAdd *string `json:"delayAfterAdd,omitempty"` + // +kubebuilder:validation:Pattern=([0-9]*(\.[0-9]*)?[a-z]+)+ + DelayAfterDelete *string `json:"delayAfterDelete,omitempty"` + // +kubebuilder:validation:Pattern=([0-9]*(\.[0-9]*)?[a-z]+)+ + DelayAfterFailure *string `json:"delayAfterFailure,omitempty"` + // +kubebuilder:validation:Pattern=([0-9]*(\.[0-9]*)?[a-z]+)+ + UnneededTime *string `json:"unneededTime,omitempty"` } diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/machineautoscaler_types.go b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/machineautoscaler_types.go index 1fe7bbc1d3..eddf780ff0 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/machineautoscaler_types.go +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/machineautoscaler_types.go @@ -10,7 +10,9 @@ func init() { // MachineAutoscalerSpec defines the desired state of MachineAutoscaler type MachineAutoscalerSpec struct { - MinReplicas int32 `json:"minReplicas"` + // +kubebuilder:validation:Minimum=0 + MinReplicas int32 `json:"minReplicas"` + // +kubebuilder:validation:Minimum=1 MaxReplicas int32 `json:"maxReplicas"` ScaleTargetRef CrossVersionObjectReference `json:"scaleTargetRef"` } @@ -24,6 +26,7 @@ type MachineAutoscalerStatus struct { // MachineAutoscaler is the Schema for the machineautoscalers API // +k8s:openapi-gen=true +// +kubebuilder:subresource:status type MachineAutoscaler struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` @@ -44,7 +47,9 @@ type MachineAutoscalerList struct { // CrossVersionObjectReference identifies another object by name, API version, // and kind. type CrossVersionObjectReference struct { - Kind string `json:"kind"` - Name string `json:"name"` APIVersion string `json:"apiVersion,omitempty"` + // +kubebuilder:validation:MinLength=1 + Kind string `json:"kind"` + // +kubebuilder:validation:MinLength=1 + Name string `json:"name"` } diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/zz_generated.deepcopy.go index 4ee19fff1d..7248ad623d 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/zz_generated.deepcopy.go @@ -96,7 +96,7 @@ func (in *ClusterAutoscalerSpec) DeepCopyInto(out *ClusterAutoscalerSpec) { if in.ScaleDown != nil { in, out := &in.ScaleDown, &out.ScaleDown *out = new(ScaleDownConfig) - **out = **in + (*in).DeepCopyInto(*out) } if in.MaxPodGracePeriod != nil { in, out := &in.MaxPodGracePeriod, &out.MaxPodGracePeriod @@ -324,6 +324,26 @@ func (in *ResourceRange) DeepCopy() *ResourceRange { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ScaleDownConfig) DeepCopyInto(out *ScaleDownConfig) { *out = *in + if in.DelayAfterAdd != nil { + in, out := &in.DelayAfterAdd, &out.DelayAfterAdd + *out = new(string) + **out = **in + } + if in.DelayAfterDelete != nil { + in, out := &in.DelayAfterDelete, &out.DelayAfterDelete + *out = new(string) + **out = **in + } + if in.DelayAfterFailure != nil { + in, out := &in.DelayAfterFailure, &out.DelayAfterFailure + *out = new(string) + **out = **in + } + if in.UnneededTime != nil { + in, out := &in.UnneededTime, &out.UnneededTime + *out = new(string) + **out = **in + } return } diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/zz_generated.defaults.go b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/zz_generated.defaults.go new file mode 100644 index 0000000000..dd621a3acd --- /dev/null +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/zz_generated.defaults.go @@ -0,0 +1,32 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by defaulter-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// RegisterDefaults adds defaulters functions to the given scheme. +// Public to allow building arbitrary schemes. +// All generated defaulters are covering - they call all nested defaulters. +func RegisterDefaults(scheme *runtime.Scheme) error { + return nil +} diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/zz_generated.openapi.go b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/zz_generated.openapi.go new file mode 100644 index 0000000000..7c8df1ab5a --- /dev/null +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1/zz_generated.openapi.go @@ -0,0 +1,105 @@ +// +build !ignore_autogenerated + +// Code generated by openapi-gen. DO NOT EDIT. + +// This file was autogenerated by openapi-gen. Do not edit it manually! + +package v1alpha1 + +import ( + spec "github.com/go-openapi/spec" + common "k8s.io/kube-openapi/pkg/common" +) + +func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { + return map[string]common.OpenAPIDefinition{ + "github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1.ClusterAutoscaler": schema_pkg_apis_autoscaling_v1alpha1_ClusterAutoscaler(ref), + "github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1.MachineAutoscaler": schema_pkg_apis_autoscaling_v1alpha1_MachineAutoscaler(ref), + } +} + +func schema_pkg_apis_autoscaling_v1alpha1_ClusterAutoscaler(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "ClusterAutoscaler is the Schema for the clusterautoscalers API", + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1.ClusterAutoscalerSpec"), + }, + }, + "status": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1.ClusterAutoscalerStatus"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1.ClusterAutoscalerSpec", "github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1.ClusterAutoscalerStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + } +} + +func schema_pkg_apis_autoscaling_v1alpha1_MachineAutoscaler(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "MachineAutoscaler is the Schema for the machineautoscalers API", + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1.MachineAutoscalerSpec"), + }, + }, + "status": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1.MachineAutoscalerStatus"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1.MachineAutoscalerSpec", "github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1.MachineAutoscalerStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + } +} diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/controller/clusterautoscaler/clusterautoscaler.go b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/controller/clusterautoscaler/clusterautoscaler.go index 7093305077..25d8252808 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/controller/clusterautoscaler/clusterautoscaler.go +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/controller/clusterautoscaler/clusterautoscaler.go @@ -47,6 +47,7 @@ const ( CoresTotalArg AutoscalerArg = "--cores-total" MemoryTotalArg AutoscalerArg = "--memory-total" GPUTotalArg AutoscalerArg = "--gpu-total" + VerbosityArg AutoscalerArg = "--v" ) // AutoscalerArgs returns a slice of strings representing command line arguments @@ -57,6 +58,7 @@ func AutoscalerArgs(ca *v1alpha1.ClusterAutoscaler, cfg *Config) []string { args := []string{ LogToStderrArg.String(), + VerbosityArg.Value(cfg.Verbosity), CloudProviderArg.Value(cfg.CloudProvider), NamespaceArg.Value(cfg.Namespace), } @@ -87,18 +89,27 @@ func AutoscalerArgs(ca *v1alpha1.ClusterAutoscaler, cfg *Config) []string { // ScaleDownConfig object. func ScaleDownArgs(sd *v1alpha1.ScaleDownConfig) []string { if !sd.Enabled { - return []string{ScaleDownEnabledArg.Value("false")} + return []string{ScaleDownEnabledArg.Value(false)} } args := []string{ - ScaleDownEnabledArg.Value("true"), - ScaleDownDelayAfterAddArg.Value(sd.DelayAfterAdd), - ScaleDownDelayAfterDeleteArg.Value(sd.DelayAfterDelete), - ScaleDownDelayAfterFailureArg.Value(sd.DelayAfterFailure), + ScaleDownEnabledArg.Value(true), } - if sd.UnneededTime != "" { - args = append(args, ScaleDownUnneededTimeArg.Value(sd.UnneededTime)) + if sd.DelayAfterAdd != nil { + args = append(args, ScaleDownDelayAfterAddArg.Value(*sd.DelayAfterAdd)) + } + + if sd.DelayAfterDelete != nil { + args = append(args, ScaleDownDelayAfterDeleteArg.Value(*sd.DelayAfterDelete)) + } + + if sd.DelayAfterFailure != nil { + args = append(args, ScaleDownDelayAfterFailureArg.Value(*sd.DelayAfterFailure)) + } + + if sd.UnneededTime != nil { + args = append(args, ScaleDownUnneededTimeArg.Value(*sd.UnneededTime)) } return args diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/controller/clusterautoscaler/clusterautoscaler_controller.go b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/controller/clusterautoscaler/clusterautoscaler_controller.go index 80d27bbb6a..4f3e8a9df1 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/controller/clusterautoscaler/clusterautoscaler_controller.go +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/controller/clusterautoscaler/clusterautoscaler_controller.go @@ -51,6 +51,8 @@ type Config struct { Replicas int32 // The name of the CloudProvider. CloudProvider string + // The log verbosity level for the cluster-autoscaler. + Verbosity int } var _ reconcile.Reconciler = &Reconciler{} diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/operator/config.go b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/operator/config.go index b903c5443a..ec4795e126 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/operator/config.go +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/operator/config.go @@ -43,6 +43,10 @@ const ( // DefaultClusterAutoscalerCloudProvider is the default name for // the CloudProvider beeing used. DefaultClusterAutoscalerCloudProvider = "openshift-machine-api" + + // DefaultClusterAutoscalerVerbosity is the default logging + // verbosity level for ClusterAutoscaler deployments. + DefaultClusterAutoscalerVerbosity = 1 ) // Config represents the runtime configuration for the operator. @@ -80,6 +84,10 @@ type Config struct { // ClusterAutoscalerCloudProvider is the name for the // CloudProvider beeing used. ClusterAutoscalerCloudProvider string + + // ClusterAutoscalerVerbosity is the logging verbosity level for + // ClusterAutoscaler deployments. + ClusterAutoscalerVerbosity int } // NewConfig returns a new Config object with defaults set. @@ -94,6 +102,7 @@ func NewConfig() *Config { ClusterAutoscalerImage: DefaultClusterAutoscalerImage, ClusterAutoscalerReplicas: DefaultClusterAutoscalerReplicas, ClusterAutoscalerCloudProvider: DefaultClusterAutoscalerCloudProvider, + ClusterAutoscalerVerbosity: DefaultClusterAutoscalerVerbosity, } } @@ -140,5 +149,15 @@ func ConfigFromEnvironment() *Config { config.ClusterAutoscalerNamespace = caNamespace } + if caVerbosity, ok := os.LookupEnv("CLUSTER_AUTOSCALER_VERBOSITY"); ok { + v, err := strconv.Atoi(caVerbosity) + if err != nil { + v = DefaultClusterAutoscalerVerbosity + glog.Errorf("Error parsing CLUSTER_AUTOSCALER_VERBOSITY environment variable: %v", err) + } + + config.ClusterAutoscalerVerbosity = v + } + return config } diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/operator/operator.go b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/operator/operator.go index 2f9ca9f340..a6b49168e2 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/operator/operator.go +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/operator/operator.go @@ -1,6 +1,7 @@ package operator import ( + configv1 "github.com/openshift/api/config/v1" "github.com/openshift/cluster-autoscaler-operator/pkg/apis" "github.com/openshift/cluster-autoscaler-operator/pkg/controller/clusterautoscaler" "github.com/openshift/cluster-autoscaler-operator/pkg/controller/machineautoscaler" @@ -10,7 +11,7 @@ import ( ) // OperatorName is the name of this operator. -const OperatorName = "cluster-autoscaler-operator" +const OperatorName = "cluster-autoscaler" // Operator represents an instance of the cluster-autoscaler-operator. type Operator struct { @@ -30,7 +31,19 @@ func New(cfg *Config) (*Operator, error) { return nil, err } - operator.status, err = NewStatusReporter(clientConfig) + // track set of related namespaces for openshift-must-gather diagnostics + relatedNamespaces := map[string]string{} + relatedNamespaces[cfg.WatchNamespace] = "" + relatedNamespaces[cfg.LeaderElectionNamespace] = "" + relatedNamespaces[cfg.ClusterAutoscalerNamespace] = "" + relatedObjects := []configv1.ObjectReference{} + for k := range relatedNamespaces { + relatedObjects = append(relatedObjects, configv1.ObjectReference{ + Resource: "namespaces", + Name: k, + }) + } + operator.status, err = NewStatusReporter(clientConfig, relatedObjects) if err != nil { return nil, err } @@ -70,6 +83,7 @@ func (o *Operator) AddControllers() error { Replicas: o.config.ClusterAutoscalerReplicas, Namespace: o.config.ClusterAutoscalerNamespace, CloudProvider: o.config.ClusterAutoscalerCloudProvider, + Verbosity: o.config.ClusterAutoscalerVerbosity, }) if err := ca.AddToManager(o.manager); err != nil { diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/operator/status.go b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/operator/status.go index f569a68577..f679ea506b 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/operator/status.go +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/pkg/operator/status.go @@ -1,8 +1,10 @@ package operator import ( + "fmt" "time" + "github.com/golang/glog" configv1 "github.com/openshift/api/config/v1" osconfig "github.com/openshift/client-go/config/clientset/versioned" "github.com/openshift/cluster-autoscaler-operator/pkg/version" @@ -23,13 +25,16 @@ const ( // StatusReporter reports the status of the operator to the OpenShift // cluster-version-operator via ClusterOperator resource status. type StatusReporter struct { - client *osconfig.Clientset + client osconfig.Interface + relatedObjects []configv1.ObjectReference } // NewStatusReporter returns a new StatusReporter instance. -func NewStatusReporter(cfg *rest.Config) (*StatusReporter, error) { +func NewStatusReporter(cfg *rest.Config, relatedObjects []configv1.ObjectReference) (*StatusReporter, error) { var err error - reporter := &StatusReporter{} + reporter := &StatusReporter{ + relatedObjects: relatedObjects, + } // Create a client for OpenShift config objects. reporter.client, err = osconfig.NewForConfig(cfg) @@ -63,7 +68,13 @@ func (r *StatusReporter) GetOrCreateClusterOperator() (*configv1.ClusterOperator // resource's status. func (r *StatusReporter) ApplyConditions(conds []configv1.ClusterOperatorStatusCondition) error { status := configv1.ClusterOperatorStatus{ - Version: version.Raw, + Versions: []configv1.OperandVersion{ + { + Name: "cluster-autoscaler", + Version: version.Raw, + }, + }, + RelatedObjects: r.relatedObjects, } for _, c := range conds { @@ -142,7 +153,7 @@ func (r *StatusReporter) Report(stopCh <-chan struct{}) error { pollFunc := func() (bool, error) { ok, err := r.CheckMachineAPI() if err != nil { - r.Fail(ReasonMissingDependency, "error checking machine-api-operator status") + r.Fail(ReasonMissingDependency, fmt.Sprintf("error checking machine-api operator status %v", err)) return false, nil } @@ -151,7 +162,7 @@ func (r *StatusReporter) Report(stopCh <-chan struct{}) error { return true, nil } - r.Fail(ReasonMissingDependency, "machine-api-operator not ready") + r.Fail(ReasonMissingDependency, "machine-api operator not ready") return false, nil } @@ -163,9 +174,10 @@ func (r *StatusReporter) Report(stopCh <-chan struct{}) error { // and not failing. func (r *StatusReporter) CheckMachineAPI() (bool, error) { mao, err := r.client.ConfigV1().ClusterOperators(). - Get("machine-api-operator", metav1.GetOptions{}) + Get("machine-api", metav1.GetOptions{}) if err != nil { + glog.Errorf("failed to get dependency machine-api status: %v", err) return false, err } @@ -176,5 +188,6 @@ func (r *StatusReporter) CheckMachineAPI() (bool, error) { return true, nil } + glog.Infof("machine-api-operator not ready yet") return false, nil } diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/test/e2e/main.go b/vendor/github.com/openshift/cluster-autoscaler-operator/test/e2e/main.go index 2572b73279..bbf1179e8e 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/test/e2e/main.go +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/test/e2e/main.go @@ -2,8 +2,10 @@ package main import ( "flag" + "strings" "github.com/golang/glog" + osconfigv1 "github.com/openshift/api/config/v1" "github.com/openshift/cluster-autoscaler-operator/pkg/apis" "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client" @@ -11,10 +13,17 @@ import ( ) const ( - namespace = "openshift-machine-api" - caName = "default" + caName = "default" ) +var focus string +var namespace string + +func init() { + flag.StringVar(&focus, "focus", "[openshift]", "If set, run only tests containing focus string. E.g. [k8s]") + flag.StringVar(&namespace, "namespace", "openshift-machine-api", "cluster-autoscaler-operator namespace") +} + var F *Framework type Framework struct { @@ -45,6 +54,10 @@ func main() { glog.Fatal(err) } + if err := osconfigv1.AddToScheme(scheme.Scheme); err != nil { + glog.Fatal(err) + } + if err := newClient(); err != nil { glog.Fatal(err) } @@ -55,23 +68,44 @@ func main() { } func runSuite() error { - if err := ExpectOperatorAvailable(); err != nil { - glog.Errorf("FAIL: ExpectOperatorAvailable: %v", err) - return err - } - glog.Info("PASS: ExpectOperatorAvailable") - if err := CreateClusterAutoscaler(); err != nil { - glog.Errorf("FAIL: CreateClusterAutoscaler: %v", err) - return err + expectations := []struct { + expect func() error + name string + }{ + { + expect: ExpectOperatorAvailable, + name: "[k8s][openshift] Expect operator to be available", + }, + { + expect: ExpectClusterOperatorStatusAvailable, + name: "[openshift] Expect Cluster Operator status to be available", + }, + { + expect: CreateClusterAutoscaler, + name: "[openshift] Create Cluster Autoscaler resource", + }, + { + expect: ExpectClusterAutoscalerAvailable, + name: "[openshift] Expect Cluster Autoscaler available", + }, + { + expect: ExpectToScaleUpAndDown, + name: "[k8s] Expect to scale up and down", + }, } - glog.Info("PASS: CreateClusterAutoscaler") - if err := ExpectClusterAutoscalerAvailable(); err != nil { - glog.Errorf("FAIL: ExpectClusterAutoscalerAvailable: %v", err) - return err + for _, tc := range expectations { + if strings.HasPrefix(tc.name, focus) { + if err := tc.expect(); err != nil { + glog.Errorf("FAIL: %v: %v", tc.name, err) + return err + } + glog.Infof("PASS: %v", tc.name) + } else { + glog.Infof("SKIPPING: %v", tc.name) + } } - glog.Info("PASS: ExpectClusterAutoscalerAvailable") return nil } diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/test/e2e/operator_expectations.go b/vendor/github.com/openshift/cluster-autoscaler-operator/test/e2e/operator_expectations.go index 30d41da063..c595e8140a 100644 --- a/vendor/github.com/openshift/cluster-autoscaler-operator/test/e2e/operator_expectations.go +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/test/e2e/operator_expectations.go @@ -2,32 +2,39 @@ package main import ( "fmt" + "github.com/openshift/cluster-autoscaler-operator/pkg/operator" "time" "context" "github.com/golang/glog" + osconfigv1 "github.com/openshift/api/config/v1" autoscalingv1alpha1 "github.com/openshift/cluster-autoscaler-operator/pkg/apis/autoscaling/v1alpha1" + cvorm "github.com/openshift/cluster-version-operator/lib/resourcemerge" kappsapi "k8s.io/api/apps/v1" + batchv1 "k8s.io/api/batch/v1" + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/wait" + "sigs.k8s.io/controller-runtime/pkg/client" ) -var ( - PodPriorityThreshold int32 = -10 - MaxPodGracePeriod int32 = 60 - MaxNodesTotal int32 = 100 - CoresMin int32 = 16 - CoresMax int32 = 32 - MemoryMin int32 = 32 - MemoryMax int32 = 64 - NvidiaGPUMin int32 = 4 - NvidiaGPUMax int32 = 8 -) +const nodeGroupSize = 6 -func CreateClusterAutoscaler() error { - ca := &autoscalingv1alpha1.ClusterAutoscaler{ +func clusterAutoscalerResource() *autoscalingv1alpha1.ClusterAutoscaler { + var ( + PodPriorityThreshold int32 = -10 + MaxPodGracePeriod int32 = 60 + MaxNodesTotal int32 = 100 + CoresMin int32 = 16 + CoresMax int32 = 32 + MemoryMin int32 = 32 + MemoryMax int32 = 64 + ) + + return &autoscalingv1alpha1.ClusterAutoscaler{ TypeMeta: metav1.TypeMeta{ Kind: "ClusterAutoscaler", APIVersion: "autoscaling.openshift.io/v1alpha1", @@ -52,11 +59,78 @@ func CreateClusterAutoscaler() error { }, }, } +} - return F.Client.Create(context.TODO(), ca) +func machineAutoscalerResource() *autoscalingv1alpha1.MachineAutoscaler { + return &autoscalingv1alpha1.MachineAutoscaler{ + TypeMeta: metav1.TypeMeta{ + Kind: "MachineAutoscaler", + APIVersion: "autoscaling.openshift.io/v1alpha1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "compute-pool", + Namespace: namespace, + }, + Spec: autoscalingv1alpha1.MachineAutoscalerSpec{ + MinReplicas: 1, + MaxReplicas: nodeGroupSize, + ScaleTargetRef: autoscalingv1alpha1.CrossVersionObjectReference{ + Kind: "MachineSet", + APIVersion: "machine.openshift.io/v1beta1", + Name: "kubemark-machine-pool", + }, + }, + } } -func ExpectOperatorAvailable() error { +func workloadResource() *batchv1.Job { + var backoffLimit int32 = 4 + var completions int32 = 40 + var parallelism int32 = 40 + return &batchv1.Job{ + ObjectMeta: metav1.ObjectMeta{ + Name: "workload", + Namespace: "default", + }, + Spec: batchv1.JobSpec{ + Template: v1.PodTemplateSpec{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "work", + Image: "busybox", + Command: []string{ + "sleep", + "120", + }, + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + "cpu": resource.MustParse("500m"), + "memory": resource.MustParse("500Mi"), + }, + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + NodeSelector: map[string]string{ + "node-role.kubernetes.io/compute": "", + }, + Tolerations: []v1.Toleration{ + { + Key: "kubemark", + Operator: v1.TolerationOpExists, + }, + }, + }, + }, + BackoffLimit: &backoffLimit, + Completions: &completions, + Parallelism: ¶llelism, + }, + } +} + +func verifyClusterAutoscalerOperatorIsReady() error { name := "cluster-autoscaler-operator" key := types.NamespacedName{ Namespace: namespace, @@ -77,7 +151,7 @@ func ExpectOperatorAvailable() error { return err } -func ExpectClusterAutoscalerAvailable() error { +func verifyClusterAutoscalerIsReady() error { name := fmt.Sprintf("cluster-autoscaler-%s", caName) key := types.NamespacedName{ Namespace: namespace, @@ -97,3 +171,155 @@ func ExpectClusterAutoscalerAvailable() error { }) return err } + +func ExpectOperatorAvailable() error { + return verifyClusterAutoscalerOperatorIsReady() +} + +func ExpectClusterOperatorStatusAvailable() error { + name := operator.OperatorName + key := types.NamespacedName{ + Namespace: namespace, + Name: name, + } + clusterOperator := &osconfigv1.ClusterOperator{} + + err := wait.PollImmediate(1*time.Second, 1*time.Minute, func() (bool, error) { + if err := F.Client.Get(context.TODO(), key, clusterOperator); err != nil { + glog.Errorf("error querying api for OperatorStatus object: %v, retrying...", err) + return false, nil + } + if cvorm.IsOperatorStatusConditionTrue(clusterOperator.Status.Conditions, osconfigv1.OperatorAvailable) { + return true, nil + } + return false, nil + }) + return err +} + +func CreateClusterAutoscaler() error { + ca := clusterAutoscalerResource() + return F.Client.Create(context.TODO(), ca) +} + +func ExpectClusterAutoscalerAvailable() error { + return verifyClusterAutoscalerIsReady() +} + +func isNodeReady(node *v1.Node) bool { + for _, c := range node.Status.Conditions { + if c.Type == v1.NodeReady { + return c.Status == v1.ConditionTrue + } + } + return false +} + +// ExpectToScaleUpAndDown assumes the cluster autoscaler is already deployed +func ExpectToScaleUpAndDown() error { + tenSeconds := "10s" + + ca := *clusterAutoscalerResource() + // change the min core and memory to 1 so the autoscaler scales down as much as it can + ca.Spec.ResourceLimits.Cores.Min = 1 + ca.Spec.ResourceLimits.Memory.Min = 1 + ca.Spec.ScaleDown = &autoscalingv1alpha1.ScaleDownConfig{ + Enabled: true, + DelayAfterAdd: &tenSeconds, + DelayAfterDelete: &tenSeconds, + DelayAfterFailure: &tenSeconds, + UnneededTime: &tenSeconds, + } + if err := F.Client.Create(context.TODO(), &ca); err != nil { + return fmt.Errorf("unable to deploy ClusterAutoscaler resource: %v", err) + } + + if err := verifyClusterAutoscalerIsReady(); err != nil { + return fmt.Errorf("cluster autoscaler not ready: %v", err) + } + + ma := machineAutoscalerResource() + if err := F.Client.Create(context.TODO(), ma); err != nil { + return fmt.Errorf("unable to deploy MachineAutoscaler resource: %v", err) + } + + workload := workloadResource() + if err := F.Client.Create(context.TODO(), workload); err != nil { + return fmt.Errorf("unable to deploy workload resource: %v", err) + } + + err := wait.PollImmediate(1*time.Second, 1*time.Minute, func() (bool, error) { + nodes := v1.NodeList{} + if err := F.Client.List(context.TODO(), &client.ListOptions{}, &nodes); err != nil { + glog.Errorf("error querying api for Node object: %v, retrying...", err) + return false, nil + } + // expecting nodeGroupSize nodes + nodeCounter := 0 + for _, node := range nodes.Items { + if _, exists := node.Labels["node-role.kubernetes.io/compute"]; !exists { + continue + } + + if !isNodeReady(&node) { + continue + } + + nodeCounter++ + } + + if nodeCounter < 6 { + glog.Errorf("Expecting %v nodes with 'node-role.kubernetes.io/compute' label in Ready state, got %v", nodeGroupSize, nodeCounter) + return false, nil + } + + glog.Infof("Expected number (%v) of nodes with 'node-role.kubernetes.io/compute' label in Ready state found", nodeGroupSize) + return true, nil + }) + + if err != nil { + return err + } + + glog.Infof("Succesfully scaled up") + + cascadeDelete := metav1.DeletePropagationForeground + if err := F.Client.Delete(context.TODO(), workload, func(opt *client.DeleteOptions) { opt.PropagationPolicy = &cascadeDelete }); err != nil { + return fmt.Errorf("unable to delete workload resource: %v", err) + } + + if err = wait.PollImmediate(1*time.Second, 10*time.Minute, func() (bool, error) { + nodes := v1.NodeList{} + if err := F.Client.List(context.TODO(), &client.ListOptions{}, &nodes); err != nil { + glog.Errorf("error querying api for Node object: %v, retrying...", err) + return false, nil + } + // expecting nodeGroupSize nodes + nodeCounter := 0 + for _, node := range nodes.Items { + if _, exists := node.Labels["node-role.kubernetes.io/compute"]; !exists { + continue + } + + if !isNodeReady(&node) { + continue + } + + nodeCounter++ + } + + if nodeCounter > 1 { + glog.Errorf("Expecting 1 node with 'node-role.kubernetes.io/compute' label in Ready state, got %v", nodeCounter) + return false, nil + } + + glog.Info("Expected number (1) of nodes with 'node-role.kubernetes.io/compute' label in Ready state found") + return true, nil + }); err != nil { + return err + } + + glog.Infof("Succesfully scaled down") + + return nil +} diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/test/resources/cluster.yaml b/vendor/github.com/openshift/cluster-autoscaler-operator/test/resources/cluster.yaml new file mode 100644 index 0000000000..e1e4f21f57 --- /dev/null +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/test/resources/cluster.yaml @@ -0,0 +1,15 @@ +--- +apiVersion: "cluster.k8s.io/v1alpha1" +kind: Cluster +metadata: + name: kubemark + namespace: kube-system +spec: + clusterNetwork: + services: + cidrBlocks: + - "10.0.0.1/24" + pods: + cidrBlocks: + - "10.0.0.2/24" + serviceDomain: example.com diff --git a/vendor/github.com/openshift/cluster-autoscaler-operator/test/resources/machine-set.yaml b/vendor/github.com/openshift/cluster-autoscaler-operator/test/resources/machine-set.yaml new file mode 100644 index 0000000000..ece739f160 --- /dev/null +++ b/vendor/github.com/openshift/cluster-autoscaler-operator/test/resources/machine-set.yaml @@ -0,0 +1,26 @@ +--- +apiVersion: machine.openshift.io/v1beta1 +kind: MachineSet +metadata: + name: kubemark-machine-pool + namespace: kube-system +spec: + replicas: 1 + selector: + matchLabels: + machine.openshift.io/cluster-api-machineset: kubemark-machine-pool + template: + metadata: + labels: + machine.openshift.io/cluster-api-machineset: kubemark-machine-pool + spec: + metadata: + labels: + node-role.kubernetes.io/compute: "" + providerSpec: + value: + apiVersion: kubemarkproviderconfig.k8s.io/v1alpha1 + kind: KubemarkMachineProviderConfig + versions: + kubelet: 1.10.1 + controlPlane: 1.10.1