diff --git a/.github/workflows/binaries-publish.yaml b/.github/workflows/binaries-publish.yaml index e435b491..550cd6fe 100644 --- a/.github/workflows/binaries-publish.yaml +++ b/.github/workflows/binaries-publish.yaml @@ -1,6 +1,7 @@ name: Publish Release Binaries on: + workflow_dispatch: push: tags: [ 'v*.*.*' ] @@ -8,6 +9,10 @@ jobs: goreleaser: name: goreleaser runs-on: ubuntu-latest + permissions: + contents: write + packages: write + id-token: write steps: - name: Checkout uses: actions/checkout@v4 @@ -37,6 +42,7 @@ jobs: go install github.com/sigstore/cosign/cmd/cosign@latest - name: Run GoReleaser + if: startsWith(github.ref, 'refs/tags/') uses: goreleaser/goreleaser-action@v5 with: workdir: "backend" @@ -45,3 +51,18 @@ jobs: args: release --clean env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + COSIGN_PWD: ${{ secrets.COSIGN_PWD }} + COSIGN_YES: "true" + + - name: Run GoReleaser No Release + if: ${{ !startsWith(github.ref, 'refs/tags/') }} + uses: goreleaser/goreleaser-action@v5 + with: + workdir: "backend" + distribution: goreleaser + version: "~> v2" + args: release --clean --snapshot --skip=publish + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + COSIGN_PWD: ${{ secrets.COSIGN_PWD }} + COSIGN_YES: "true" \ No newline at end of file diff --git a/.github/workflows/docker-publish-hardened.yaml b/.github/workflows/docker-publish-hardened.yaml new file mode 100644 index 00000000..6efe8579 --- /dev/null +++ b/.github/workflows/docker-publish-hardened.yaml @@ -0,0 +1,208 @@ +name: Docker publish hardened + +on: + schedule: + - cron: '00 0 * * *' + push: + branches: [ "main" ] + paths: + - 'backend/**' + - 'frontend/**' + - 'Dockerfile.hardened' + - '.dockerignore' + - '.github/workflows/docker-publish-hardened.yaml' + tags: [ 'v*.*.*' ] + pull_request: + branches: [ "main" ] + paths: + - 'backend/**' + - 'frontend/**' + - 'Dockerfile.hardened' + - '.dockerignore' + - '.github/workflows/docker-publish-hardened.yaml' + +permissions: + contents: read # Access to repository contents + packages: write # Write access for pushing to GHCR + id-token: write # Required for OIDC authentication (if used) + attestations: write # Required for signing and attestation (if needed) + +env: + DOCKERHUB_REPO: sysadminsmedia/homebox + GHCR_REPO: ghcr.io/${{ github.repository }} + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + id-token: write + attestations: write + + strategy: + fail-fast: false + matrix: + platform: + - linux/amd64 + - linux/arm64 + - linux/arm/v7 + + steps: + - name: Enable Debug Logs + run: echo "##[debug]Enabling debug logging" + env: + ACTIONS_RUNNER_DEBUG: true + ACTIONS_STEP_DEBUG: true + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Prepare + run: | + echo "BUILD_TIME=$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> $GITHUB_ENV + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + branch=${{ github.event.pull_request.number || github.ref_name }} + echo "BRANCH=${branch//\//-}" >> $GITHUB_ENV + echo "DOCKERNAMES=${{ env.DOCKERHUB_REPO }},${{ env.GHCR_REPO }}" >> $GITHUB_ENV + if [[ "${{ github.event_name }}" != "schedule" ]] || [[ "${{ github.ref }}" != refs/tags/* ]]; then + echo "DOCKERNAMES=${{ env.GHCR_REPO }}" >> $GITHUB_ENV + fi + + - name: Docker meta + id: meta + uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f + with: + images: | + name=${{ env.DOCKERHUB_REPO }},enable=${{ github.event_name == 'schedule' || startsWith(github.ref, 'refs/tags/') }} + name=${{ env.GHCR_REPO }} + + - name: Login to Docker Hub + uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 + if: (github.event_name == 'schedule' || startsWith(github.ref, 'refs/tags/')) + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Login to GHCR + uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 + with: + image: ghcr.io/amitie10g/binfmt:latest + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 + with: + driver-opts: | + image=ghcr.io/amitie10g/buildkit:master + + - name: Build and push by digest + id: build + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 + with: + context: . # Explicitly specify the build context + file: ./Dockerfile.hardened # Explicitly specify the Dockerfile + platforms: ${{ matrix.platform }} + labels: ${{ steps.meta.outputs.labels }} + outputs: type=image,"name=${{ env.DOCKERNAMES }}",push-by-digest=true,name-canonical=true,push=${{ github.event_name != 'pull_request' }} + cache-from: type=registry,ref=ghcr.io/sysadminsmedia/devcache:${{ env.PLATFORM_PAIR }}-${{ env.BRANCH }}-hardened + cache-to: type=registry,ref=ghcr.io/sysadminsmedia/devcache:${{ env.PLATFORM_PAIR }}-${{ env.BRANCH }}-hardened,mode=max,ignore-error=true + build-args: | + VERSION=${{ github.ref_name }} + COMMIT=${{ github.sha }} + BUILD_TIME=${{ env.BUILD_TIME }} + provenance: true + sbom: true + annotations: ${{ steps.meta.outputs.annotations }} + + - name: Export digest + run: | + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 + with: + name: digests-${{ env.PLATFORM_PAIR }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + if: github.event_name != 'pull_request' + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + id-token: write + attestations: write + needs: + - build + + steps: + - name: Download digests + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 + with: + path: /tmp/digests + pattern: digests-* + merge-multiple: true + + - name: Login to Docker Hub + uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 + if: (github.event_name == 'schedule' || startsWith(github.ref, 'refs/tags/')) + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Login to GHCR + uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 + with: + driver-opts: | + image=ghcr.io/amitie10g/buildkit:master + + - name: Docker meta + id: meta + uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f + with: + images: | + name=${{ env.DOCKERHUB_REPO }},enable=${{ github.event_name == 'schedule' || startsWith(github.ref, 'refs/tags/') }} + name=${{ env.GHCR_REPO }} + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + type=schedule,pattern=nightly + flavor: | + suffix=-hardened,onlatest=true + + - name: Create manifest list and push GHCR + id: push-ghcr + working-directory: /tmp/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.GHCR_REPO }}@sha256:%s ' *) + + - name: Create manifest list and push Dockerhub + id: push-dockerhub + working-directory: /tmp/digests + if: (github.event_name == 'schedule' || startsWith(github.ref, 'refs/tags/')) + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.DOCKERHUB_REPO }}@sha256:%s ' *) diff --git a/.github/workflows/docker-publish-rootless.yaml b/.github/workflows/docker-publish-rootless.yaml index 41073bb2..0a3d9188 100644 --- a/.github/workflows/docker-publish-rootless.yaml +++ b/.github/workflows/docker-publish-rootless.yaml @@ -8,7 +8,7 @@ on: paths: - 'backend/**' - 'frontend/**' - - 'Dockerfile' + - 'Dockerfile.rootless' - '.dockerignore' - '.github/workflows/docker-publish-rootless.yaml' ignore: @@ -19,7 +19,7 @@ on: paths: - 'backend/**' - 'frontend/**' - - 'Dockerfile' + - 'Dockerfile.rootless' - '.dockerignore' - '.github/workflows/docker-publish-rootless.yaml' ignore: diff --git a/.github/workflows/pull-requests.yaml b/.github/workflows/pull-requests.yaml index 7112a6d6..fe4fe37b 100644 --- a/.github/workflows/pull-requests.yaml +++ b/.github/workflows/pull-requests.yaml @@ -9,7 +9,10 @@ on: paths: - 'backend/**' - 'frontend/**' - - '.github/workflows/**' + - '.github/workflows/partial-backend.yaml' + - '.github/workflows/partial-frontend.yaml' + - '.github/workflows/e2e-partial.yaml' + - '.github/workflows/pull-requests.yaml' jobs: backend-tests: diff --git a/Dockerfile.hardened b/Dockerfile.hardened new file mode 100644 index 00000000..1851a641 --- /dev/null +++ b/Dockerfile.hardened @@ -0,0 +1,136 @@ +# --------------------------------------- +# Node dependencies stage +# --------------------------------------- +FROM public.ecr.aws/docker/library/node:lts-alpine AS frontend-dependencies +WORKDIR /app + +# Install pnpm globally (caching layer) +RUN npm install -g pnpm + +# Copy package.json and lockfile to leverage caching +COPY frontend/package.json frontend/pnpm-lock.yaml ./ +RUN pnpm install --frozen-lockfile + +# --------------------------------------- +# Build Nuxt (frontend) stage +# --------------------------------------- +FROM public.ecr.aws/docker/library/node:lts-alpine AS frontend-builder +WORKDIR /app + +# Install pnpm globally again (it can reuse the cache if not changed) +RUN npm install -g pnpm + +# Copy over source files and node_modules from dependencies stage +COPY frontend . +COPY --from=frontend-dependencies /app/node_modules ./node_modules +RUN pnpm build + +# --------------------------------------- +# Go dependencies stage +# --------------------------------------- +FROM public.ecr.aws/docker/library/golang:alpine AS builder-dependencies +WORKDIR /go/src/app + +# Copy go.mod and go.sum for better caching +COPY ./backend/go.mod ./backend/go.sum ./ +RUN go mod download + +# --------------------------------------- +# Build API + healthcheck stage +# --------------------------------------- +FROM public.ecr.aws/docker/library/golang:alpine AS builder +ARG TARGETOS +ARG TARGETARCH +ARG BUILD_TIME +ARG COMMIT +ARG VERSION + +# Install necessary build tools +RUN apk update && \ + apk upgrade && \ + apk add --no-cache git build-base gcc g++ + +WORKDIR /go/src/app + +# Copy Go modules (from dependencies stage) and source code +COPY --from=builder-dependencies /go/pkg/mod /go/pkg/mod +COPY ./backend . + +# Clear old public files and copy new ones from frontend build +RUN rm -rf ./app/api/public +COPY --from=frontend-builder /app/.output/public ./app/api/static/public + +# Use cache for Go build artifacts to build Homebox API +RUN --mount=type=cache,target=/root/.cache/go-build \ + CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH go build \ + -ldflags "-s -w -X main.commit=$COMMIT -X main.buildTime=$BUILD_TIME -X main.version=$VERSION" \ + -tags nodynamic -o /go/bin/api -v ./app/api/*.go + +RUN chmod +x /go/bin/api +RUN mkdir /app +RUN mkdir /data + +# ---------- Build static healthcheck helper ---------- +# A small Go program that GETs the status URL and exits 0 on 2xx. +RUN cat > /tmp/healthcheck.go <<'EOF' +package main +import ( + "fmt" + "net/http" + "os" + "time" +) +func main() { + url := "http://127.0.0.1:7745/api/v1/status" + if len(os.Args) > 1 { url = os.Args[1] } + c := &http.Client{ Timeout: 3 * time.Second } + resp, err := c.Get(url) + if err != nil { fmt.Fprintln(os.Stderr, err); os.Exit(1) } + resp.Body.Close() + if resp.StatusCode/100 != 2 { + fmt.Fprintln(os.Stderr, "unexpected status:", resp.StatusCode) + os.Exit(1) + } +} +EOF + +RUN --mount=type=cache,target=/root/.cache/go-build \ + CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH \ + go build -ldflags "-s -w" -o /go/bin/hc /tmp/healthcheck.go + +# --------------------------------------- +# Production stage +# --------------------------------------- +FROM gcr.io/distroless/static:nonroot +ENV HBOX_MODE=production +ENV HBOX_STORAGE_CONN_STRING=file:///?no_tmp_dir=true +ENV HBOX_STORAGE_PREFIX_PATH=data +ENV HBOX_DATABASE_SQLITE_PATH=/data/homebox.db?_pragma=busy_timeout=2000&_pragma=journal_mode=WAL&_fk=1&_time_format=sqlite + +# Create application directory and copy over built Go binary and assets +COPY --from=builder --chown=65532:65532 /app /app +COPY --from=builder --chown=65532:65532 --chmod=755 /go/bin/api /app +COPY --from=builder --chown=65532:65532 /data /data + +# Copy the healthcheck helper +COPY --from=builder --chown=65532:65532 --chmod=755 /go/bin/hc /app/healthcheck + +# Labels and configuration for the final image +LABEL Name=homebox Version=0.0.1 +LABEL org.opencontainers.image.source="https://github.com/sysadminsmedia/homebox" + +# Expose necessary ports for Homebox +EXPOSE 7745 +WORKDIR /app + +# Persist volume for data +VOLUME [ "/data" ] + +# Entrypoint and CMD +USER 65532 +ENTRYPOINT [ "/app/api" ] +CMD [ "/data/config.yml" ] + +# JSON exec-form healthcheck (no shell, no wget) +HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 \ + CMD ["/app/healthcheck", "http://127.0.0.1:7745/api/v1/status"] diff --git a/README.md b/README.md index 77856b4c..ecd2fb53 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ HomeBox is the inventory and organization system built for the Home User! With a - _Portable_ - Homebox is designed to be portable and run on anywhere. We use SQLite and an embedded Web UI to make it easy to deploy, use, and backup. # Screenshots -Check out screenshots of the project [here](https://imgur.com/a/5gLWt2j). +Check out screenshots of the project [here](https://github.com/sysadminsmedia/homebox/tree/main/screenshots). You can also try the demo instances of Homebox: - [Demo](https://demo.homebox.software) - [Nightly](https://nightly.homebox.software) diff --git a/Screenshots/1.png b/Screenshots/1.png new file mode 100644 index 00000000..986943c3 Binary files /dev/null and b/Screenshots/1.png differ diff --git a/Screenshots/10.png b/Screenshots/10.png new file mode 100644 index 00000000..5396b13b Binary files /dev/null and b/Screenshots/10.png differ diff --git a/Screenshots/2.png b/Screenshots/2.png new file mode 100644 index 00000000..9b8f2cc2 Binary files /dev/null and b/Screenshots/2.png differ diff --git a/Screenshots/3.png b/Screenshots/3.png new file mode 100644 index 00000000..5a5be2cf Binary files /dev/null and b/Screenshots/3.png differ diff --git a/Screenshots/4.png b/Screenshots/4.png new file mode 100644 index 00000000..a249bd52 Binary files /dev/null and b/Screenshots/4.png differ diff --git a/Screenshots/5.png b/Screenshots/5.png new file mode 100644 index 00000000..55bb6e81 Binary files /dev/null and b/Screenshots/5.png differ diff --git a/Screenshots/6.png b/Screenshots/6.png new file mode 100644 index 00000000..7cc6512e Binary files /dev/null and b/Screenshots/6.png differ diff --git a/Screenshots/7.png b/Screenshots/7.png new file mode 100644 index 00000000..8f0c33ea Binary files /dev/null and b/Screenshots/7.png differ diff --git a/Screenshots/8.png b/Screenshots/8.png new file mode 100644 index 00000000..46f5622e Binary files /dev/null and b/Screenshots/8.png differ diff --git a/Screenshots/9.png b/Screenshots/9.png new file mode 100644 index 00000000..f4389440 Binary files /dev/null and b/Screenshots/9.png differ diff --git a/Screenshots/readme.md b/Screenshots/readme.md new file mode 100644 index 00000000..c525de11 --- /dev/null +++ b/Screenshots/readme.md @@ -0,0 +1,8 @@ +# Screenshots + +These screenshots are taken from our public [Demo](https://demo.homebox.software) instance. +Note that whilst we will make every effort to ensure that these are maintained and updated, they may be outdated or missing functionality and we would always advise reviewing our demo instances: + +- [Demo](https://demo.homebox.software) +- [Nightly](https://nightly.homebox.software) +- [VNext](https://vnext.homebox.software/) \ No newline at end of file diff --git a/backend/app/api/handlers/v1/v1_ctrl_items.go b/backend/app/api/handlers/v1/v1_ctrl_items.go index 44b37196..6f3f67ac 100644 --- a/backend/app/api/handlers/v1/v1_ctrl_items.go +++ b/backend/app/api/handlers/v1/v1_ctrl_items.go @@ -262,6 +262,25 @@ func (ctrl *V1Controller) HandleItemPatch() errchain.HandlerFunc { return adapters.ActionID("id", fn, http.StatusOK) } +// HandleItemDuplicate godocs +// +// @Summary Duplicate Item +// @Tags Items +// @Produce json +// @Param id path string true "Item ID" +// @Param payload body repo.DuplicateOptions true "Duplicate Options" +// @Success 201 {object} repo.ItemOut +// @Router /v1/items/{id}/duplicate [POST] +// @Security Bearer +func (ctrl *V1Controller) HandleItemDuplicate() errchain.HandlerFunc { + fn := func(r *http.Request, ID uuid.UUID, options repo.DuplicateOptions) (repo.ItemOut, error) { + ctx := services.NewContext(r.Context()) + return ctrl.svc.Items.Duplicate(ctx, ctx.GID, ID, options) + } + + return adapters.ActionID("id", fn, http.StatusCreated) +} + // HandleGetAllCustomFieldNames godocs // // @Summary (Deprecated) Get All Custom Field Names diff --git a/backend/app/api/handlers/v1/v1_ctrl_items_attachments.go b/backend/app/api/handlers/v1/v1_ctrl_items_attachments.go index 365b45d4..a461d6e8 100644 --- a/backend/app/api/handlers/v1/v1_ctrl_items_attachments.go +++ b/backend/app/api/handlers/v1/v1_ctrl_items_attachments.go @@ -209,7 +209,7 @@ func (ctrl *V1Controller) handleItemAttachmentsHandler(w http.ResponseWriter, r }(bucket) // Set the Content-Disposition header for RFC6266 compliance - disposition := "attachment; filename*=UTF-8''" + url.QueryEscape(doc.Title) + disposition := "inline; filename*=UTF-8''" + url.QueryEscape(doc.Title) w.Header().Set("Content-Disposition", disposition) http.ServeContent(w, r, doc.Title, doc.CreatedAt, file) return nil diff --git a/backend/app/api/handlers/v1/v1_ctrl_labelmaker.go b/backend/app/api/handlers/v1/v1_ctrl_labelmaker.go index f3b1613b..91f47492 100644 --- a/backend/app/api/handlers/v1/v1_ctrl_labelmaker.go +++ b/backend/app/api/handlers/v1/v1_ctrl_labelmaker.go @@ -29,7 +29,7 @@ func generateOrPrint(ctrl *V1Controller, w http.ResponseWriter, r *http.Request, _, err = w.Write([]byte("Printed!")) return err } else { - return labelmaker.GenerateLabel(w, ¶ms) + return labelmaker.GenerateLabel(w, ¶ms, ctrl.config) } } diff --git a/backend/app/api/main.go b/backend/app/api/main.go index a3fa817a..c651f3c1 100644 --- a/backend/app/api/main.go +++ b/backend/app/api/main.go @@ -4,13 +4,14 @@ import ( "context" "errors" "fmt" + "net/http" + "strings" + "time" + "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "github.com/pressly/goose/v3" "github.com/sysadminsmedia/homebox/backend/internal/sys/analytics" - "net/http" - "strings" - "time" "github.com/hay-kot/httpkit/errchain" "github.com/hay-kot/httpkit/graceful" @@ -102,31 +103,50 @@ func run(cfg *config.Config) error { // ========================================================================= // Initialize Database & Repos - setupStorageDir(cfg) + err := setupStorageDir(cfg) + if err != nil { + return err + } if strings.ToLower(cfg.Database.Driver) == "postgres" { if !validatePostgresSSLMode(cfg.Database.SslMode) { - log.Fatal().Str("sslmode", cfg.Database.SslMode).Msg("invalid sslmode") + log.Error().Str("sslmode", cfg.Database.SslMode).Msg("invalid sslmode") + return fmt.Errorf("invalid sslmode: %s", cfg.Database.SslMode) } } - databaseURL := setupDatabaseURL(cfg) + databaseURL, err := setupDatabaseURL(cfg) + if err != nil { + return err + } c, err := ent.Open(strings.ToLower(cfg.Database.Driver), databaseURL) if err != nil { - log.Fatal(). + log.Error(). Err(err). Str("driver", strings.ToLower(cfg.Database.Driver)). Str("host", cfg.Database.Host). Str("port", cfg.Database.Port). Str("database", cfg.Database.Database). Msg("failed opening connection to {driver} database at {host}:{port}/{database}") + return fmt.Errorf("failed opening connection to %s database at %s:%s/%s: %w", + strings.ToLower(cfg.Database.Driver), + cfg.Database.Host, + cfg.Database.Port, + cfg.Database.Database, + err, + ) } - goose.SetBaseFS(migrations.Migrations(strings.ToLower(cfg.Database.Driver))) + migrationsFs, err := migrations.Migrations(strings.ToLower(cfg.Database.Driver)) + if err != nil { + return fmt.Errorf("failed to get migrations for %s: %w", strings.ToLower(cfg.Database.Driver), err) + } + + goose.SetBaseFS(migrationsFs) err = goose.SetDialect(strings.ToLower(cfg.Database.Driver)) if err != nil { - log.Fatal().Str("driver", cfg.Database.Driver).Msg("unsupported database driver") + log.Error().Str("driver", cfg.Database.Driver).Msg("unsupported database driver") return fmt.Errorf("unsupported database driver: %s", cfg.Database.Driver) } diff --git a/backend/app/api/recurring.go b/backend/app/api/recurring.go index d6df8511..8c276836 100644 --- a/backend/app/api/recurring.go +++ b/backend/app/api/recurring.go @@ -3,13 +3,13 @@ package main import ( "context" "fmt" - "github.com/hay-kot/httpkit/graceful" - "github.com/sysadminsmedia/homebox/backend/internal/sys/config" "net/http" "time" "github.com/google/uuid" + "github.com/hay-kot/httpkit/graceful" "github.com/rs/zerolog/log" + "github.com/sysadminsmedia/homebox/backend/internal/sys/config" "github.com/sysadminsmedia/homebox/backend/pkgs/utils" "gocloud.dev/pubsub" ) @@ -22,7 +22,8 @@ func registerRecurringTasks(app *app, cfg *config.Config, runner *graceful.Runne log.Info().Msg("Running in demo mode, creating demo data") err := app.SetupDemo() if err != nil { - log.Fatal().Msg(err.Error()) + log.Error().Err(err).Msg("failed to setup demo data") + return fmt.Errorf("failed to setup demo data: %w", err) } } return nil diff --git a/backend/app/api/routes.go b/backend/app/api/routes.go index d15b1518..c5af00bb 100644 --- a/backend/app/api/routes.go +++ b/backend/app/api/routes.go @@ -131,6 +131,7 @@ func (a *app) mountRoutes(r *chi.Mux, chain *errchain.ErrChain, repos *repo.AllR r.Put("/items/{id}", chain.ToHandlerFunc(v1Ctrl.HandleItemUpdate(), userMW...)) r.Patch("/items/{id}", chain.ToHandlerFunc(v1Ctrl.HandleItemPatch(), userMW...)) r.Delete("/items/{id}", chain.ToHandlerFunc(v1Ctrl.HandleItemDelete(), userMW...)) + r.Post("/items/{id}/duplicate", chain.ToHandlerFunc(v1Ctrl.HandleItemDuplicate(), userMW...)) // Deprecated, TODO: Remove after some time r.Post("/items/{id}/attachments", chain.ToHandlerFunc(v1Ctrl.HandleItemAttachmentCreate(), userMW...)) diff --git a/backend/app/api/setup.go b/backend/app/api/setup.go index ecc7bad0..78b374bd 100644 --- a/backend/app/api/setup.go +++ b/backend/app/api/setup.go @@ -13,28 +13,32 @@ import ( ) // setupStorageDir handles the creation and validation of the storage directory. -func setupStorageDir(cfg *config.Config) { +func setupStorageDir(cfg *config.Config) error { if strings.HasPrefix(cfg.Storage.ConnString, "file:///./") { raw := strings.TrimPrefix(cfg.Storage.ConnString, "file:///./") clean := filepath.Clean(raw) absBase, err := filepath.Abs(clean) if err != nil { - log.Fatal().Err(err).Msg("failed to get absolute path for storage connection string") + log.Error().Err(err).Msg("failed to get absolute path for storage connection string") + return fmt.Errorf("failed to get absolute path for storage connection string: %w", err) } absBase = strings.ReplaceAll(absBase, "\\", "/") storageDir := filepath.Join(absBase, cfg.Storage.PrefixPath) storageDir = strings.ReplaceAll(storageDir, "\\", "/") if !strings.HasPrefix(storageDir, absBase+"/") && storageDir != absBase { - log.Fatal().Str("path", storageDir).Msg("invalid storage path: you tried to use a prefix that is not a subdirectory of the base path") + log.Error().Str("path", storageDir).Msg("invalid storage path: you tried to use a prefix that is not a subdirectory of the base path") + return fmt.Errorf("invalid storage path: you tried to use a prefix that is not a subdirectory of the base path") } if err := os.MkdirAll(storageDir, 0o750); err != nil { - log.Fatal().Err(err).Msg("failed to create data directory") + log.Error().Err(err).Msg("failed to create data directory") + return fmt.Errorf("failed to create data directory: %w", err) } } + return nil } // setupDatabaseURL returns the database URL and ensures any required directories exist. -func setupDatabaseURL(cfg *config.Config) string { +func setupDatabaseURL(cfg *config.Config) (string, error) { databaseURL := "" switch strings.ToLower(cfg.Database.Driver) { case "sqlite3": @@ -42,7 +46,8 @@ func setupDatabaseURL(cfg *config.Config) string { dbFilePath := strings.Split(cfg.Database.SqlitePath, "?")[0] dbDir := filepath.Dir(dbFilePath) if err := os.MkdirAll(dbDir, 0o755); err != nil { - log.Fatal().Err(err).Str("path", dbDir).Msg("failed to create SQLite database directory") + log.Error().Err(err).Str("path", dbDir).Msg("failed to create SQLite database directory") + return "", fmt.Errorf("failed to create SQLite database directory: %w", err) } case "postgres": databaseURL = fmt.Sprintf("host=%s port=%s dbname=%s sslmode=%s", cfg.Database.Host, cfg.Database.Port, cfg.Database.Database, cfg.Database.SslMode) @@ -53,27 +58,31 @@ func setupDatabaseURL(cfg *config.Config) string { databaseURL += fmt.Sprintf(" password=%s", cfg.Database.Password) } if cfg.Database.SslRootCert != "" { - if _, err := os.Stat(cfg.Database.SslRootCert); err != nil || !os.IsNotExist(err) { - log.Fatal().Err(err).Str("path", cfg.Database.SslRootCert).Msg("SSL root certificate file does not accessible") + if _, err := os.Stat(cfg.Database.SslRootCert); err != nil { + log.Error().Err(err).Str("path", cfg.Database.SslRootCert).Msg("SSL root certificate file is not accessible") + return "", fmt.Errorf("SSL root certificate file is not accessible: %w", err) } databaseURL += fmt.Sprintf(" sslrootcert=%s", cfg.Database.SslRootCert) } if cfg.Database.SslCert != "" { - if _, err := os.Stat(cfg.Database.SslCert); err != nil || !os.IsNotExist(err) { - log.Fatal().Err(err).Str("path", cfg.Database.SslCert).Msg("SSL certificate file does not accessible") + if _, err := os.Stat(cfg.Database.SslCert); err != nil { + log.Error().Err(err).Str("path", cfg.Database.SslCert).Msg("SSL certificate file is not accessible") + return "", fmt.Errorf("SSL certificate file is not accessible: %w", err) } databaseURL += fmt.Sprintf(" sslcert=%s", cfg.Database.SslCert) } if cfg.Database.SslKey != "" { - if _, err := os.Stat(cfg.Database.SslKey); err != nil || !os.IsNotExist(err) { - log.Fatal().Err(err).Str("path", cfg.Database.SslKey).Msg("SSL key file does not accessible") + if _, err := os.Stat(cfg.Database.SslKey); err != nil { + log.Error().Err(err).Str("path", cfg.Database.SslKey).Msg("SSL key file is not accessible") + return "", fmt.Errorf("SSL key file is not accessible: %w", err) } databaseURL += fmt.Sprintf(" sslkey=%s", cfg.Database.SslKey) } default: - log.Fatal().Str("driver", cfg.Database.Driver).Msg("unsupported database driver") + log.Error().Str("driver", cfg.Database.Driver).Msg("unsupported database driver") + return "", fmt.Errorf("unsupported database driver: %s", cfg.Database.Driver) } - return databaseURL + return databaseURL, nil } // loadCurrencies loads currency data from config if provided. diff --git a/backend/app/api/static/docs/docs.go b/backend/app/api/static/docs/docs.go index de3bf8dd..843aebf9 100644 --- a/backend/app/api/static/docs/docs.go +++ b/backend/app/api/static/docs/docs.go @@ -1,11 +1,4379 @@ -// Code generated by swaggo/swag. DO NOT EDIT. - +// Package docs Code generated by swaggo/swag. DO NOT EDIT package docs -import "github.com/swaggo/swag/v2" +import "github.com/swaggo/swag" const docTemplate = `{ - "schemes": {{ marshal .Schemes }},"swagger":"2.0","info":{"description":"{{escape .Description}}","title":"{{.Title}}","contact":{"name":"Homebox Team","url":"https://discord.homebox.software"},"version":"{{.Version}}"},"host":"{{.Host}}","basePath":"{{.BasePath}}","paths":{"/v1/actions/create-missing-thumbnails":{"post":{"security":[{"Bearer":[]}],"description":"Creates thumbnails for items that are missing them","produces":["application/json"],"tags":["Actions"],"summary":"Create Missing Thumbnails","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ActionAmountResult"}}}}},"/v1/actions/ensure-asset-ids":{"post":{"security":[{"Bearer":[]}],"description":"Ensures all items in the database have an asset ID","produces":["application/json"],"tags":["Actions"],"summary":"Ensure Asset IDs","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ActionAmountResult"}}}}},"/v1/actions/ensure-import-refs":{"post":{"security":[{"Bearer":[]}],"description":"Ensures all items in the database have an import ref","produces":["application/json"],"tags":["Actions"],"summary":"Ensures Import Refs","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ActionAmountResult"}}}}},"/v1/actions/set-primary-photos":{"post":{"security":[{"Bearer":[]}],"description":"Sets the first photo of each item as the primary photo","produces":["application/json"],"tags":["Actions"],"summary":"Set Primary Photos","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ActionAmountResult"}}}}},"/v1/actions/zero-item-time-fields":{"post":{"security":[{"Bearer":[]}],"description":"Resets all item date fields to the beginning of the day","produces":["application/json"],"tags":["Actions"],"summary":"Zero Out Time Fields","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ActionAmountResult"}}}}},"/v1/assets/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"Get Item by Asset ID","parameters":[{"type":"string","description":"Asset ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.PaginationResult-repo_ItemSummary"}}}}},"/v1/currency":{"get":{"produces":["application/json"],"tags":["Base"],"summary":"Currency","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/currencies.Currency"}}}}},"/v1/entities/{id}/attachments":{"post":{"security":[{"Bearer":[]}],"consumes":["multipart/form-data"],"produces":["application/json"],"tags":["Items Attachments"],"summary":"Create Item Attachment","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"file","description":"File attachment","name":"file","in":"formData","required":true},{"type":"string","description":"Type of file","name":"type","in":"formData"},{"type":"boolean","description":"Is this the primary attachment","name":"primary","in":"formData"},{"type":"string","description":"name of the file including extension","name":"name","in":"formData","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/validate.ErrorResponse"}}}}},"/v1/entities/{id}/attachments/{attachment_id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/octet-stream"],"tags":["Items Attachments"],"summary":"Get Item Attachment","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ItemAttachmentToken"}}}},"put":{"security":[{"Bearer":[]}],"tags":["Items Attachments"],"summary":"Update Item Attachment","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true},{"description":"Attachment Update","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.ItemAttachmentUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}}}},"delete":{"security":[{"Bearer":[]}],"tags":["Items Attachments"],"summary":"Delete Item Attachment","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/entities/{id}/maintenance":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Item Maintenance"],"summary":"Get Maintenance Log","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"enum":["scheduled","completed","both"],"type":"string","x-enum-varnames":["MaintenanceFilterStatusScheduled","MaintenanceFilterStatusCompleted","MaintenanceFilterStatusBoth"],"name":"status","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.MaintenanceEntryWithDetails"}}}}},"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Item Maintenance"],"summary":"Create Maintenance Entry","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"description":"Entry Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.MaintenanceEntryCreate"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/repo.MaintenanceEntry"}}}}},"/v1/groups":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Group"],"summary":"Get Group","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.Group"}}}},"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Group"],"summary":"Update Group","parameters":[{"description":"User Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.GroupUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.Group"}}}}},"/v1/groups/invitations":{"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Group"],"summary":"Create Group Invitation","parameters":[{"description":"User Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/v1.GroupInvitationCreate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.GroupInvitation"}}}}},"/v1/groups/statistics":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Statistics"],"summary":"Get Group Statistics","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.GroupStatistics"}}}}},"/v1/groups/statistics/labels":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Statistics"],"summary":"Get Label Statistics","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.TotalsByOrganizer"}}}}}},"/v1/groups/statistics/locations":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Statistics"],"summary":"Get Location Statistics","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.TotalsByOrganizer"}}}}}},"/v1/groups/statistics/purchase-price":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Statistics"],"summary":"Get Purchase Price Statistics","parameters":[{"type":"string","description":"start date","name":"start","in":"query"},{"type":"string","description":"end date","name":"end","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ValueOverTime"}}}}},"/v1/items":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Query All Items","deprecated":true,"parameters":[{"type":"string","description":"search string","name":"q","in":"query"},{"type":"integer","description":"page number","name":"page","in":"query"},{"type":"integer","description":"items per page","name":"pageSize","in":"query"},{"type":"array","items":{"type":"string"},"collectionFormat":"multi","description":"label Ids","name":"labels","in":"query"},{"type":"array","items":{"type":"string"},"collectionFormat":"multi","description":"location Ids","name":"locations","in":"query"},{"type":"array","items":{"type":"string"},"collectionFormat":"multi","description":"parent Ids","name":"parentIds","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.PaginationResult-repo_ItemSummary"}}}},"post":{"security":[{"Bearer":[]}],"consumes":["application/json"],"produces":["application/json"],"tags":["Items"],"summary":"Create Item","deprecated":true,"parameters":[{"description":"Item Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.ItemCreate"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/repo.ItemSummary"}}}}},"/v1/items/export":{"get":{"security":[{"Bearer":[]}],"tags":["Items"],"summary":"(Deprecated) Export Items","deprecated":true,"responses":{"200":{"description":"text/csv","schema":{"type":"string"}}}}},"/v1/items/fields":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Get All Custom Field Names","deprecated":true,"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"type":"string"}}}}}},"/v1/items/fields/values":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Get All Custom Field Values","deprecated":true,"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"type":"string"}}}}}},"/v1/items/import":{"post":{"security":[{"Bearer":[]}],"consumes":["multipart/form-data"],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Import Items","deprecated":true,"parameters":[{"type":"file","description":"Image to upload","name":"csv","in":"formData","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/items/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Get Item","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}}}},"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Update Item","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"description":"Item Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.ItemUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}}}},"delete":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Delete Item","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}},"patch":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Update Item","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"description":"Item Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.ItemPatch"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}}}}},"/v1/items/{id}/attachments":{"post":{"security":[{"Bearer":[]}],"consumes":["multipart/form-data"],"produces":["application/json"],"tags":["Items Attachments"],"summary":"Create Item Attachment","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"file","description":"File attachment","name":"file","in":"formData","required":true},{"type":"string","description":"Type of file","name":"type","in":"formData"},{"type":"boolean","description":"Is this the primary attachment","name":"primary","in":"formData"},{"type":"string","description":"name of the file including extension","name":"name","in":"formData","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/validate.ErrorResponse"}}}}},"/v1/items/{id}/attachments/{attachment_id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/octet-stream"],"tags":["Items Attachments"],"summary":"Get Item Attachment","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ItemAttachmentToken"}}}},"put":{"security":[{"Bearer":[]}],"tags":["Items Attachments"],"summary":"Update Item Attachment","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true},{"description":"Attachment Update","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.ItemAttachmentUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}}}},"delete":{"security":[{"Bearer":[]}],"tags":["Items Attachments"],"summary":"Delete Item Attachment","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/items/{id}/maintenance":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Item Maintenance"],"summary":"Get Maintenance Log","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"enum":["scheduled","completed","both"],"type":"string","x-enum-varnames":["MaintenanceFilterStatusScheduled","MaintenanceFilterStatusCompleted","MaintenanceFilterStatusBoth"],"name":"status","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.MaintenanceEntryWithDetails"}}}}},"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Item Maintenance"],"summary":"Create Maintenance Entry","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"description":"Entry Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.MaintenanceEntryCreate"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/repo.MaintenanceEntry"}}}}},"/v1/items/{id}/path":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Get the full path of an item","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.ItemPath"}}}}}},"/v1/labelmaker/assets/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"Get Asset label","parameters":[{"type":"string","description":"Asset ID","name":"id","in":"path","required":true},{"type":"boolean","description":"Print this label, defaults to false","name":"print","in":"query"}],"responses":{"200":{"description":"image/png","schema":{"type":"string"}}}}},"/v1/labelmaker/item/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"Get Item label","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"boolean","description":"Print this label, defaults to false","name":"print","in":"query"}],"responses":{"200":{"description":"image/png","schema":{"type":"string"}}}}},"/v1/labelmaker/location/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"Get Location label","parameters":[{"type":"string","description":"Location ID","name":"id","in":"path","required":true},{"type":"boolean","description":"Print this label, defaults to false","name":"print","in":"query"}],"responses":{"200":{"description":"image/png","schema":{"type":"string"}}}}},"/v1/labels":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Labels"],"summary":"Get All Labels","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.LabelOut"}}}}},"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Labels"],"summary":"Create Label","parameters":[{"description":"Label Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.LabelCreate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LabelSummary"}}}}},"/v1/labels/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Labels"],"summary":"Get Label","parameters":[{"type":"string","description":"Label ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LabelOut"}}}},"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Labels"],"summary":"Update Label","parameters":[{"type":"string","description":"Label ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LabelOut"}}}},"delete":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Labels"],"summary":"Delete Label","parameters":[{"type":"string","description":"Label ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/locations":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Get All Locations","deprecated":true,"parameters":[{"type":"boolean","description":"Filter locations with parents","name":"filterChildren","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.LocationOutCount"}}}}},"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Create Location","deprecated":true,"parameters":[{"description":"Location Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.LocationCreate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LocationSummary"}}}}},"/v1/locations/tree":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Get Locations Tree","deprecated":true,"parameters":[{"type":"boolean","description":"include items in response tree","name":"withItems","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.TreeItem"}}}}}},"/v1/locations/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Get Location","deprecated":true,"parameters":[{"type":"string","description":"Location ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LocationOut"}}}},"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Update Location","deprecated":true,"parameters":[{"type":"string","description":"Location ID","name":"id","in":"path","required":true},{"description":"Location Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.LocationUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LocationOut"}}}},"delete":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Delete Location","deprecated":true,"parameters":[{"type":"string","description":"Location ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/maintenance":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Maintenance"],"summary":"Query All Maintenance","parameters":[{"enum":["scheduled","completed","both"],"type":"string","x-enum-varnames":["MaintenanceFilterStatusScheduled","MaintenanceFilterStatusCompleted","MaintenanceFilterStatusBoth"],"name":"status","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.MaintenanceEntryWithDetails"}}}}}},"/v1/maintenance/{id}":{"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Maintenance"],"summary":"Update Maintenance Entry","parameters":[{"type":"string","description":"Maintenance ID","name":"id","in":"path","required":true},{"description":"Entry Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.MaintenanceEntryUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.MaintenanceEntry"}}}},"delete":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Maintenance"],"summary":"Delete Maintenance Entry","parameters":[{"type":"string","description":"Maintenance ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/notifiers":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Notifiers"],"summary":"Get Notifiers","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.NotifierOut"}}}}},"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Notifiers"],"summary":"Create Notifier","parameters":[{"description":"Notifier Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.NotifierCreate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.NotifierOut"}}}}},"/v1/notifiers/test":{"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Notifiers"],"summary":"Test Notifier","parameters":[{"type":"string","description":"URL","name":"url","in":"query","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/notifiers/{id}":{"put":{"security":[{"Bearer":[]}],"tags":["Notifiers"],"summary":"Update Notifier","parameters":[{"type":"string","description":"Notifier ID","name":"id","in":"path","required":true},{"description":"Notifier Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.NotifierUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.NotifierOut"}}}},"delete":{"security":[{"Bearer":[]}],"tags":["Notifiers"],"summary":"Delete a Notifier","parameters":[{"type":"string","description":"Notifier ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/products/search-from-barcode":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"Search EAN from Barcode","parameters":[{"type":"string","description":"barcode to be searched","name":"data","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.BarcodeProduct"}}}}}},"/v1/qrcode":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"Create QR Code","parameters":[{"type":"string","description":"data to be encoded into qrcode","name":"data","in":"query"}],"responses":{"200":{"description":"image/jpeg","schema":{"type":"string"}}}}},"/v1/reporting/bill-of-materials":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Reporting"],"summary":"Export Bill of Materials","responses":{"200":{"description":"text/csv","schema":{"type":"string"}}}}},"/v1/status":{"get":{"produces":["application/json"],"tags":["Base"],"summary":"Application Info","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.APISummary"}}}}},"/v1/users/change-password":{"put":{"security":[{"Bearer":[]}],"tags":["User"],"summary":"Change Password","parameters":[{"description":"Password Payload","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/v1.ChangePassword"}}],"responses":{"204":{"description":"No Content"}}}},"/v1/users/login":{"post":{"consumes":["application/x-www-form-urlencoded","application/json"],"produces":["application/json"],"tags":["Authentication"],"summary":"User Login","parameters":[{"description":"Login Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/v1.LoginForm"}},{"type":"string","description":"auth provider","name":"provider","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.TokenResponse"}}}}},"/v1/users/logout":{"post":{"security":[{"Bearer":[]}],"tags":["Authentication"],"summary":"User Logout","responses":{"204":{"description":"No Content"}}}},"/v1/users/refresh":{"get":{"security":[{"Bearer":[]}],"description":"handleAuthRefresh returns a handler that will issue a new token from an existing token.\nThis does not validate that the user still exists within the database.","tags":["Authentication"],"summary":"User Token Refresh","responses":{"200":{"description":"OK"}}}},"/v1/users/register":{"post":{"produces":["application/json"],"tags":["User"],"summary":"Register New User","parameters":[{"description":"User Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/services.UserRegistration"}}],"responses":{"204":{"description":"No Content"}}}},"/v1/users/self":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["User"],"summary":"Get User Self","responses":{"200":{"description":"OK","schema":{"allOf":[{"$ref":"#/definitions/v1.Wrapped"},{"type":"object","properties":{"item":{"$ref":"#/definitions/repo.UserOut"}}}]}}}},"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["User"],"summary":"Update Account","parameters":[{"description":"User Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.UserUpdate"}}],"responses":{"200":{"description":"OK","schema":{"allOf":[{"$ref":"#/definitions/v1.Wrapped"},{"type":"object","properties":{"item":{"$ref":"#/definitions/repo.UserUpdate"}}}]}}}},"delete":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["User"],"summary":"Delete Account","responses":{"204":{"description":"No Content"}}}}},"definitions":{"attachment.Type":{"type":"string","enum":["attachment","photo","manual","warranty","attachment","receipt","thumbnail"],"x-enum-varnames":["DefaultType","TypePhoto","TypeManual","TypeWarranty","TypeAttachment","TypeReceipt","TypeThumbnail"]},"authroles.Role":{"type":"string","enum":["user","admin","user","attachments"],"x-enum-varnames":["DefaultRole","RoleAdmin","RoleUser","RoleAttachments"]},"currencies.Currency":{"type":"object","properties":{"code":{"type":"string"},"local":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"}}},"ent.Attachment":{"type":"object","properties":{"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AttachmentQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.AttachmentEdges"}]},"id":{"description":"ID of the ent.","type":"string"},"mime_type":{"description":"MimeType holds the value of the \"mime_type\" field.","type":"string"},"path":{"description":"Path holds the value of the \"path\" field.","type":"string"},"primary":{"description":"Primary holds the value of the \"primary\" field.","type":"boolean"},"title":{"description":"Title holds the value of the \"title\" field.","type":"string"},"type":{"description":"Type holds the value of the \"type\" field.","allOf":[{"$ref":"#/definitions/attachment.Type"}]},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.AttachmentEdges":{"type":"object","properties":{"entity":{"description":"Entity holds the value of the entity edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]},"thumbnail":{"description":"Thumbnail holds the value of the thumbnail edge.","allOf":[{"$ref":"#/definitions/ent.Attachment"}]}}},"ent.AuthRoles":{"type":"object","properties":{"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AuthRolesQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.AuthRolesEdges"}]},"id":{"description":"ID of the ent.","type":"integer"},"role":{"description":"Role holds the value of the \"role\" field.","allOf":[{"$ref":"#/definitions/authroles.Role"}]}}},"ent.AuthRolesEdges":{"type":"object","properties":{"token":{"description":"Token holds the value of the token edge.","allOf":[{"$ref":"#/definitions/ent.AuthTokens"}]}}},"ent.AuthTokens":{"type":"object","properties":{"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AuthTokensQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.AuthTokensEdges"}]},"expires_at":{"description":"ExpiresAt holds the value of the \"expires_at\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"token":{"description":"Token holds the value of the \"token\" field.","type":"array","items":{"type":"integer"}},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.AuthTokensEdges":{"type":"object","properties":{"roles":{"description":"Roles holds the value of the roles edge.","allOf":[{"$ref":"#/definitions/ent.AuthRoles"}]},"user":{"description":"User holds the value of the user edge.","allOf":[{"$ref":"#/definitions/ent.User"}]}}},"ent.Entity":{"type":"object","properties":{"archived":{"description":"Archived holds the value of the \"archived\" field.","type":"boolean"},"asset_id":{"description":"AssetID holds the value of the \"asset_id\" field.","type":"integer"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"description":{"description":"Description holds the value of the \"description\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the EntityQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.EntityEdges"}]},"id":{"description":"ID of the ent.","type":"string"},"import_ref":{"description":"ImportRef holds the value of the \"import_ref\" field.","type":"string"},"insured":{"description":"Insured holds the value of the \"insured\" field.","type":"boolean"},"lifetime_warranty":{"description":"LifetimeWarranty holds the value of the \"lifetime_warranty\" field.","type":"boolean"},"manufacturer":{"description":"Manufacturer holds the value of the \"manufacturer\" field.","type":"string"},"model_number":{"description":"ModelNumber holds the value of the \"model_number\" field.","type":"string"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"notes":{"description":"Notes holds the value of the \"notes\" field.","type":"string"},"purchase_from":{"description":"PurchaseFrom holds the value of the \"purchase_from\" field.","type":"string"},"purchase_price":{"description":"PurchasePrice holds the value of the \"purchase_price\" field.","type":"number"},"purchase_time":{"description":"PurchaseTime holds the value of the \"purchase_time\" field.","type":"string"},"quantity":{"description":"Quantity holds the value of the \"quantity\" field.","type":"integer"},"serial_number":{"description":"SerialNumber holds the value of the \"serial_number\" field.","type":"string"},"sold_notes":{"description":"SoldNotes holds the value of the \"sold_notes\" field.","type":"string"},"sold_price":{"description":"SoldPrice holds the value of the \"sold_price\" field.","type":"number"},"sold_time":{"description":"SoldTime holds the value of the \"sold_time\" field.","type":"string"},"sold_to":{"description":"SoldTo holds the value of the \"sold_to\" field.","type":"string"},"sync_child_entities_locations":{"description":"SyncChildEntitiesLocations holds the value of the \"sync_child_entities_locations\" field.","type":"boolean"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"},"warranty_details":{"description":"WarrantyDetails holds the value of the \"warranty_details\" field.","type":"string"},"warranty_expires":{"description":"WarrantyExpires holds the value of the \"warranty_expires\" field.","type":"string"}}},"ent.EntityEdges":{"type":"object","properties":{"attachments":{"description":"Attachments holds the value of the attachments edge.","type":"array","items":{"$ref":"#/definitions/ent.Attachment"}},"children":{"description":"Children holds the value of the children edge.","type":"array","items":{"$ref":"#/definitions/ent.Entity"}},"entity":{"description":"Entity holds the value of the entity edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]},"fields":{"description":"Fields holds the value of the fields edge.","type":"array","items":{"$ref":"#/definitions/ent.EntityField"}},"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]},"label":{"description":"Label holds the value of the label edge.","type":"array","items":{"$ref":"#/definitions/ent.Label"}},"location":{"description":"Location holds the value of the location edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]},"maintenance_entries":{"description":"MaintenanceEntries holds the value of the maintenance_entries edge.","type":"array","items":{"$ref":"#/definitions/ent.MaintenanceEntry"}},"parent":{"description":"Parent holds the value of the parent edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]},"type":{"description":"Type holds the value of the type edge.","allOf":[{"$ref":"#/definitions/ent.EntityType"}]}}},"ent.EntityField":{"type":"object","properties":{"boolean_value":{"description":"BooleanValue holds the value of the \"boolean_value\" field.","type":"boolean"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"description":{"description":"Description holds the value of the \"description\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the EntityFieldQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.EntityFieldEdges"}]},"id":{"description":"ID of the ent.","type":"string"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"number_value":{"description":"NumberValue holds the value of the \"number_value\" field.","type":"integer"},"text_value":{"description":"TextValue holds the value of the \"text_value\" field.","type":"string"},"time_value":{"description":"TimeValue holds the value of the \"time_value\" field.","type":"string"},"type":{"description":"Type holds the value of the \"type\" field.","allOf":[{"$ref":"#/definitions/entityfield.Type"}]},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.EntityFieldEdges":{"type":"object","properties":{"entity":{"description":"Entity holds the value of the entity edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]}}},"ent.EntityType":{"type":"object","properties":{"color":{"description":"Color holds the value of the \"color\" field.","type":"string"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"description":{"description":"Description holds the value of the \"description\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the EntityTypeQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.EntityTypeEdges"}]},"icon":{"description":"Icon holds the value of the \"icon\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"is_location":{"description":"IsLocation holds the value of the \"is_location\" field.","type":"boolean"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.EntityTypeEdges":{"type":"object","properties":{"entities":{"description":"Entities holds the value of the entities edge.","type":"array","items":{"$ref":"#/definitions/ent.Entity"}},"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]}}},"ent.Group":{"type":"object","properties":{"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"currency":{"description":"Currency holds the value of the \"currency\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the GroupQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.GroupEdges"}]},"id":{"description":"ID of the ent.","type":"string"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.GroupEdges":{"type":"object","properties":{"entities":{"description":"Entities holds the value of the entities edge.","type":"array","items":{"$ref":"#/definitions/ent.Entity"}},"entity_types":{"description":"EntityTypes holds the value of the entity_types edge.","type":"array","items":{"$ref":"#/definitions/ent.EntityType"}},"invitation_tokens":{"description":"InvitationTokens holds the value of the invitation_tokens edge.","type":"array","items":{"$ref":"#/definitions/ent.GroupInvitationToken"}},"labels":{"description":"Labels holds the value of the labels edge.","type":"array","items":{"$ref":"#/definitions/ent.Label"}},"notifiers":{"description":"Notifiers holds the value of the notifiers edge.","type":"array","items":{"$ref":"#/definitions/ent.Notifier"}},"users":{"description":"Users holds the value of the users edge.","type":"array","items":{"$ref":"#/definitions/ent.User"}}}},"ent.GroupInvitationToken":{"type":"object","properties":{"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the GroupInvitationTokenQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.GroupInvitationTokenEdges"}]},"expires_at":{"description":"ExpiresAt holds the value of the \"expires_at\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"token":{"description":"Token holds the value of the \"token\" field.","type":"array","items":{"type":"integer"}},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"},"uses":{"description":"Uses holds the value of the \"uses\" field.","type":"integer"}}},"ent.GroupInvitationTokenEdges":{"type":"object","properties":{"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]}}},"ent.Label":{"type":"object","properties":{"color":{"description":"Color holds the value of the \"color\" field.","type":"string"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"description":{"description":"Description holds the value of the \"description\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the LabelQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.LabelEdges"}]},"id":{"description":"ID of the ent.","type":"string"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.LabelEdges":{"type":"object","properties":{"entities":{"description":"Entities holds the value of the entities edge.","type":"array","items":{"$ref":"#/definitions/ent.Entity"}},"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]}}},"ent.MaintenanceEntry":{"type":"object","properties":{"cost":{"description":"Cost holds the value of the \"cost\" field.","type":"number"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"date":{"description":"Date holds the value of the \"date\" field.","type":"string"},"description":{"description":"Description holds the value of the \"description\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the MaintenanceEntryQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.MaintenanceEntryEdges"}]},"entity_id":{"description":"EntityID holds the value of the \"entity_id\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"scheduled_date":{"description":"ScheduledDate holds the value of the \"scheduled_date\" field.","type":"string"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.MaintenanceEntryEdges":{"type":"object","properties":{"entity":{"description":"Entity holds the value of the entity edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]}}},"ent.Notifier":{"type":"object","properties":{"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the NotifierQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.NotifierEdges"}]},"group_id":{"description":"GroupID holds the value of the \"group_id\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"is_active":{"description":"IsActive holds the value of the \"is_active\" field.","type":"boolean"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"},"user_id":{"description":"UserID holds the value of the \"user_id\" field.","type":"string"}}},"ent.NotifierEdges":{"type":"object","properties":{"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]},"user":{"description":"User holds the value of the user edge.","allOf":[{"$ref":"#/definitions/ent.User"}]}}},"ent.User":{"type":"object","properties":{"activated_on":{"description":"ActivatedOn holds the value of the \"activated_on\" field.","type":"string"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the UserQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.UserEdges"}]},"email":{"description":"Email holds the value of the \"email\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"is_superuser":{"description":"IsSuperuser holds the value of the \"is_superuser\" field.","type":"boolean"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"role":{"description":"Role holds the value of the \"role\" field.","allOf":[{"$ref":"#/definitions/user.Role"}]},"superuser":{"description":"Superuser holds the value of the \"superuser\" field.","type":"boolean"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.UserEdges":{"type":"object","properties":{"auth_tokens":{"description":"AuthTokens holds the value of the auth_tokens edge.","type":"array","items":{"$ref":"#/definitions/ent.AuthTokens"}},"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]},"notifiers":{"description":"Notifiers holds the value of the notifiers edge.","type":"array","items":{"$ref":"#/definitions/ent.Notifier"}}}},"entityfield.Type":{"type":"string","enum":["text","number","boolean","time"],"x-enum-varnames":["TypeText","TypeNumber","TypeBoolean","TypeTime"]},"repo.BarcodeProduct":{"type":"object","properties":{"barcode":{"type":"string"},"imageBase64":{"type":"string"},"imageURL":{"type":"string"},"item":{"$ref":"#/definitions/repo.ItemCreate"},"manufacturer":{"type":"string"},"modelNumber":{"description":"Identifications","type":"string"},"notes":{"description":"Extras","type":"string"},"search_engine_name":{"type":"string"}}},"repo.Group":{"type":"object","properties":{"createdAt":{"type":"string"},"currency":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.GroupStatistics":{"type":"object","properties":{"totalItemPrice":{"type":"number"},"totalItems":{"type":"integer"},"totalLabels":{"type":"integer"},"totalLocations":{"type":"integer"},"totalUsers":{"type":"integer"},"totalWithWarranty":{"type":"integer"}}},"repo.GroupUpdate":{"type":"object","properties":{"currency":{"type":"string"},"name":{"type":"string"}}},"repo.ItemAttachment":{"type":"object","properties":{"createdAt":{"type":"string"},"id":{"type":"string"},"mimeType":{"type":"string"},"path":{"type":"string"},"primary":{"type":"boolean"},"thumbnail":{"$ref":"#/definitions/ent.Attachment"},"title":{"type":"string"},"type":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.ItemAttachmentUpdate":{"type":"object","properties":{"primary":{"type":"boolean"},"title":{"type":"string"},"type":{"type":"string"}}},"repo.ItemCreate":{"type":"object","required":["name"],"properties":{"description":{"type":"string","maxLength":1000},"labelIds":{"type":"array","items":{"type":"string"}},"locationId":{"description":"Edges","type":"string"},"name":{"type":"string","maxLength":255,"minLength":1},"parentId":{"type":"string","x-nullable":true},"quantity":{"type":"integer"}}},"repo.ItemField":{"type":"object","properties":{"booleanValue":{"type":"boolean"},"id":{"type":"string"},"name":{"type":"string"},"numberValue":{"type":"integer"},"textValue":{"type":"string"},"type":{"type":"string"}}},"repo.ItemOut":{"type":"object","properties":{"archived":{"type":"boolean"},"assetId":{"type":"string","example":"0"},"attachments":{"type":"array","items":{"$ref":"#/definitions/repo.ItemAttachment"}},"createdAt":{"type":"string"},"description":{"type":"string"},"fields":{"type":"array","items":{"$ref":"#/definitions/repo.ItemField"}},"id":{"type":"string"},"imageId":{"type":"string","x-nullable":true,"x-omitempty":true},"insured":{"type":"boolean"},"labels":{"type":"array","items":{"$ref":"#/definitions/repo.LabelSummary"}},"lifetimeWarranty":{"description":"Warranty","type":"boolean"},"location":{"description":"Edges","allOf":[{"$ref":"#/definitions/repo.LocationSummary"}],"x-nullable":true,"x-omitempty":true},"manufacturer":{"type":"string"},"modelNumber":{"type":"string"},"name":{"type":"string"},"notes":{"description":"Extras","type":"string"},"parent":{"allOf":[{"$ref":"#/definitions/repo.ItemSummary"}],"x-nullable":true,"x-omitempty":true},"purchaseFrom":{"type":"string"},"purchasePrice":{"type":"number"},"purchaseTime":{"description":"Purchase","type":"string"},"quantity":{"type":"integer"},"serialNumber":{"type":"string"},"soldNotes":{"type":"string"},"soldPrice":{"type":"number"},"soldTime":{"description":"Sold","type":"string"},"soldTo":{"type":"string"},"syncChildItemsLocations":{"type":"boolean"},"thumbnailId":{"type":"string","x-nullable":true,"x-omitempty":true},"updatedAt":{"type":"string"},"warrantyDetails":{"type":"string"},"warrantyExpires":{"type":"string"}}},"repo.ItemPatch":{"type":"object","properties":{"id":{"type":"string"},"quantity":{"type":"integer","x-nullable":true,"x-omitempty":true}}},"repo.ItemPath":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"$ref":"#/definitions/repo.ItemType"}}},"repo.ItemSummary":{"type":"object","properties":{"archived":{"type":"boolean"},"assetId":{"type":"string","example":"0"},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"imageId":{"type":"string","x-nullable":true,"x-omitempty":true},"insured":{"type":"boolean"},"labels":{"type":"array","items":{"$ref":"#/definitions/repo.LabelSummary"}},"location":{"description":"Edges","allOf":[{"$ref":"#/definitions/repo.LocationSummary"}],"x-nullable":true,"x-omitempty":true},"name":{"type":"string"},"purchasePrice":{"type":"number"},"quantity":{"type":"integer"},"soldTime":{"description":"Sale details","type":"string"},"thumbnailId":{"type":"string","x-nullable":true,"x-omitempty":true},"updatedAt":{"type":"string"}}},"repo.ItemType":{"type":"string","enum":["location","item"],"x-enum-varnames":["ItemTypeLocation","ItemTypeItem"]},"repo.ItemUpdate":{"type":"object","required":["name"],"properties":{"archived":{"type":"boolean"},"assetId":{"type":"string"},"description":{"type":"string","maxLength":1000},"fields":{"type":"array","items":{"$ref":"#/definitions/repo.ItemField"}},"id":{"type":"string"},"insured":{"type":"boolean"},"labelIds":{"type":"array","items":{"type":"string"}},"lifetimeWarranty":{"description":"Warranty","type":"boolean"},"locationId":{"description":"Edges","type":"string"},"manufacturer":{"type":"string"},"modelNumber":{"type":"string"},"name":{"type":"string","maxLength":255,"minLength":1},"notes":{"description":"Extras","type":"string"},"parentId":{"type":"string","x-nullable":true,"x-omitempty":true},"purchaseFrom":{"type":"string","maxLength":255},"purchasePrice":{"type":"number","x-nullable":true,"x-omitempty":true},"purchaseTime":{"description":"Purchase","type":"string"},"quantity":{"type":"integer"},"serialNumber":{"description":"Identifications","type":"string"},"soldNotes":{"type":"string"},"soldPrice":{"type":"number","x-nullable":true,"x-omitempty":true},"soldTime":{"description":"Sold","type":"string"},"soldTo":{"type":"string","maxLength":255},"syncChildItemsLocations":{"type":"boolean"},"warrantyDetails":{"type":"string"},"warrantyExpires":{"type":"string"}}},"repo.LabelCreate":{"type":"object","required":["name"],"properties":{"color":{"type":"string"},"description":{"type":"string","maxLength":255},"name":{"type":"string","maxLength":255,"minLength":1}}},"repo.LabelOut":{"type":"object","properties":{"color":{"type":"string"},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.LabelSummary":{"type":"object","properties":{"color":{"type":"string"},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.LocationCreate":{"type":"object","properties":{"description":{"type":"string"},"name":{"type":"string"},"parentId":{"type":"string","x-nullable":true}}},"repo.LocationOut":{"type":"object","properties":{"children":{"type":"array","items":{"$ref":"#/definitions/repo.LocationSummary"}},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"parent":{"$ref":"#/definitions/repo.LocationSummary"},"totalPrice":{"type":"number"},"updatedAt":{"type":"string"}}},"repo.LocationOutCount":{"type":"object","properties":{"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"itemCount":{"type":"integer"},"name":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.LocationSummary":{"type":"object","properties":{"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.LocationUpdate":{"type":"object","properties":{"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"parentId":{"type":"string","x-nullable":true}}},"repo.MaintenanceEntry":{"type":"object","properties":{"completedDate":{"type":"string"},"cost":{"type":"string","example":"0"},"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"scheduledDate":{"type":"string"}}},"repo.MaintenanceEntryCreate":{"type":"object","required":["name"],"properties":{"completedDate":{"type":"string"},"cost":{"type":"string","example":"0"},"description":{"type":"string"},"name":{"type":"string"},"scheduledDate":{"type":"string"}}},"repo.MaintenanceEntryUpdate":{"type":"object","properties":{"completedDate":{"type":"string"},"cost":{"type":"string","example":"0"},"description":{"type":"string"},"name":{"type":"string"},"scheduledDate":{"type":"string"}}},"repo.MaintenanceEntryWithDetails":{"type":"object","properties":{"completedDate":{"type":"string"},"cost":{"type":"string","example":"0"},"description":{"type":"string"},"id":{"type":"string"},"itemID":{"type":"string"},"itemName":{"type":"string"},"name":{"type":"string"},"scheduledDate":{"type":"string"}}},"repo.MaintenanceFilterStatus":{"type":"string","enum":["scheduled","completed","both"],"x-enum-varnames":["MaintenanceFilterStatusScheduled","MaintenanceFilterStatusCompleted","MaintenanceFilterStatusBoth"]},"repo.NotifierCreate":{"type":"object","required":["name","url"],"properties":{"isActive":{"type":"boolean"},"name":{"type":"string","maxLength":255,"minLength":1},"url":{"type":"string"}}},"repo.NotifierOut":{"type":"object","properties":{"createdAt":{"type":"string"},"groupId":{"type":"string"},"id":{"type":"string"},"isActive":{"type":"boolean"},"name":{"type":"string"},"updatedAt":{"type":"string"},"url":{"type":"string"},"userId":{"type":"string"}}},"repo.NotifierUpdate":{"type":"object","required":["name"],"properties":{"isActive":{"type":"boolean"},"name":{"type":"string","maxLength":255,"minLength":1},"url":{"type":"string","x-nullable":true}}},"repo.PaginationResult-repo_ItemSummary":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/definitions/repo.ItemSummary"}},"page":{"type":"integer"},"pageSize":{"type":"integer"},"total":{"type":"integer"}}},"repo.TotalsByOrganizer":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"total":{"type":"number"}}},"repo.TreeItem":{"type":"object","properties":{"children":{"type":"array","items":{"$ref":"#/definitions/repo.TreeItem"}},"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"}}},"repo.UserOut":{"type":"object","properties":{"email":{"type":"string"},"groupId":{"type":"string"},"groupName":{"type":"string"},"id":{"type":"string"},"isOwner":{"type":"boolean"},"isSuperuser":{"type":"boolean"},"name":{"type":"string"}}},"repo.UserUpdate":{"type":"object","properties":{"email":{"type":"string"},"name":{"type":"string"}}},"repo.ValueOverTime":{"type":"object","properties":{"end":{"type":"string"},"entries":{"type":"array","items":{"$ref":"#/definitions/repo.ValueOverTimeEntry"}},"start":{"type":"string"},"valueAtEnd":{"type":"number"},"valueAtStart":{"type":"number"}}},"repo.ValueOverTimeEntry":{"type":"object","properties":{"date":{"type":"string"},"name":{"type":"string"},"value":{"type":"number"}}},"services.Latest":{"type":"object","properties":{"date":{"type":"string"},"version":{"type":"string"}}},"services.UserRegistration":{"type":"object","properties":{"email":{"type":"string"},"name":{"type":"string"},"password":{"type":"string"},"token":{"type":"string"}}},"user.Role":{"type":"string","enum":["user","user","owner"],"x-enum-varnames":["DefaultRole","RoleUser","RoleOwner"]},"v1.APISummary":{"type":"object","properties":{"allowRegistration":{"type":"boolean"},"build":{"$ref":"#/definitions/v1.Build"},"demo":{"type":"boolean"},"health":{"type":"boolean"},"labelPrinting":{"type":"boolean"},"latest":{"$ref":"#/definitions/services.Latest"},"message":{"type":"string"},"title":{"type":"string"},"versions":{"type":"array","items":{"type":"string"}}}},"v1.ActionAmountResult":{"type":"object","properties":{"completed":{"type":"integer"}}},"v1.Build":{"type":"object","properties":{"buildTime":{"type":"string"},"commit":{"type":"string"},"version":{"type":"string"}}},"v1.ChangePassword":{"type":"object","properties":{"current":{"type":"string"},"new":{"type":"string"}}},"v1.GroupInvitation":{"type":"object","properties":{"expiresAt":{"type":"string"},"token":{"type":"string"},"uses":{"type":"integer"}}},"v1.GroupInvitationCreate":{"type":"object","required":["uses"],"properties":{"expiresAt":{"type":"string"},"uses":{"type":"integer","maximum":100,"minimum":1}}},"v1.ItemAttachmentToken":{"type":"object","properties":{"token":{"type":"string"}}},"v1.LoginForm":{"type":"object","properties":{"password":{"type":"string","example":"admin"},"stayLoggedIn":{"type":"boolean"},"username":{"type":"string","example":"admin@admin.com"}}},"v1.TokenResponse":{"type":"object","properties":{"attachmentToken":{"type":"string"},"expiresAt":{"type":"string"},"token":{"type":"string"}}},"v1.Wrapped":{"type":"object","properties":{"item":{}}},"validate.ErrorResponse":{"type":"object","properties":{"error":{"type":"string"},"fields":{"type":"string"}}}},"securityDefinitions":{"Bearer":{"description":"\"Type 'Bearer TOKEN' to correctly set the API Key\"","type":"apiKey","name":"Authorization","in":"header"}}}` + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{escape .Description}}", + "title": "{{.Title}}", + "contact": { + "name": "Homebox Team", + "url": "https://discord.homebox.software" + }, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/v1/actions/create-missing-thumbnails": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Creates thumbnails for items that are missing them", + "produces": [ + "application/json" + ], + "tags": [ + "Actions" + ], + "summary": "Create Missing Thumbnails", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ActionAmountResult" + } + } + } + } + }, + "/v1/actions/ensure-asset-ids": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Ensures all items in the database have an asset ID", + "produces": [ + "application/json" + ], + "tags": [ + "Actions" + ], + "summary": "Ensure Asset IDs", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ActionAmountResult" + } + } + } + } + }, + "/v1/actions/ensure-import-refs": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Ensures all items in the database have an import ref", + "produces": [ + "application/json" + ], + "tags": [ + "Actions" + ], + "summary": "Ensures Import Refs", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ActionAmountResult" + } + } + } + } + }, + "/v1/actions/set-primary-photos": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Sets the first photo of each item as the primary photo", + "produces": [ + "application/json" + ], + "tags": [ + "Actions" + ], + "summary": "Set Primary Photos", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ActionAmountResult" + } + } + } + } + }, + "/v1/actions/zero-item-time-fields": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Resets all item date fields to the beginning of the day", + "produces": [ + "application/json" + ], + "tags": [ + "Actions" + ], + "summary": "Zero Out Time Fields", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ActionAmountResult" + } + } + } + } + }, + "/v1/assets/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get Item by Asset ID", + "parameters": [ + { + "type": "string", + "description": "Asset ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.PaginationResult-repo_ItemSummary" + } + } + } + } + }, + "/v1/currency": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Base" + ], + "summary": "Currency", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/currencies.Currency" + } + } + } + } + }, + "/v1/groups": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Group" + ], + "summary": "Get Group", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.Group" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Group" + ], + "summary": "Update Group", + "parameters": [ + { + "description": "User Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.GroupUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.Group" + } + } + } + } + }, + "/v1/groups/invitations": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Group" + ], + "summary": "Create Group Invitation", + "parameters": [ + { + "description": "User Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1.GroupInvitationCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.GroupInvitation" + } + } + } + } + }, + "/v1/groups/statistics": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Statistics" + ], + "summary": "Get Group Statistics", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.GroupStatistics" + } + } + } + } + }, + "/v1/groups/statistics/labels": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Statistics" + ], + "summary": "Get Label Statistics", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.TotalsByOrganizer" + } + } + } + } + } + }, + "/v1/groups/statistics/locations": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Statistics" + ], + "summary": "Get Location Statistics", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.TotalsByOrganizer" + } + } + } + } + } + }, + "/v1/groups/statistics/purchase-price": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Statistics" + ], + "summary": "Get Purchase Price Statistics", + "parameters": [ + { + "type": "string", + "description": "start date", + "name": "start", + "in": "query" + }, + { + "type": "string", + "description": "end date", + "name": "end", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ValueOverTime" + } + } + } + } + }, + "/v1/items": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Query All Items", + "parameters": [ + { + "type": "string", + "description": "search string", + "name": "q", + "in": "query" + }, + { + "type": "integer", + "description": "page number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "items per page", + "name": "pageSize", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi", + "description": "label Ids", + "name": "labels", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi", + "description": "location Ids", + "name": "locations", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi", + "description": "parent Ids", + "name": "parentIds", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.PaginationResult-repo_ItemSummary" + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Create Item", + "parameters": [ + { + "description": "Item Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.ItemCreate" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/repo.ItemSummary" + } + } + } + } + }, + "/v1/items/export": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Items" + ], + "summary": "Export Items", + "responses": { + "200": { + "description": "text/csv", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/items/fields": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get All Custom Field Names", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/v1/items/fields/values": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get All Custom Field Values", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/v1/items/import": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Import Items", + "parameters": [ + { + "type": "file", + "description": "Image to upload", + "name": "csv", + "in": "formData", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/items/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get Item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Update Item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Item Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.ItemUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Delete Item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + }, + "patch": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Update Item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Item Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.ItemPatch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + } + } + } + }, + "/v1/items/{id}/attachments": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items Attachments" + ], + "summary": "Create Item Attachment", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "file", + "description": "File attachment", + "name": "file", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "Type of file", + "name": "type", + "in": "formData" + }, + { + "type": "boolean", + "description": "Is this the primary attachment", + "name": "primary", + "in": "formData" + }, + { + "type": "string", + "description": "name of the file including extension", + "name": "name", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + }, + "422": { + "description": "Unprocessable Entity", + "schema": { + "$ref": "#/definitions/validate.ErrorResponse" + } + } + } + } + }, + "/v1/items/{id}/attachments/{attachment_id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/octet-stream" + ], + "tags": [ + "Items Attachments" + ], + "summary": "Get Item Attachment", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Attachment ID", + "name": "attachment_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ItemAttachmentToken" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Items Attachments" + ], + "summary": "Update Item Attachment", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Attachment ID", + "name": "attachment_id", + "in": "path", + "required": true + }, + { + "description": "Attachment Update", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.ItemAttachmentUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Items Attachments" + ], + "summary": "Delete Item Attachment", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Attachment ID", + "name": "attachment_id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/items/{id}/duplicate": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Duplicate Item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Duplicate Options", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.DuplicateOptions" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + } + } + } + }, + "/v1/items/{id}/maintenance": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Item Maintenance" + ], + "summary": "Get Maintenance Log", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "enum": [ + "scheduled", + "completed", + "both" + ], + "type": "string", + "x-enum-varnames": [ + "MaintenanceFilterStatusScheduled", + "MaintenanceFilterStatusCompleted", + "MaintenanceFilterStatusBoth" + ], + "name": "status", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.MaintenanceEntryWithDetails" + } + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Item Maintenance" + ], + "summary": "Create Maintenance Entry", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Entry Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.MaintenanceEntryCreate" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/repo.MaintenanceEntry" + } + } + } + } + }, + "/v1/items/{id}/path": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get the full path of an item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ItemPath" + } + } + } + } + } + }, + "/v1/labelmaker/assets/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get Asset label", + "parameters": [ + { + "type": "string", + "description": "Asset ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "boolean", + "description": "Print this label, defaults to false", + "name": "print", + "in": "query" + } + ], + "responses": { + "200": { + "description": "image/png", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/labelmaker/item/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get Item label", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "boolean", + "description": "Print this label, defaults to false", + "name": "print", + "in": "query" + } + ], + "responses": { + "200": { + "description": "image/png", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/labelmaker/location/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Get Location label", + "parameters": [ + { + "type": "string", + "description": "Location ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "boolean", + "description": "Print this label, defaults to false", + "name": "print", + "in": "query" + } + ], + "responses": { + "200": { + "description": "image/png", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/labels": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Labels" + ], + "summary": "Get All Labels", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.LabelOut" + } + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Labels" + ], + "summary": "Create Label", + "parameters": [ + { + "description": "Label Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.LabelCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LabelSummary" + } + } + } + } + }, + "/v1/labels/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Labels" + ], + "summary": "Get Label", + "parameters": [ + { + "type": "string", + "description": "Label ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LabelOut" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Labels" + ], + "summary": "Update Label", + "parameters": [ + { + "type": "string", + "description": "Label ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LabelOut" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Labels" + ], + "summary": "Delete Label", + "parameters": [ + { + "type": "string", + "description": "Label ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/locations": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Get All Locations", + "parameters": [ + { + "type": "boolean", + "description": "Filter locations with parents", + "name": "filterChildren", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.LocationOutCount" + } + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Create Location", + "parameters": [ + { + "description": "Location Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.LocationCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LocationSummary" + } + } + } + } + }, + "/v1/locations/tree": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Get Locations Tree", + "parameters": [ + { + "type": "boolean", + "description": "include items in response tree", + "name": "withItems", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.TreeItem" + } + } + } + } + } + }, + "/v1/locations/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Get Location", + "parameters": [ + { + "type": "string", + "description": "Location ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LocationOut" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Update Location", + "parameters": [ + { + "type": "string", + "description": "Location ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Location Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.LocationUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LocationOut" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Delete Location", + "parameters": [ + { + "type": "string", + "description": "Location ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/maintenance": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Maintenance" + ], + "summary": "Query All Maintenance", + "parameters": [ + { + "enum": [ + "scheduled", + "completed", + "both" + ], + "type": "string", + "x-enum-varnames": [ + "MaintenanceFilterStatusScheduled", + "MaintenanceFilterStatusCompleted", + "MaintenanceFilterStatusBoth" + ], + "name": "status", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.MaintenanceEntryWithDetails" + } + } + } + } + } + }, + "/v1/maintenance/{id}": { + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Maintenance" + ], + "summary": "Update Maintenance Entry", + "parameters": [ + { + "type": "string", + "description": "Maintenance ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Entry Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.MaintenanceEntryUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.MaintenanceEntry" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Maintenance" + ], + "summary": "Delete Maintenance Entry", + "parameters": [ + { + "type": "string", + "description": "Maintenance ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/notifiers": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Notifiers" + ], + "summary": "Get Notifiers", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.NotifierOut" + } + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Notifiers" + ], + "summary": "Create Notifier", + "parameters": [ + { + "description": "Notifier Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.NotifierCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.NotifierOut" + } + } + } + } + }, + "/v1/notifiers/test": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Notifiers" + ], + "summary": "Test Notifier", + "parameters": [ + { + "type": "string", + "description": "URL", + "name": "url", + "in": "query", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/notifiers/{id}": { + "put": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Notifiers" + ], + "summary": "Update Notifier", + "parameters": [ + { + "type": "string", + "description": "Notifier ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Notifier Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.NotifierUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.NotifierOut" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Notifiers" + ], + "summary": "Delete a Notifier", + "parameters": [ + { + "type": "string", + "description": "Notifier ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/products/search-from-barcode": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Search EAN from Barcode", + "parameters": [ + { + "type": "string", + "description": "barcode to be searched", + "name": "data", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.BarcodeProduct" + } + } + } + } + } + }, + "/v1/qrcode": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Create QR Code", + "parameters": [ + { + "type": "string", + "description": "data to be encoded into qrcode", + "name": "data", + "in": "query" + } + ], + "responses": { + "200": { + "description": "image/jpeg", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/reporting/bill-of-materials": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Reporting" + ], + "summary": "Export Bill of Materials", + "responses": { + "200": { + "description": "text/csv", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/status": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Base" + ], + "summary": "Application Info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.APISummary" + } + } + } + } + }, + "/v1/users/change-password": { + "put": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "User" + ], + "summary": "Change Password", + "parameters": [ + { + "description": "Password Payload", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1.ChangePassword" + } + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/users/login": { + "post": { + "consumes": [ + "application/x-www-form-urlencoded", + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Authentication" + ], + "summary": "User Login", + "parameters": [ + { + "description": "Login Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1.LoginForm" + } + }, + { + "type": "string", + "description": "auth provider", + "name": "provider", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.TokenResponse" + } + } + } + } + }, + "/v1/users/logout": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Authentication" + ], + "summary": "User Logout", + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/users/refresh": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "handleAuthRefresh returns a handler that will issue a new token from an existing token.\nThis does not validate that the user still exists within the database.", + "tags": [ + "Authentication" + ], + "summary": "User Token Refresh", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/v1/users/register": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "summary": "Register New User", + "parameters": [ + { + "description": "User Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/services.UserRegistration" + } + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/users/self": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "summary": "Get User Self", + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/v1.Wrapped" + }, + { + "type": "object", + "properties": { + "item": { + "$ref": "#/definitions/repo.UserOut" + } + } + } + ] + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "summary": "Update Account", + "parameters": [ + { + "description": "User Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.UserUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/v1.Wrapped" + }, + { + "type": "object", + "properties": { + "item": { + "$ref": "#/definitions/repo.UserUpdate" + } + } + } + ] + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "summary": "Delete Account", + "responses": { + "204": { + "description": "No Content" + } + } + } + } + }, + "definitions": { + "attachment.Type": { + "type": "string", + "enum": [ + "attachment", + "photo", + "manual", + "warranty", + "attachment", + "receipt", + "thumbnail" + ], + "x-enum-varnames": [ + "DefaultType", + "TypePhoto", + "TypeManual", + "TypeWarranty", + "TypeAttachment", + "TypeReceipt", + "TypeThumbnail" + ] + }, + "authroles.Role": { + "type": "string", + "enum": [ + "user", + "admin", + "user", + "attachments" + ], + "x-enum-varnames": [ + "DefaultRole", + "RoleAdmin", + "RoleUser", + "RoleAttachments" + ] + }, + "currencies.Currency": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "local": { + "type": "string" + }, + "name": { + "type": "string" + }, + "symbol": { + "type": "string" + } + } + }, + "ent.Attachment": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AttachmentQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.AttachmentEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "mime_type": { + "description": "MimeType holds the value of the \"mime_type\" field.", + "type": "string" + }, + "path": { + "description": "Path holds the value of the \"path\" field.", + "type": "string" + }, + "primary": { + "description": "Primary holds the value of the \"primary\" field.", + "type": "boolean" + }, + "title": { + "description": "Title holds the value of the \"title\" field.", + "type": "string" + }, + "type": { + "description": "Type holds the value of the \"type\" field.", + "allOf": [ + { + "$ref": "#/definitions/attachment.Type" + } + ] + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.AttachmentEdges": { + "type": "object", + "properties": { + "item": { + "description": "Item holds the value of the item edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Item" + } + ] + }, + "thumbnail": { + "description": "Thumbnail holds the value of the thumbnail edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Attachment" + } + ] + } + } + }, + "ent.AuthRoles": { + "type": "object", + "properties": { + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AuthRolesQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.AuthRolesEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "integer" + }, + "role": { + "description": "Role holds the value of the \"role\" field.", + "allOf": [ + { + "$ref": "#/definitions/authroles.Role" + } + ] + } + } + }, + "ent.AuthRolesEdges": { + "type": "object", + "properties": { + "token": { + "description": "Token holds the value of the token edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.AuthTokens" + } + ] + } + } + }, + "ent.AuthTokens": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AuthTokensQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.AuthTokensEdges" + } + ] + }, + "expires_at": { + "description": "ExpiresAt holds the value of the \"expires_at\" field.", + "type": "string" + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "token": { + "description": "Token holds the value of the \"token\" field.", + "type": "array", + "items": { + "type": "integer" + } + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.AuthTokensEdges": { + "type": "object", + "properties": { + "roles": { + "description": "Roles holds the value of the roles edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.AuthRoles" + } + ] + }, + "user": { + "description": "User holds the value of the user edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.User" + } + ] + } + } + }, + "ent.Group": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "currency": { + "description": "Currency holds the value of the \"currency\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the GroupQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.GroupEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.GroupEdges": { + "type": "object", + "properties": { + "invitation_tokens": { + "description": "InvitationTokens holds the value of the invitation_tokens edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.GroupInvitationToken" + } + }, + "items": { + "description": "Items holds the value of the items edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Item" + } + }, + "labels": { + "description": "Labels holds the value of the labels edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Label" + } + }, + "locations": { + "description": "Locations holds the value of the locations edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Location" + } + }, + "notifiers": { + "description": "Notifiers holds the value of the notifiers edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Notifier" + } + }, + "users": { + "description": "Users holds the value of the users edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.User" + } + } + } + }, + "ent.GroupInvitationToken": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the GroupInvitationTokenQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.GroupInvitationTokenEdges" + } + ] + }, + "expires_at": { + "description": "ExpiresAt holds the value of the \"expires_at\" field.", + "type": "string" + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "token": { + "description": "Token holds the value of the \"token\" field.", + "type": "array", + "items": { + "type": "integer" + } + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + }, + "uses": { + "description": "Uses holds the value of the \"uses\" field.", + "type": "integer" + } + } + }, + "ent.GroupInvitationTokenEdges": { + "type": "object", + "properties": { + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + } + } + }, + "ent.Item": { + "type": "object", + "properties": { + "archived": { + "description": "Archived holds the value of the \"archived\" field.", + "type": "boolean" + }, + "asset_id": { + "description": "AssetID holds the value of the \"asset_id\" field.", + "type": "integer" + }, + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "description": { + "description": "Description holds the value of the \"description\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the ItemQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.ItemEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "import_ref": { + "description": "ImportRef holds the value of the \"import_ref\" field.", + "type": "string" + }, + "insured": { + "description": "Insured holds the value of the \"insured\" field.", + "type": "boolean" + }, + "lifetime_warranty": { + "description": "LifetimeWarranty holds the value of the \"lifetime_warranty\" field.", + "type": "boolean" + }, + "manufacturer": { + "description": "Manufacturer holds the value of the \"manufacturer\" field.", + "type": "string" + }, + "model_number": { + "description": "ModelNumber holds the value of the \"model_number\" field.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "notes": { + "description": "Notes holds the value of the \"notes\" field.", + "type": "string" + }, + "purchase_from": { + "description": "PurchaseFrom holds the value of the \"purchase_from\" field.", + "type": "string" + }, + "purchase_price": { + "description": "PurchasePrice holds the value of the \"purchase_price\" field.", + "type": "number" + }, + "purchase_time": { + "description": "PurchaseTime holds the value of the \"purchase_time\" field.", + "type": "string" + }, + "quantity": { + "description": "Quantity holds the value of the \"quantity\" field.", + "type": "integer" + }, + "serial_number": { + "description": "SerialNumber holds the value of the \"serial_number\" field.", + "type": "string" + }, + "sold_notes": { + "description": "SoldNotes holds the value of the \"sold_notes\" field.", + "type": "string" + }, + "sold_price": { + "description": "SoldPrice holds the value of the \"sold_price\" field.", + "type": "number" + }, + "sold_time": { + "description": "SoldTime holds the value of the \"sold_time\" field.", + "type": "string" + }, + "sold_to": { + "description": "SoldTo holds the value of the \"sold_to\" field.", + "type": "string" + }, + "sync_child_items_locations": { + "description": "SyncChildItemsLocations holds the value of the \"sync_child_items_locations\" field.", + "type": "boolean" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + }, + "warranty_details": { + "description": "WarrantyDetails holds the value of the \"warranty_details\" field.", + "type": "string" + }, + "warranty_expires": { + "description": "WarrantyExpires holds the value of the \"warranty_expires\" field.", + "type": "string" + } + } + }, + "ent.ItemEdges": { + "type": "object", + "properties": { + "attachments": { + "description": "Attachments holds the value of the attachments edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Attachment" + } + }, + "children": { + "description": "Children holds the value of the children edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Item" + } + }, + "fields": { + "description": "Fields holds the value of the fields edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.ItemField" + } + }, + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + }, + "label": { + "description": "Label holds the value of the label edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Label" + } + }, + "location": { + "description": "Location holds the value of the location edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Location" + } + ] + }, + "maintenance_entries": { + "description": "MaintenanceEntries holds the value of the maintenance_entries edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.MaintenanceEntry" + } + }, + "parent": { + "description": "Parent holds the value of the parent edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Item" + } + ] + } + } + }, + "ent.ItemField": { + "type": "object", + "properties": { + "boolean_value": { + "description": "BooleanValue holds the value of the \"boolean_value\" field.", + "type": "boolean" + }, + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "description": { + "description": "Description holds the value of the \"description\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the ItemFieldQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.ItemFieldEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "number_value": { + "description": "NumberValue holds the value of the \"number_value\" field.", + "type": "integer" + }, + "text_value": { + "description": "TextValue holds the value of the \"text_value\" field.", + "type": "string" + }, + "time_value": { + "description": "TimeValue holds the value of the \"time_value\" field.", + "type": "string" + }, + "type": { + "description": "Type holds the value of the \"type\" field.", + "allOf": [ + { + "$ref": "#/definitions/itemfield.Type" + } + ] + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.ItemFieldEdges": { + "type": "object", + "properties": { + "item": { + "description": "Item holds the value of the item edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Item" + } + ] + } + } + }, + "ent.Label": { + "type": "object", + "properties": { + "color": { + "description": "Color holds the value of the \"color\" field.", + "type": "string" + }, + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "description": { + "description": "Description holds the value of the \"description\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the LabelQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.LabelEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.LabelEdges": { + "type": "object", + "properties": { + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + }, + "items": { + "description": "Items holds the value of the items edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Item" + } + } + } + }, + "ent.Location": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "description": { + "description": "Description holds the value of the \"description\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the LocationQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.LocationEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.LocationEdges": { + "type": "object", + "properties": { + "children": { + "description": "Children holds the value of the children edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Location" + } + }, + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + }, + "items": { + "description": "Items holds the value of the items edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Item" + } + }, + "parent": { + "description": "Parent holds the value of the parent edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Location" + } + ] + } + } + }, + "ent.MaintenanceEntry": { + "type": "object", + "properties": { + "cost": { + "description": "Cost holds the value of the \"cost\" field.", + "type": "number" + }, + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "date": { + "description": "Date holds the value of the \"date\" field.", + "type": "string" + }, + "description": { + "description": "Description holds the value of the \"description\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the MaintenanceEntryQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.MaintenanceEntryEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "item_id": { + "description": "ItemID holds the value of the \"item_id\" field.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "scheduled_date": { + "description": "ScheduledDate holds the value of the \"scheduled_date\" field.", + "type": "string" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.MaintenanceEntryEdges": { + "type": "object", + "properties": { + "item": { + "description": "Item holds the value of the item edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Item" + } + ] + } + } + }, + "ent.Notifier": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the NotifierQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.NotifierEdges" + } + ] + }, + "group_id": { + "description": "GroupID holds the value of the \"group_id\" field.", + "type": "string" + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "is_active": { + "description": "IsActive holds the value of the \"is_active\" field.", + "type": "boolean" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + }, + "user_id": { + "description": "UserID holds the value of the \"user_id\" field.", + "type": "string" + } + } + }, + "ent.NotifierEdges": { + "type": "object", + "properties": { + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + }, + "user": { + "description": "User holds the value of the user edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.User" + } + ] + } + } + }, + "ent.User": { + "type": "object", + "properties": { + "activated_on": { + "description": "ActivatedOn holds the value of the \"activated_on\" field.", + "type": "string" + }, + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the UserQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.UserEdges" + } + ] + }, + "email": { + "description": "Email holds the value of the \"email\" field.", + "type": "string" + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "is_superuser": { + "description": "IsSuperuser holds the value of the \"is_superuser\" field.", + "type": "boolean" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "role": { + "description": "Role holds the value of the \"role\" field.", + "allOf": [ + { + "$ref": "#/definitions/user.Role" + } + ] + }, + "superuser": { + "description": "Superuser holds the value of the \"superuser\" field.", + "type": "boolean" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.UserEdges": { + "type": "object", + "properties": { + "auth_tokens": { + "description": "AuthTokens holds the value of the auth_tokens edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.AuthTokens" + } + }, + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + }, + "notifiers": { + "description": "Notifiers holds the value of the notifiers edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Notifier" + } + } + } + }, + "itemfield.Type": { + "type": "string", + "enum": [ + "text", + "number", + "boolean", + "time" + ], + "x-enum-varnames": [ + "TypeText", + "TypeNumber", + "TypeBoolean", + "TypeTime" + ] + }, + "repo.BarcodeProduct": { + "type": "object", + "properties": { + "barcode": { + "type": "string" + }, + "imageBase64": { + "type": "string" + }, + "imageURL": { + "type": "string" + }, + "item": { + "$ref": "#/definitions/repo.ItemCreate" + }, + "manufacturer": { + "type": "string" + }, + "modelNumber": { + "description": "Identifications", + "type": "string" + }, + "notes": { + "description": "Extras", + "type": "string" + }, + "search_engine_name": { + "type": "string" + } + } + }, + "repo.DuplicateOptions": { + "type": "object", + "properties": { + "copyAttachments": { + "type": "boolean" + }, + "copyCustomFields": { + "type": "boolean" + }, + "copyMaintenance": { + "type": "boolean" + }, + "copyPrefix": { + "type": "string" + } + } + }, + "repo.Group": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "currency": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.GroupStatistics": { + "type": "object", + "properties": { + "totalItemPrice": { + "type": "number" + }, + "totalItems": { + "type": "integer" + }, + "totalLabels": { + "type": "integer" + }, + "totalLocations": { + "type": "integer" + }, + "totalUsers": { + "type": "integer" + }, + "totalWithWarranty": { + "type": "integer" + } + } + }, + "repo.GroupUpdate": { + "type": "object", + "properties": { + "currency": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "repo.ItemAttachment": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "path": { + "type": "string" + }, + "primary": { + "type": "boolean" + }, + "thumbnail": { + "$ref": "#/definitions/ent.Attachment" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.ItemAttachmentUpdate": { + "type": "object", + "properties": { + "primary": { + "type": "boolean" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "repo.ItemCreate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "description": { + "type": "string", + "maxLength": 1000 + }, + "labelIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "locationId": { + "description": "Edges", + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + "parentId": { + "type": "string", + "x-nullable": true + }, + "quantity": { + "type": "integer" + } + } + }, + "repo.ItemField": { + "type": "object", + "properties": { + "booleanValue": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "numberValue": { + "type": "integer" + }, + "textValue": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "repo.ItemOut": { + "type": "object", + "properties": { + "archived": { + "type": "boolean" + }, + "assetId": { + "type": "string", + "example": "0" + }, + "attachments": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ItemAttachment" + } + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ItemField" + } + }, + "id": { + "type": "string" + }, + "imageId": { + "type": "string", + "x-nullable": true, + "x-omitempty": true + }, + "insured": { + "type": "boolean" + }, + "labels": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.LabelSummary" + } + }, + "lifetimeWarranty": { + "description": "Warranty", + "type": "boolean" + }, + "location": { + "description": "Edges", + "allOf": [ + { + "$ref": "#/definitions/repo.LocationSummary" + } + ], + "x-nullable": true, + "x-omitempty": true + }, + "manufacturer": { + "type": "string" + }, + "modelNumber": { + "type": "string" + }, + "name": { + "type": "string" + }, + "notes": { + "description": "Extras", + "type": "string" + }, + "parent": { + "allOf": [ + { + "$ref": "#/definitions/repo.ItemSummary" + } + ], + "x-nullable": true, + "x-omitempty": true + }, + "purchaseFrom": { + "type": "string" + }, + "purchasePrice": { + "type": "number" + }, + "purchaseTime": { + "description": "Purchase", + "type": "string" + }, + "quantity": { + "type": "integer" + }, + "serialNumber": { + "type": "string" + }, + "soldNotes": { + "type": "string" + }, + "soldPrice": { + "type": "number" + }, + "soldTime": { + "description": "Sold", + "type": "string" + }, + "soldTo": { + "type": "string" + }, + "syncChildItemsLocations": { + "type": "boolean" + }, + "thumbnailId": { + "type": "string", + "x-nullable": true, + "x-omitempty": true + }, + "updatedAt": { + "type": "string" + }, + "warrantyDetails": { + "type": "string" + }, + "warrantyExpires": { + "type": "string" + } + } + }, + "repo.ItemPatch": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "quantity": { + "type": "integer", + "x-nullable": true, + "x-omitempty": true + } + } + }, + "repo.ItemPath": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "$ref": "#/definitions/repo.ItemType" + } + } + }, + "repo.ItemSummary": { + "type": "object", + "properties": { + "archived": { + "type": "boolean" + }, + "assetId": { + "type": "string", + "example": "0" + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "imageId": { + "type": "string", + "x-nullable": true, + "x-omitempty": true + }, + "insured": { + "type": "boolean" + }, + "labels": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.LabelSummary" + } + }, + "location": { + "description": "Edges", + "allOf": [ + { + "$ref": "#/definitions/repo.LocationSummary" + } + ], + "x-nullable": true, + "x-omitempty": true + }, + "name": { + "type": "string" + }, + "purchasePrice": { + "type": "number" + }, + "quantity": { + "type": "integer" + }, + "soldTime": { + "description": "Sale details", + "type": "string" + }, + "thumbnailId": { + "type": "string", + "x-nullable": true, + "x-omitempty": true + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.ItemType": { + "type": "string", + "enum": [ + "location", + "item" + ], + "x-enum-varnames": [ + "ItemTypeLocation", + "ItemTypeItem" + ] + }, + "repo.ItemUpdate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "archived": { + "type": "boolean" + }, + "assetId": { + "type": "string" + }, + "description": { + "type": "string", + "maxLength": 1000 + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ItemField" + } + }, + "id": { + "type": "string" + }, + "insured": { + "type": "boolean" + }, + "labelIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "lifetimeWarranty": { + "description": "Warranty", + "type": "boolean" + }, + "locationId": { + "description": "Edges", + "type": "string" + }, + "manufacturer": { + "type": "string" + }, + "modelNumber": { + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + "notes": { + "description": "Extras", + "type": "string" + }, + "parentId": { + "type": "string", + "x-nullable": true, + "x-omitempty": true + }, + "purchaseFrom": { + "type": "string", + "maxLength": 255 + }, + "purchasePrice": { + "type": "number", + "x-nullable": true, + "x-omitempty": true + }, + "purchaseTime": { + "description": "Purchase", + "type": "string" + }, + "quantity": { + "type": "integer" + }, + "serialNumber": { + "description": "Identifications", + "type": "string" + }, + "soldNotes": { + "type": "string" + }, + "soldPrice": { + "type": "number", + "x-nullable": true, + "x-omitempty": true + }, + "soldTime": { + "description": "Sold", + "type": "string" + }, + "soldTo": { + "type": "string", + "maxLength": 255 + }, + "syncChildItemsLocations": { + "type": "boolean" + }, + "warrantyDetails": { + "type": "string" + }, + "warrantyExpires": { + "type": "string" + } + } + }, + "repo.LabelCreate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "color": { + "type": "string" + }, + "description": { + "type": "string", + "maxLength": 1000 + }, + "name": { + "type": "string", + "maxLength": 255, + "minLength": 1 + } + } + }, + "repo.LabelOut": { + "type": "object", + "properties": { + "color": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.LabelSummary": { + "type": "object", + "properties": { + "color": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.LocationCreate": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "parentId": { + "type": "string", + "x-nullable": true + } + } + }, + "repo.LocationOut": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.LocationSummary" + } + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "parent": { + "$ref": "#/definitions/repo.LocationSummary" + }, + "totalPrice": { + "type": "number" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.LocationOutCount": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "itemCount": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.LocationSummary": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.LocationUpdate": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "parentId": { + "type": "string", + "x-nullable": true + } + } + }, + "repo.MaintenanceEntry": { + "type": "object", + "properties": { + "completedDate": { + "type": "string" + }, + "cost": { + "type": "string", + "example": "0" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "scheduledDate": { + "type": "string" + } + } + }, + "repo.MaintenanceEntryCreate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "completedDate": { + "type": "string" + }, + "cost": { + "type": "string", + "example": "0" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "scheduledDate": { + "type": "string" + } + } + }, + "repo.MaintenanceEntryUpdate": { + "type": "object", + "properties": { + "completedDate": { + "type": "string" + }, + "cost": { + "type": "string", + "example": "0" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "scheduledDate": { + "type": "string" + } + } + }, + "repo.MaintenanceEntryWithDetails": { + "type": "object", + "properties": { + "completedDate": { + "type": "string" + }, + "cost": { + "type": "string", + "example": "0" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "itemID": { + "type": "string" + }, + "itemName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "scheduledDate": { + "type": "string" + } + } + }, + "repo.MaintenanceFilterStatus": { + "type": "string", + "enum": [ + "scheduled", + "completed", + "both" + ], + "x-enum-varnames": [ + "MaintenanceFilterStatusScheduled", + "MaintenanceFilterStatusCompleted", + "MaintenanceFilterStatusBoth" + ] + }, + "repo.NotifierCreate": { + "type": "object", + "required": [ + "name", + "url" + ], + "properties": { + "isActive": { + "type": "boolean" + }, + "name": { + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + "url": { + "type": "string" + } + } + }, + "repo.NotifierOut": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "groupId": { + "type": "string" + }, + "id": { + "type": "string" + }, + "isActive": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string" + } + } + }, + "repo.NotifierUpdate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "isActive": { + "type": "boolean" + }, + "name": { + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + "url": { + "type": "string", + "x-nullable": true + } + } + }, + "repo.PaginationResult-repo_ItemSummary": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ItemSummary" + } + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "total": { + "type": "integer" + } + } + }, + "repo.TotalsByOrganizer": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "total": { + "type": "number" + } + } + }, + "repo.TreeItem": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.TreeItem" + } + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "repo.UserOut": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "groupId": { + "type": "string" + }, + "groupName": { + "type": "string" + }, + "id": { + "type": "string" + }, + "isOwner": { + "type": "boolean" + }, + "isSuperuser": { + "type": "boolean" + }, + "name": { + "type": "string" + } + } + }, + "repo.UserUpdate": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "repo.ValueOverTime": { + "type": "object", + "properties": { + "end": { + "type": "string" + }, + "entries": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ValueOverTimeEntry" + } + }, + "start": { + "type": "string" + }, + "valueAtEnd": { + "type": "number" + }, + "valueAtStart": { + "type": "number" + } + } + }, + "repo.ValueOverTimeEntry": { + "type": "object", + "properties": { + "date": { + "type": "string" + }, + "name": { + "type": "string" + }, + "value": { + "type": "number" + } + } + }, + "services.Latest": { + "type": "object", + "properties": { + "date": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "services.UserRegistration": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "name": { + "type": "string" + }, + "password": { + "type": "string" + }, + "token": { + "type": "string" + } + } + }, + "user.Role": { + "type": "string", + "enum": [ + "user", + "user", + "owner" + ], + "x-enum-varnames": [ + "DefaultRole", + "RoleUser", + "RoleOwner" + ] + }, + "v1.APISummary": { + "type": "object", + "properties": { + "allowRegistration": { + "type": "boolean" + }, + "build": { + "$ref": "#/definitions/v1.Build" + }, + "demo": { + "type": "boolean" + }, + "health": { + "type": "boolean" + }, + "labelPrinting": { + "type": "boolean" + }, + "latest": { + "$ref": "#/definitions/services.Latest" + }, + "message": { + "type": "string" + }, + "title": { + "type": "string" + }, + "versions": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "v1.ActionAmountResult": { + "type": "object", + "properties": { + "completed": { + "type": "integer" + } + } + }, + "v1.Build": { + "type": "object", + "properties": { + "buildTime": { + "type": "string" + }, + "commit": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "v1.ChangePassword": { + "type": "object", + "properties": { + "current": { + "type": "string" + }, + "new": { + "type": "string" + } + } + }, + "v1.GroupInvitation": { + "type": "object", + "properties": { + "expiresAt": { + "type": "string" + }, + "token": { + "type": "string" + }, + "uses": { + "type": "integer" + } + } + }, + "v1.GroupInvitationCreate": { + "type": "object", + "required": [ + "uses" + ], + "properties": { + "expiresAt": { + "type": "string" + }, + "uses": { + "type": "integer", + "maximum": 100, + "minimum": 1 + } + } + }, + "v1.ItemAttachmentToken": { + "type": "object", + "properties": { + "token": { + "type": "string" + } + } + }, + "v1.LoginForm": { + "type": "object", + "properties": { + "password": { + "type": "string", + "example": "admin" + }, + "stayLoggedIn": { + "type": "boolean" + }, + "username": { + "type": "string", + "example": "admin@admin.com" + } + } + }, + "v1.TokenResponse": { + "type": "object", + "properties": { + "attachmentToken": { + "type": "string" + }, + "expiresAt": { + "type": "string" + }, + "token": { + "type": "string" + } + } + }, + "v1.Wrapped": { + "type": "object", + "properties": { + "item": {} + } + }, + "validate.ErrorResponse": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "fields": { + "type": "string" + } + } + } + }, + "securityDefinitions": { + "Bearer": { + "description": "\"Type 'Bearer TOKEN' to correctly set the API Key\"", + "type": "apiKey", + "name": "Authorization", + "in": "header" + } + } +}` // SwaggerInfo holds exported Swagger Info so clients can modify it var SwaggerInfo = &swag.Spec{ diff --git a/backend/app/api/static/docs/swagger.json b/backend/app/api/static/docs/swagger.json index 2b027605..c62359b9 100644 --- a/backend/app/api/static/docs/swagger.json +++ b/backend/app/api/static/docs/swagger.json @@ -1 +1,4374 @@ -{"schemes":["https","http"],"swagger":"2.0","info":{"description":"Track, Manage, and Organize your Things.","title":"Homebox API","contact":{"name":"Homebox Team","url":"https://discord.homebox.software"},"version":"1.0"},"host":"demo.homebox.software","basePath":"/api","paths":{"/v1/actions/create-missing-thumbnails":{"post":{"security":[{"Bearer":[]}],"description":"Creates thumbnails for items that are missing them","produces":["application/json"],"tags":["Actions"],"summary":"Create Missing Thumbnails","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ActionAmountResult"}}}}},"/v1/actions/ensure-asset-ids":{"post":{"security":[{"Bearer":[]}],"description":"Ensures all items in the database have an asset ID","produces":["application/json"],"tags":["Actions"],"summary":"Ensure Asset IDs","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ActionAmountResult"}}}}},"/v1/actions/ensure-import-refs":{"post":{"security":[{"Bearer":[]}],"description":"Ensures all items in the database have an import ref","produces":["application/json"],"tags":["Actions"],"summary":"Ensures Import Refs","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ActionAmountResult"}}}}},"/v1/actions/set-primary-photos":{"post":{"security":[{"Bearer":[]}],"description":"Sets the first photo of each item as the primary photo","produces":["application/json"],"tags":["Actions"],"summary":"Set Primary Photos","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ActionAmountResult"}}}}},"/v1/actions/zero-item-time-fields":{"post":{"security":[{"Bearer":[]}],"description":"Resets all item date fields to the beginning of the day","produces":["application/json"],"tags":["Actions"],"summary":"Zero Out Time Fields","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ActionAmountResult"}}}}},"/v1/assets/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"Get Item by Asset ID","parameters":[{"type":"string","description":"Asset ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.PaginationResult-repo_ItemSummary"}}}}},"/v1/currency":{"get":{"produces":["application/json"],"tags":["Base"],"summary":"Currency","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/currencies.Currency"}}}}},"/v1/entities/{id}/attachments":{"post":{"security":[{"Bearer":[]}],"consumes":["multipart/form-data"],"produces":["application/json"],"tags":["Items Attachments"],"summary":"Create Item Attachment","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"file","description":"File attachment","name":"file","in":"formData","required":true},{"type":"string","description":"Type of file","name":"type","in":"formData"},{"type":"boolean","description":"Is this the primary attachment","name":"primary","in":"formData"},{"type":"string","description":"name of the file including extension","name":"name","in":"formData","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/validate.ErrorResponse"}}}}},"/v1/entities/{id}/attachments/{attachment_id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/octet-stream"],"tags":["Items Attachments"],"summary":"Get Item Attachment","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ItemAttachmentToken"}}}},"put":{"security":[{"Bearer":[]}],"tags":["Items Attachments"],"summary":"Update Item Attachment","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true},{"description":"Attachment Update","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.ItemAttachmentUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}}}},"delete":{"security":[{"Bearer":[]}],"tags":["Items Attachments"],"summary":"Delete Item Attachment","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/entities/{id}/maintenance":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Item Maintenance"],"summary":"Get Maintenance Log","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"enum":["scheduled","completed","both"],"type":"string","x-enum-varnames":["MaintenanceFilterStatusScheduled","MaintenanceFilterStatusCompleted","MaintenanceFilterStatusBoth"],"name":"status","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.MaintenanceEntryWithDetails"}}}}},"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Item Maintenance"],"summary":"Create Maintenance Entry","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"description":"Entry Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.MaintenanceEntryCreate"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/repo.MaintenanceEntry"}}}}},"/v1/groups":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Group"],"summary":"Get Group","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.Group"}}}},"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Group"],"summary":"Update Group","parameters":[{"description":"User Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.GroupUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.Group"}}}}},"/v1/groups/invitations":{"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Group"],"summary":"Create Group Invitation","parameters":[{"description":"User Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/v1.GroupInvitationCreate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.GroupInvitation"}}}}},"/v1/groups/statistics":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Statistics"],"summary":"Get Group Statistics","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.GroupStatistics"}}}}},"/v1/groups/statistics/labels":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Statistics"],"summary":"Get Label Statistics","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.TotalsByOrganizer"}}}}}},"/v1/groups/statistics/locations":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Statistics"],"summary":"Get Location Statistics","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.TotalsByOrganizer"}}}}}},"/v1/groups/statistics/purchase-price":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Statistics"],"summary":"Get Purchase Price Statistics","parameters":[{"type":"string","description":"start date","name":"start","in":"query"},{"type":"string","description":"end date","name":"end","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ValueOverTime"}}}}},"/v1/items":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Query All Items","deprecated":true,"parameters":[{"type":"string","description":"search string","name":"q","in":"query"},{"type":"integer","description":"page number","name":"page","in":"query"},{"type":"integer","description":"items per page","name":"pageSize","in":"query"},{"type":"array","items":{"type":"string"},"collectionFormat":"multi","description":"label Ids","name":"labels","in":"query"},{"type":"array","items":{"type":"string"},"collectionFormat":"multi","description":"location Ids","name":"locations","in":"query"},{"type":"array","items":{"type":"string"},"collectionFormat":"multi","description":"parent Ids","name":"parentIds","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.PaginationResult-repo_ItemSummary"}}}},"post":{"security":[{"Bearer":[]}],"consumes":["application/json"],"produces":["application/json"],"tags":["Items"],"summary":"Create Item","deprecated":true,"parameters":[{"description":"Item Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.ItemCreate"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/repo.ItemSummary"}}}}},"/v1/items/export":{"get":{"security":[{"Bearer":[]}],"tags":["Items"],"summary":"(Deprecated) Export Items","deprecated":true,"responses":{"200":{"description":"text/csv","schema":{"type":"string"}}}}},"/v1/items/fields":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Get All Custom Field Names","deprecated":true,"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"type":"string"}}}}}},"/v1/items/fields/values":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Get All Custom Field Values","deprecated":true,"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"type":"string"}}}}}},"/v1/items/import":{"post":{"security":[{"Bearer":[]}],"consumes":["multipart/form-data"],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Import Items","deprecated":true,"parameters":[{"type":"file","description":"Image to upload","name":"csv","in":"formData","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/items/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Get Item","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}}}},"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Update Item","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"description":"Item Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.ItemUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}}}},"delete":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Delete Item","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}},"patch":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Update Item","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"description":"Item Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.ItemPatch"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}}}}},"/v1/items/{id}/attachments":{"post":{"security":[{"Bearer":[]}],"consumes":["multipart/form-data"],"produces":["application/json"],"tags":["Items Attachments"],"summary":"Create Item Attachment","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"file","description":"File attachment","name":"file","in":"formData","required":true},{"type":"string","description":"Type of file","name":"type","in":"formData"},{"type":"boolean","description":"Is this the primary attachment","name":"primary","in":"formData"},{"type":"string","description":"name of the file including extension","name":"name","in":"formData","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/validate.ErrorResponse"}}}}},"/v1/items/{id}/attachments/{attachment_id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/octet-stream"],"tags":["Items Attachments"],"summary":"Get Item Attachment","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ItemAttachmentToken"}}}},"put":{"security":[{"Bearer":[]}],"tags":["Items Attachments"],"summary":"Update Item Attachment","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true},{"description":"Attachment Update","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.ItemAttachmentUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}}}},"delete":{"security":[{"Bearer":[]}],"tags":["Items Attachments"],"summary":"Delete Item Attachment","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/items/{id}/maintenance":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Item Maintenance"],"summary":"Get Maintenance Log","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"enum":["scheduled","completed","both"],"type":"string","x-enum-varnames":["MaintenanceFilterStatusScheduled","MaintenanceFilterStatusCompleted","MaintenanceFilterStatusBoth"],"name":"status","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.MaintenanceEntryWithDetails"}}}}},"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Item Maintenance"],"summary":"Create Maintenance Entry","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"description":"Entry Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.MaintenanceEntryCreate"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/repo.MaintenanceEntry"}}}}},"/v1/items/{id}/path":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Get the full path of an item","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.ItemPath"}}}}}},"/v1/labelmaker/assets/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"Get Asset label","parameters":[{"type":"string","description":"Asset ID","name":"id","in":"path","required":true},{"type":"boolean","description":"Print this label, defaults to false","name":"print","in":"query"}],"responses":{"200":{"description":"image/png","schema":{"type":"string"}}}}},"/v1/labelmaker/item/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"Get Item label","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"boolean","description":"Print this label, defaults to false","name":"print","in":"query"}],"responses":{"200":{"description":"image/png","schema":{"type":"string"}}}}},"/v1/labelmaker/location/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"Get Location label","parameters":[{"type":"string","description":"Location ID","name":"id","in":"path","required":true},{"type":"boolean","description":"Print this label, defaults to false","name":"print","in":"query"}],"responses":{"200":{"description":"image/png","schema":{"type":"string"}}}}},"/v1/labels":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Labels"],"summary":"Get All Labels","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.LabelOut"}}}}},"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Labels"],"summary":"Create Label","parameters":[{"description":"Label Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.LabelCreate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LabelSummary"}}}}},"/v1/labels/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Labels"],"summary":"Get Label","parameters":[{"type":"string","description":"Label ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LabelOut"}}}},"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Labels"],"summary":"Update Label","parameters":[{"type":"string","description":"Label ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LabelOut"}}}},"delete":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Labels"],"summary":"Delete Label","parameters":[{"type":"string","description":"Label ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/locations":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Get All Locations","deprecated":true,"parameters":[{"type":"boolean","description":"Filter locations with parents","name":"filterChildren","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.LocationOutCount"}}}}},"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Create Location","deprecated":true,"parameters":[{"description":"Location Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.LocationCreate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LocationSummary"}}}}},"/v1/locations/tree":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Get Locations Tree","deprecated":true,"parameters":[{"type":"boolean","description":"include items in response tree","name":"withItems","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.TreeItem"}}}}}},"/v1/locations/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Get Location","deprecated":true,"parameters":[{"type":"string","description":"Location ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LocationOut"}}}},"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Update Location","deprecated":true,"parameters":[{"type":"string","description":"Location ID","name":"id","in":"path","required":true},{"description":"Location Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.LocationUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LocationOut"}}}},"delete":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Delete Location","deprecated":true,"parameters":[{"type":"string","description":"Location ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/maintenance":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Maintenance"],"summary":"Query All Maintenance","parameters":[{"enum":["scheduled","completed","both"],"type":"string","x-enum-varnames":["MaintenanceFilterStatusScheduled","MaintenanceFilterStatusCompleted","MaintenanceFilterStatusBoth"],"name":"status","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.MaintenanceEntryWithDetails"}}}}}},"/v1/maintenance/{id}":{"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Maintenance"],"summary":"Update Maintenance Entry","parameters":[{"type":"string","description":"Maintenance ID","name":"id","in":"path","required":true},{"description":"Entry Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.MaintenanceEntryUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.MaintenanceEntry"}}}},"delete":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Maintenance"],"summary":"Delete Maintenance Entry","parameters":[{"type":"string","description":"Maintenance ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/notifiers":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Notifiers"],"summary":"Get Notifiers","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.NotifierOut"}}}}},"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Notifiers"],"summary":"Create Notifier","parameters":[{"description":"Notifier Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.NotifierCreate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.NotifierOut"}}}}},"/v1/notifiers/test":{"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Notifiers"],"summary":"Test Notifier","parameters":[{"type":"string","description":"URL","name":"url","in":"query","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/notifiers/{id}":{"put":{"security":[{"Bearer":[]}],"tags":["Notifiers"],"summary":"Update Notifier","parameters":[{"type":"string","description":"Notifier ID","name":"id","in":"path","required":true},{"description":"Notifier Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.NotifierUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.NotifierOut"}}}},"delete":{"security":[{"Bearer":[]}],"tags":["Notifiers"],"summary":"Delete a Notifier","parameters":[{"type":"string","description":"Notifier ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/products/search-from-barcode":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"Search EAN from Barcode","parameters":[{"type":"string","description":"barcode to be searched","name":"data","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.BarcodeProduct"}}}}}},"/v1/qrcode":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"Create QR Code","parameters":[{"type":"string","description":"data to be encoded into qrcode","name":"data","in":"query"}],"responses":{"200":{"description":"image/jpeg","schema":{"type":"string"}}}}},"/v1/reporting/bill-of-materials":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Reporting"],"summary":"Export Bill of Materials","responses":{"200":{"description":"text/csv","schema":{"type":"string"}}}}},"/v1/status":{"get":{"produces":["application/json"],"tags":["Base"],"summary":"Application Info","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.APISummary"}}}}},"/v1/users/change-password":{"put":{"security":[{"Bearer":[]}],"tags":["User"],"summary":"Change Password","parameters":[{"description":"Password Payload","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/v1.ChangePassword"}}],"responses":{"204":{"description":"No Content"}}}},"/v1/users/login":{"post":{"consumes":["application/x-www-form-urlencoded","application/json"],"produces":["application/json"],"tags":["Authentication"],"summary":"User Login","parameters":[{"description":"Login Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/v1.LoginForm"}},{"type":"string","description":"auth provider","name":"provider","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.TokenResponse"}}}}},"/v1/users/logout":{"post":{"security":[{"Bearer":[]}],"tags":["Authentication"],"summary":"User Logout","responses":{"204":{"description":"No Content"}}}},"/v1/users/refresh":{"get":{"security":[{"Bearer":[]}],"description":"handleAuthRefresh returns a handler that will issue a new token from an existing token.\nThis does not validate that the user still exists within the database.","tags":["Authentication"],"summary":"User Token Refresh","responses":{"200":{"description":"OK"}}}},"/v1/users/register":{"post":{"produces":["application/json"],"tags":["User"],"summary":"Register New User","parameters":[{"description":"User Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/services.UserRegistration"}}],"responses":{"204":{"description":"No Content"}}}},"/v1/users/self":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["User"],"summary":"Get User Self","responses":{"200":{"description":"OK","schema":{"allOf":[{"$ref":"#/definitions/v1.Wrapped"},{"type":"object","properties":{"item":{"$ref":"#/definitions/repo.UserOut"}}}]}}}},"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["User"],"summary":"Update Account","parameters":[{"description":"User Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.UserUpdate"}}],"responses":{"200":{"description":"OK","schema":{"allOf":[{"$ref":"#/definitions/v1.Wrapped"},{"type":"object","properties":{"item":{"$ref":"#/definitions/repo.UserUpdate"}}}]}}}},"delete":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["User"],"summary":"Delete Account","responses":{"204":{"description":"No Content"}}}}},"definitions":{"attachment.Type":{"type":"string","enum":["attachment","photo","manual","warranty","attachment","receipt","thumbnail"],"x-enum-varnames":["DefaultType","TypePhoto","TypeManual","TypeWarranty","TypeAttachment","TypeReceipt","TypeThumbnail"]},"authroles.Role":{"type":"string","enum":["user","admin","user","attachments"],"x-enum-varnames":["DefaultRole","RoleAdmin","RoleUser","RoleAttachments"]},"currencies.Currency":{"type":"object","properties":{"code":{"type":"string"},"local":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"}}},"ent.Attachment":{"type":"object","properties":{"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AttachmentQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.AttachmentEdges"}]},"id":{"description":"ID of the ent.","type":"string"},"mime_type":{"description":"MimeType holds the value of the \"mime_type\" field.","type":"string"},"path":{"description":"Path holds the value of the \"path\" field.","type":"string"},"primary":{"description":"Primary holds the value of the \"primary\" field.","type":"boolean"},"title":{"description":"Title holds the value of the \"title\" field.","type":"string"},"type":{"description":"Type holds the value of the \"type\" field.","allOf":[{"$ref":"#/definitions/attachment.Type"}]},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.AttachmentEdges":{"type":"object","properties":{"entity":{"description":"Entity holds the value of the entity edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]},"thumbnail":{"description":"Thumbnail holds the value of the thumbnail edge.","allOf":[{"$ref":"#/definitions/ent.Attachment"}]}}},"ent.AuthRoles":{"type":"object","properties":{"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AuthRolesQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.AuthRolesEdges"}]},"id":{"description":"ID of the ent.","type":"integer"},"role":{"description":"Role holds the value of the \"role\" field.","allOf":[{"$ref":"#/definitions/authroles.Role"}]}}},"ent.AuthRolesEdges":{"type":"object","properties":{"token":{"description":"Token holds the value of the token edge.","allOf":[{"$ref":"#/definitions/ent.AuthTokens"}]}}},"ent.AuthTokens":{"type":"object","properties":{"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AuthTokensQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.AuthTokensEdges"}]},"expires_at":{"description":"ExpiresAt holds the value of the \"expires_at\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"token":{"description":"Token holds the value of the \"token\" field.","type":"array","items":{"type":"integer"}},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.AuthTokensEdges":{"type":"object","properties":{"roles":{"description":"Roles holds the value of the roles edge.","allOf":[{"$ref":"#/definitions/ent.AuthRoles"}]},"user":{"description":"User holds the value of the user edge.","allOf":[{"$ref":"#/definitions/ent.User"}]}}},"ent.Entity":{"type":"object","properties":{"archived":{"description":"Archived holds the value of the \"archived\" field.","type":"boolean"},"asset_id":{"description":"AssetID holds the value of the \"asset_id\" field.","type":"integer"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"description":{"description":"Description holds the value of the \"description\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the EntityQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.EntityEdges"}]},"id":{"description":"ID of the ent.","type":"string"},"import_ref":{"description":"ImportRef holds the value of the \"import_ref\" field.","type":"string"},"insured":{"description":"Insured holds the value of the \"insured\" field.","type":"boolean"},"lifetime_warranty":{"description":"LifetimeWarranty holds the value of the \"lifetime_warranty\" field.","type":"boolean"},"manufacturer":{"description":"Manufacturer holds the value of the \"manufacturer\" field.","type":"string"},"model_number":{"description":"ModelNumber holds the value of the \"model_number\" field.","type":"string"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"notes":{"description":"Notes holds the value of the \"notes\" field.","type":"string"},"purchase_from":{"description":"PurchaseFrom holds the value of the \"purchase_from\" field.","type":"string"},"purchase_price":{"description":"PurchasePrice holds the value of the \"purchase_price\" field.","type":"number"},"purchase_time":{"description":"PurchaseTime holds the value of the \"purchase_time\" field.","type":"string"},"quantity":{"description":"Quantity holds the value of the \"quantity\" field.","type":"integer"},"serial_number":{"description":"SerialNumber holds the value of the \"serial_number\" field.","type":"string"},"sold_notes":{"description":"SoldNotes holds the value of the \"sold_notes\" field.","type":"string"},"sold_price":{"description":"SoldPrice holds the value of the \"sold_price\" field.","type":"number"},"sold_time":{"description":"SoldTime holds the value of the \"sold_time\" field.","type":"string"},"sold_to":{"description":"SoldTo holds the value of the \"sold_to\" field.","type":"string"},"sync_child_entities_locations":{"description":"SyncChildEntitiesLocations holds the value of the \"sync_child_entities_locations\" field.","type":"boolean"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"},"warranty_details":{"description":"WarrantyDetails holds the value of the \"warranty_details\" field.","type":"string"},"warranty_expires":{"description":"WarrantyExpires holds the value of the \"warranty_expires\" field.","type":"string"}}},"ent.EntityEdges":{"type":"object","properties":{"attachments":{"description":"Attachments holds the value of the attachments edge.","type":"array","items":{"$ref":"#/definitions/ent.Attachment"}},"children":{"description":"Children holds the value of the children edge.","type":"array","items":{"$ref":"#/definitions/ent.Entity"}},"entity":{"description":"Entity holds the value of the entity edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]},"fields":{"description":"Fields holds the value of the fields edge.","type":"array","items":{"$ref":"#/definitions/ent.EntityField"}},"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]},"label":{"description":"Label holds the value of the label edge.","type":"array","items":{"$ref":"#/definitions/ent.Label"}},"location":{"description":"Location holds the value of the location edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]},"maintenance_entries":{"description":"MaintenanceEntries holds the value of the maintenance_entries edge.","type":"array","items":{"$ref":"#/definitions/ent.MaintenanceEntry"}},"parent":{"description":"Parent holds the value of the parent edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]},"type":{"description":"Type holds the value of the type edge.","allOf":[{"$ref":"#/definitions/ent.EntityType"}]}}},"ent.EntityField":{"type":"object","properties":{"boolean_value":{"description":"BooleanValue holds the value of the \"boolean_value\" field.","type":"boolean"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"description":{"description":"Description holds the value of the \"description\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the EntityFieldQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.EntityFieldEdges"}]},"id":{"description":"ID of the ent.","type":"string"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"number_value":{"description":"NumberValue holds the value of the \"number_value\" field.","type":"integer"},"text_value":{"description":"TextValue holds the value of the \"text_value\" field.","type":"string"},"time_value":{"description":"TimeValue holds the value of the \"time_value\" field.","type":"string"},"type":{"description":"Type holds the value of the \"type\" field.","allOf":[{"$ref":"#/definitions/entityfield.Type"}]},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.EntityFieldEdges":{"type":"object","properties":{"entity":{"description":"Entity holds the value of the entity edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]}}},"ent.EntityType":{"type":"object","properties":{"color":{"description":"Color holds the value of the \"color\" field.","type":"string"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"description":{"description":"Description holds the value of the \"description\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the EntityTypeQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.EntityTypeEdges"}]},"icon":{"description":"Icon holds the value of the \"icon\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"is_location":{"description":"IsLocation holds the value of the \"is_location\" field.","type":"boolean"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.EntityTypeEdges":{"type":"object","properties":{"entities":{"description":"Entities holds the value of the entities edge.","type":"array","items":{"$ref":"#/definitions/ent.Entity"}},"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]}}},"ent.Group":{"type":"object","properties":{"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"currency":{"description":"Currency holds the value of the \"currency\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the GroupQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.GroupEdges"}]},"id":{"description":"ID of the ent.","type":"string"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.GroupEdges":{"type":"object","properties":{"entities":{"description":"Entities holds the value of the entities edge.","type":"array","items":{"$ref":"#/definitions/ent.Entity"}},"entity_types":{"description":"EntityTypes holds the value of the entity_types edge.","type":"array","items":{"$ref":"#/definitions/ent.EntityType"}},"invitation_tokens":{"description":"InvitationTokens holds the value of the invitation_tokens edge.","type":"array","items":{"$ref":"#/definitions/ent.GroupInvitationToken"}},"labels":{"description":"Labels holds the value of the labels edge.","type":"array","items":{"$ref":"#/definitions/ent.Label"}},"notifiers":{"description":"Notifiers holds the value of the notifiers edge.","type":"array","items":{"$ref":"#/definitions/ent.Notifier"}},"users":{"description":"Users holds the value of the users edge.","type":"array","items":{"$ref":"#/definitions/ent.User"}}}},"ent.GroupInvitationToken":{"type":"object","properties":{"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the GroupInvitationTokenQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.GroupInvitationTokenEdges"}]},"expires_at":{"description":"ExpiresAt holds the value of the \"expires_at\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"token":{"description":"Token holds the value of the \"token\" field.","type":"array","items":{"type":"integer"}},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"},"uses":{"description":"Uses holds the value of the \"uses\" field.","type":"integer"}}},"ent.GroupInvitationTokenEdges":{"type":"object","properties":{"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]}}},"ent.Label":{"type":"object","properties":{"color":{"description":"Color holds the value of the \"color\" field.","type":"string"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"description":{"description":"Description holds the value of the \"description\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the LabelQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.LabelEdges"}]},"id":{"description":"ID of the ent.","type":"string"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.LabelEdges":{"type":"object","properties":{"entities":{"description":"Entities holds the value of the entities edge.","type":"array","items":{"$ref":"#/definitions/ent.Entity"}},"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]}}},"ent.MaintenanceEntry":{"type":"object","properties":{"cost":{"description":"Cost holds the value of the \"cost\" field.","type":"number"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"date":{"description":"Date holds the value of the \"date\" field.","type":"string"},"description":{"description":"Description holds the value of the \"description\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the MaintenanceEntryQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.MaintenanceEntryEdges"}]},"entity_id":{"description":"EntityID holds the value of the \"entity_id\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"scheduled_date":{"description":"ScheduledDate holds the value of the \"scheduled_date\" field.","type":"string"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.MaintenanceEntryEdges":{"type":"object","properties":{"entity":{"description":"Entity holds the value of the entity edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]}}},"ent.Notifier":{"type":"object","properties":{"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the NotifierQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.NotifierEdges"}]},"group_id":{"description":"GroupID holds the value of the \"group_id\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"is_active":{"description":"IsActive holds the value of the \"is_active\" field.","type":"boolean"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"},"user_id":{"description":"UserID holds the value of the \"user_id\" field.","type":"string"}}},"ent.NotifierEdges":{"type":"object","properties":{"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]},"user":{"description":"User holds the value of the user edge.","allOf":[{"$ref":"#/definitions/ent.User"}]}}},"ent.User":{"type":"object","properties":{"activated_on":{"description":"ActivatedOn holds the value of the \"activated_on\" field.","type":"string"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the UserQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.UserEdges"}]},"email":{"description":"Email holds the value of the \"email\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"is_superuser":{"description":"IsSuperuser holds the value of the \"is_superuser\" field.","type":"boolean"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"role":{"description":"Role holds the value of the \"role\" field.","allOf":[{"$ref":"#/definitions/user.Role"}]},"superuser":{"description":"Superuser holds the value of the \"superuser\" field.","type":"boolean"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.UserEdges":{"type":"object","properties":{"auth_tokens":{"description":"AuthTokens holds the value of the auth_tokens edge.","type":"array","items":{"$ref":"#/definitions/ent.AuthTokens"}},"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]},"notifiers":{"description":"Notifiers holds the value of the notifiers edge.","type":"array","items":{"$ref":"#/definitions/ent.Notifier"}}}},"entityfield.Type":{"type":"string","enum":["text","number","boolean","time"],"x-enum-varnames":["TypeText","TypeNumber","TypeBoolean","TypeTime"]},"repo.BarcodeProduct":{"type":"object","properties":{"barcode":{"type":"string"},"imageBase64":{"type":"string"},"imageURL":{"type":"string"},"item":{"$ref":"#/definitions/repo.ItemCreate"},"manufacturer":{"type":"string"},"modelNumber":{"description":"Identifications","type":"string"},"notes":{"description":"Extras","type":"string"},"search_engine_name":{"type":"string"}}},"repo.Group":{"type":"object","properties":{"createdAt":{"type":"string"},"currency":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.GroupStatistics":{"type":"object","properties":{"totalItemPrice":{"type":"number"},"totalItems":{"type":"integer"},"totalLabels":{"type":"integer"},"totalLocations":{"type":"integer"},"totalUsers":{"type":"integer"},"totalWithWarranty":{"type":"integer"}}},"repo.GroupUpdate":{"type":"object","properties":{"currency":{"type":"string"},"name":{"type":"string"}}},"repo.ItemAttachment":{"type":"object","properties":{"createdAt":{"type":"string"},"id":{"type":"string"},"mimeType":{"type":"string"},"path":{"type":"string"},"primary":{"type":"boolean"},"thumbnail":{"$ref":"#/definitions/ent.Attachment"},"title":{"type":"string"},"type":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.ItemAttachmentUpdate":{"type":"object","properties":{"primary":{"type":"boolean"},"title":{"type":"string"},"type":{"type":"string"}}},"repo.ItemCreate":{"type":"object","required":["name"],"properties":{"description":{"type":"string","maxLength":1000},"labelIds":{"type":"array","items":{"type":"string"}},"locationId":{"description":"Edges","type":"string"},"name":{"type":"string","maxLength":255,"minLength":1},"parentId":{"type":"string","x-nullable":true},"quantity":{"type":"integer"}}},"repo.ItemField":{"type":"object","properties":{"booleanValue":{"type":"boolean"},"id":{"type":"string"},"name":{"type":"string"},"numberValue":{"type":"integer"},"textValue":{"type":"string"},"type":{"type":"string"}}},"repo.ItemOut":{"type":"object","properties":{"archived":{"type":"boolean"},"assetId":{"type":"string","example":"0"},"attachments":{"type":"array","items":{"$ref":"#/definitions/repo.ItemAttachment"}},"createdAt":{"type":"string"},"description":{"type":"string"},"fields":{"type":"array","items":{"$ref":"#/definitions/repo.ItemField"}},"id":{"type":"string"},"imageId":{"type":"string","x-nullable":true,"x-omitempty":true},"insured":{"type":"boolean"},"labels":{"type":"array","items":{"$ref":"#/definitions/repo.LabelSummary"}},"lifetimeWarranty":{"description":"Warranty","type":"boolean"},"location":{"description":"Edges","allOf":[{"$ref":"#/definitions/repo.LocationSummary"}],"x-nullable":true,"x-omitempty":true},"manufacturer":{"type":"string"},"modelNumber":{"type":"string"},"name":{"type":"string"},"notes":{"description":"Extras","type":"string"},"parent":{"allOf":[{"$ref":"#/definitions/repo.ItemSummary"}],"x-nullable":true,"x-omitempty":true},"purchaseFrom":{"type":"string"},"purchasePrice":{"type":"number"},"purchaseTime":{"description":"Purchase","type":"string"},"quantity":{"type":"integer"},"serialNumber":{"type":"string"},"soldNotes":{"type":"string"},"soldPrice":{"type":"number"},"soldTime":{"description":"Sold","type":"string"},"soldTo":{"type":"string"},"syncChildItemsLocations":{"type":"boolean"},"thumbnailId":{"type":"string","x-nullable":true,"x-omitempty":true},"updatedAt":{"type":"string"},"warrantyDetails":{"type":"string"},"warrantyExpires":{"type":"string"}}},"repo.ItemPatch":{"type":"object","properties":{"id":{"type":"string"},"quantity":{"type":"integer","x-nullable":true,"x-omitempty":true}}},"repo.ItemPath":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"$ref":"#/definitions/repo.ItemType"}}},"repo.ItemSummary":{"type":"object","properties":{"archived":{"type":"boolean"},"assetId":{"type":"string","example":"0"},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"imageId":{"type":"string","x-nullable":true,"x-omitempty":true},"insured":{"type":"boolean"},"labels":{"type":"array","items":{"$ref":"#/definitions/repo.LabelSummary"}},"location":{"description":"Edges","allOf":[{"$ref":"#/definitions/repo.LocationSummary"}],"x-nullable":true,"x-omitempty":true},"name":{"type":"string"},"purchasePrice":{"type":"number"},"quantity":{"type":"integer"},"soldTime":{"description":"Sale details","type":"string"},"thumbnailId":{"type":"string","x-nullable":true,"x-omitempty":true},"updatedAt":{"type":"string"}}},"repo.ItemType":{"type":"string","enum":["location","item"],"x-enum-varnames":["ItemTypeLocation","ItemTypeItem"]},"repo.ItemUpdate":{"type":"object","required":["name"],"properties":{"archived":{"type":"boolean"},"assetId":{"type":"string"},"description":{"type":"string","maxLength":1000},"fields":{"type":"array","items":{"$ref":"#/definitions/repo.ItemField"}},"id":{"type":"string"},"insured":{"type":"boolean"},"labelIds":{"type":"array","items":{"type":"string"}},"lifetimeWarranty":{"description":"Warranty","type":"boolean"},"locationId":{"description":"Edges","type":"string"},"manufacturer":{"type":"string"},"modelNumber":{"type":"string"},"name":{"type":"string","maxLength":255,"minLength":1},"notes":{"description":"Extras","type":"string"},"parentId":{"type":"string","x-nullable":true,"x-omitempty":true},"purchaseFrom":{"type":"string","maxLength":255},"purchasePrice":{"type":"number","x-nullable":true,"x-omitempty":true},"purchaseTime":{"description":"Purchase","type":"string"},"quantity":{"type":"integer"},"serialNumber":{"description":"Identifications","type":"string"},"soldNotes":{"type":"string"},"soldPrice":{"type":"number","x-nullable":true,"x-omitempty":true},"soldTime":{"description":"Sold","type":"string"},"soldTo":{"type":"string","maxLength":255},"syncChildItemsLocations":{"type":"boolean"},"warrantyDetails":{"type":"string"},"warrantyExpires":{"type":"string"}}},"repo.LabelCreate":{"type":"object","required":["name"],"properties":{"color":{"type":"string"},"description":{"type":"string","maxLength":255},"name":{"type":"string","maxLength":255,"minLength":1}}},"repo.LabelOut":{"type":"object","properties":{"color":{"type":"string"},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.LabelSummary":{"type":"object","properties":{"color":{"type":"string"},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.LocationCreate":{"type":"object","properties":{"description":{"type":"string"},"name":{"type":"string"},"parentId":{"type":"string","x-nullable":true}}},"repo.LocationOut":{"type":"object","properties":{"children":{"type":"array","items":{"$ref":"#/definitions/repo.LocationSummary"}},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"parent":{"$ref":"#/definitions/repo.LocationSummary"},"totalPrice":{"type":"number"},"updatedAt":{"type":"string"}}},"repo.LocationOutCount":{"type":"object","properties":{"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"itemCount":{"type":"integer"},"name":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.LocationSummary":{"type":"object","properties":{"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.LocationUpdate":{"type":"object","properties":{"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"parentId":{"type":"string","x-nullable":true}}},"repo.MaintenanceEntry":{"type":"object","properties":{"completedDate":{"type":"string"},"cost":{"type":"string","example":"0"},"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"scheduledDate":{"type":"string"}}},"repo.MaintenanceEntryCreate":{"type":"object","required":["name"],"properties":{"completedDate":{"type":"string"},"cost":{"type":"string","example":"0"},"description":{"type":"string"},"name":{"type":"string"},"scheduledDate":{"type":"string"}}},"repo.MaintenanceEntryUpdate":{"type":"object","properties":{"completedDate":{"type":"string"},"cost":{"type":"string","example":"0"},"description":{"type":"string"},"name":{"type":"string"},"scheduledDate":{"type":"string"}}},"repo.MaintenanceEntryWithDetails":{"type":"object","properties":{"completedDate":{"type":"string"},"cost":{"type":"string","example":"0"},"description":{"type":"string"},"id":{"type":"string"},"itemID":{"type":"string"},"itemName":{"type":"string"},"name":{"type":"string"},"scheduledDate":{"type":"string"}}},"repo.MaintenanceFilterStatus":{"type":"string","enum":["scheduled","completed","both"],"x-enum-varnames":["MaintenanceFilterStatusScheduled","MaintenanceFilterStatusCompleted","MaintenanceFilterStatusBoth"]},"repo.NotifierCreate":{"type":"object","required":["name","url"],"properties":{"isActive":{"type":"boolean"},"name":{"type":"string","maxLength":255,"minLength":1},"url":{"type":"string"}}},"repo.NotifierOut":{"type":"object","properties":{"createdAt":{"type":"string"},"groupId":{"type":"string"},"id":{"type":"string"},"isActive":{"type":"boolean"},"name":{"type":"string"},"updatedAt":{"type":"string"},"url":{"type":"string"},"userId":{"type":"string"}}},"repo.NotifierUpdate":{"type":"object","required":["name"],"properties":{"isActive":{"type":"boolean"},"name":{"type":"string","maxLength":255,"minLength":1},"url":{"type":"string","x-nullable":true}}},"repo.PaginationResult-repo_ItemSummary":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/definitions/repo.ItemSummary"}},"page":{"type":"integer"},"pageSize":{"type":"integer"},"total":{"type":"integer"}}},"repo.TotalsByOrganizer":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"total":{"type":"number"}}},"repo.TreeItem":{"type":"object","properties":{"children":{"type":"array","items":{"$ref":"#/definitions/repo.TreeItem"}},"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"}}},"repo.UserOut":{"type":"object","properties":{"email":{"type":"string"},"groupId":{"type":"string"},"groupName":{"type":"string"},"id":{"type":"string"},"isOwner":{"type":"boolean"},"isSuperuser":{"type":"boolean"},"name":{"type":"string"}}},"repo.UserUpdate":{"type":"object","properties":{"email":{"type":"string"},"name":{"type":"string"}}},"repo.ValueOverTime":{"type":"object","properties":{"end":{"type":"string"},"entries":{"type":"array","items":{"$ref":"#/definitions/repo.ValueOverTimeEntry"}},"start":{"type":"string"},"valueAtEnd":{"type":"number"},"valueAtStart":{"type":"number"}}},"repo.ValueOverTimeEntry":{"type":"object","properties":{"date":{"type":"string"},"name":{"type":"string"},"value":{"type":"number"}}},"services.Latest":{"type":"object","properties":{"date":{"type":"string"},"version":{"type":"string"}}},"services.UserRegistration":{"type":"object","properties":{"email":{"type":"string"},"name":{"type":"string"},"password":{"type":"string"},"token":{"type":"string"}}},"user.Role":{"type":"string","enum":["user","user","owner"],"x-enum-varnames":["DefaultRole","RoleUser","RoleOwner"]},"v1.APISummary":{"type":"object","properties":{"allowRegistration":{"type":"boolean"},"build":{"$ref":"#/definitions/v1.Build"},"demo":{"type":"boolean"},"health":{"type":"boolean"},"labelPrinting":{"type":"boolean"},"latest":{"$ref":"#/definitions/services.Latest"},"message":{"type":"string"},"title":{"type":"string"},"versions":{"type":"array","items":{"type":"string"}}}},"v1.ActionAmountResult":{"type":"object","properties":{"completed":{"type":"integer"}}},"v1.Build":{"type":"object","properties":{"buildTime":{"type":"string"},"commit":{"type":"string"},"version":{"type":"string"}}},"v1.ChangePassword":{"type":"object","properties":{"current":{"type":"string"},"new":{"type":"string"}}},"v1.GroupInvitation":{"type":"object","properties":{"expiresAt":{"type":"string"},"token":{"type":"string"},"uses":{"type":"integer"}}},"v1.GroupInvitationCreate":{"type":"object","required":["uses"],"properties":{"expiresAt":{"type":"string"},"uses":{"type":"integer","maximum":100,"minimum":1}}},"v1.ItemAttachmentToken":{"type":"object","properties":{"token":{"type":"string"}}},"v1.LoginForm":{"type":"object","properties":{"password":{"type":"string","example":"admin"},"stayLoggedIn":{"type":"boolean"},"username":{"type":"string","example":"admin@admin.com"}}},"v1.TokenResponse":{"type":"object","properties":{"attachmentToken":{"type":"string"},"expiresAt":{"type":"string"},"token":{"type":"string"}}},"v1.Wrapped":{"type":"object","properties":{"item":{}}},"validate.ErrorResponse":{"type":"object","properties":{"error":{"type":"string"},"fields":{"type":"string"}}}},"securityDefinitions":{"Bearer":{"description":"\"Type 'Bearer TOKEN' to correctly set the API Key\"","type":"apiKey","name":"Authorization","in":"header"}}} \ No newline at end of file +{ + "schemes": [ + "https", + "http" + ], + "swagger": "2.0", + "info": { + "description": "Track, Manage, and Organize your Things.", + "title": "Homebox API", + "contact": { + "name": "Homebox Team", + "url": "https://discord.homebox.software" + }, + "version": "1.0" + }, + "host": "demo.homebox.software", + "basePath": "/api", + "paths": { + "/v1/actions/create-missing-thumbnails": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Creates thumbnails for items that are missing them", + "produces": [ + "application/json" + ], + "tags": [ + "Actions" + ], + "summary": "Create Missing Thumbnails", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ActionAmountResult" + } + } + } + } + }, + "/v1/actions/ensure-asset-ids": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Ensures all items in the database have an asset ID", + "produces": [ + "application/json" + ], + "tags": [ + "Actions" + ], + "summary": "Ensure Asset IDs", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ActionAmountResult" + } + } + } + } + }, + "/v1/actions/ensure-import-refs": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Ensures all items in the database have an import ref", + "produces": [ + "application/json" + ], + "tags": [ + "Actions" + ], + "summary": "Ensures Import Refs", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ActionAmountResult" + } + } + } + } + }, + "/v1/actions/set-primary-photos": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Sets the first photo of each item as the primary photo", + "produces": [ + "application/json" + ], + "tags": [ + "Actions" + ], + "summary": "Set Primary Photos", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ActionAmountResult" + } + } + } + } + }, + "/v1/actions/zero-item-time-fields": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Resets all item date fields to the beginning of the day", + "produces": [ + "application/json" + ], + "tags": [ + "Actions" + ], + "summary": "Zero Out Time Fields", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ActionAmountResult" + } + } + } + } + }, + "/v1/assets/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get Item by Asset ID", + "parameters": [ + { + "type": "string", + "description": "Asset ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.PaginationResult-repo_ItemSummary" + } + } + } + } + }, + "/v1/currency": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Base" + ], + "summary": "Currency", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/currencies.Currency" + } + } + } + } + }, + "/v1/groups": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Group" + ], + "summary": "Get Group", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.Group" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Group" + ], + "summary": "Update Group", + "parameters": [ + { + "description": "User Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.GroupUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.Group" + } + } + } + } + }, + "/v1/groups/invitations": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Group" + ], + "summary": "Create Group Invitation", + "parameters": [ + { + "description": "User Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1.GroupInvitationCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.GroupInvitation" + } + } + } + } + }, + "/v1/groups/statistics": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Statistics" + ], + "summary": "Get Group Statistics", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.GroupStatistics" + } + } + } + } + }, + "/v1/groups/statistics/labels": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Statistics" + ], + "summary": "Get Label Statistics", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.TotalsByOrganizer" + } + } + } + } + } + }, + "/v1/groups/statistics/locations": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Statistics" + ], + "summary": "Get Location Statistics", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.TotalsByOrganizer" + } + } + } + } + } + }, + "/v1/groups/statistics/purchase-price": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Statistics" + ], + "summary": "Get Purchase Price Statistics", + "parameters": [ + { + "type": "string", + "description": "start date", + "name": "start", + "in": "query" + }, + { + "type": "string", + "description": "end date", + "name": "end", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ValueOverTime" + } + } + } + } + }, + "/v1/items": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Query All Items", + "parameters": [ + { + "type": "string", + "description": "search string", + "name": "q", + "in": "query" + }, + { + "type": "integer", + "description": "page number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "items per page", + "name": "pageSize", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi", + "description": "label Ids", + "name": "labels", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi", + "description": "location Ids", + "name": "locations", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi", + "description": "parent Ids", + "name": "parentIds", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.PaginationResult-repo_ItemSummary" + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Create Item", + "parameters": [ + { + "description": "Item Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.ItemCreate" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/repo.ItemSummary" + } + } + } + } + }, + "/v1/items/export": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Items" + ], + "summary": "Export Items", + "responses": { + "200": { + "description": "text/csv", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/items/fields": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get All Custom Field Names", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/v1/items/fields/values": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get All Custom Field Values", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/v1/items/import": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Import Items", + "parameters": [ + { + "type": "file", + "description": "Image to upload", + "name": "csv", + "in": "formData", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/items/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get Item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Update Item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Item Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.ItemUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Delete Item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + }, + "patch": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Update Item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Item Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.ItemPatch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + } + } + } + }, + "/v1/items/{id}/attachments": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items Attachments" + ], + "summary": "Create Item Attachment", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "file", + "description": "File attachment", + "name": "file", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "Type of file", + "name": "type", + "in": "formData" + }, + { + "type": "boolean", + "description": "Is this the primary attachment", + "name": "primary", + "in": "formData" + }, + { + "type": "string", + "description": "name of the file including extension", + "name": "name", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + }, + "422": { + "description": "Unprocessable Entity", + "schema": { + "$ref": "#/definitions/validate.ErrorResponse" + } + } + } + } + }, + "/v1/items/{id}/attachments/{attachment_id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/octet-stream" + ], + "tags": [ + "Items Attachments" + ], + "summary": "Get Item Attachment", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Attachment ID", + "name": "attachment_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ItemAttachmentToken" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Items Attachments" + ], + "summary": "Update Item Attachment", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Attachment ID", + "name": "attachment_id", + "in": "path", + "required": true + }, + { + "description": "Attachment Update", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.ItemAttachmentUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Items Attachments" + ], + "summary": "Delete Item Attachment", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Attachment ID", + "name": "attachment_id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/items/{id}/duplicate": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Duplicate Item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Duplicate Options", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.DuplicateOptions" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + } + } + } + }, + "/v1/items/{id}/maintenance": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Item Maintenance" + ], + "summary": "Get Maintenance Log", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "enum": [ + "scheduled", + "completed", + "both" + ], + "type": "string", + "x-enum-varnames": [ + "MaintenanceFilterStatusScheduled", + "MaintenanceFilterStatusCompleted", + "MaintenanceFilterStatusBoth" + ], + "name": "status", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.MaintenanceEntryWithDetails" + } + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Item Maintenance" + ], + "summary": "Create Maintenance Entry", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Entry Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.MaintenanceEntryCreate" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/repo.MaintenanceEntry" + } + } + } + } + }, + "/v1/items/{id}/path": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get the full path of an item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ItemPath" + } + } + } + } + } + }, + "/v1/labelmaker/assets/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get Asset label", + "parameters": [ + { + "type": "string", + "description": "Asset ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "boolean", + "description": "Print this label, defaults to false", + "name": "print", + "in": "query" + } + ], + "responses": { + "200": { + "description": "image/png", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/labelmaker/item/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get Item label", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "boolean", + "description": "Print this label, defaults to false", + "name": "print", + "in": "query" + } + ], + "responses": { + "200": { + "description": "image/png", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/labelmaker/location/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Get Location label", + "parameters": [ + { + "type": "string", + "description": "Location ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "boolean", + "description": "Print this label, defaults to false", + "name": "print", + "in": "query" + } + ], + "responses": { + "200": { + "description": "image/png", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/labels": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Labels" + ], + "summary": "Get All Labels", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.LabelOut" + } + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Labels" + ], + "summary": "Create Label", + "parameters": [ + { + "description": "Label Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.LabelCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LabelSummary" + } + } + } + } + }, + "/v1/labels/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Labels" + ], + "summary": "Get Label", + "parameters": [ + { + "type": "string", + "description": "Label ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LabelOut" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Labels" + ], + "summary": "Update Label", + "parameters": [ + { + "type": "string", + "description": "Label ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LabelOut" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Labels" + ], + "summary": "Delete Label", + "parameters": [ + { + "type": "string", + "description": "Label ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/locations": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Get All Locations", + "parameters": [ + { + "type": "boolean", + "description": "Filter locations with parents", + "name": "filterChildren", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.LocationOutCount" + } + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Create Location", + "parameters": [ + { + "description": "Location Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.LocationCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LocationSummary" + } + } + } + } + }, + "/v1/locations/tree": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Get Locations Tree", + "parameters": [ + { + "type": "boolean", + "description": "include items in response tree", + "name": "withItems", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.TreeItem" + } + } + } + } + } + }, + "/v1/locations/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Get Location", + "parameters": [ + { + "type": "string", + "description": "Location ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LocationOut" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Update Location", + "parameters": [ + { + "type": "string", + "description": "Location ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Location Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.LocationUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LocationOut" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Delete Location", + "parameters": [ + { + "type": "string", + "description": "Location ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/maintenance": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Maintenance" + ], + "summary": "Query All Maintenance", + "parameters": [ + { + "enum": [ + "scheduled", + "completed", + "both" + ], + "type": "string", + "x-enum-varnames": [ + "MaintenanceFilterStatusScheduled", + "MaintenanceFilterStatusCompleted", + "MaintenanceFilterStatusBoth" + ], + "name": "status", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.MaintenanceEntryWithDetails" + } + } + } + } + } + }, + "/v1/maintenance/{id}": { + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Maintenance" + ], + "summary": "Update Maintenance Entry", + "parameters": [ + { + "type": "string", + "description": "Maintenance ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Entry Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.MaintenanceEntryUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.MaintenanceEntry" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Maintenance" + ], + "summary": "Delete Maintenance Entry", + "parameters": [ + { + "type": "string", + "description": "Maintenance ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/notifiers": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Notifiers" + ], + "summary": "Get Notifiers", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.NotifierOut" + } + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Notifiers" + ], + "summary": "Create Notifier", + "parameters": [ + { + "description": "Notifier Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.NotifierCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.NotifierOut" + } + } + } + } + }, + "/v1/notifiers/test": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Notifiers" + ], + "summary": "Test Notifier", + "parameters": [ + { + "type": "string", + "description": "URL", + "name": "url", + "in": "query", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/notifiers/{id}": { + "put": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Notifiers" + ], + "summary": "Update Notifier", + "parameters": [ + { + "type": "string", + "description": "Notifier ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Notifier Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.NotifierUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.NotifierOut" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Notifiers" + ], + "summary": "Delete a Notifier", + "parameters": [ + { + "type": "string", + "description": "Notifier ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/products/search-from-barcode": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Search EAN from Barcode", + "parameters": [ + { + "type": "string", + "description": "barcode to be searched", + "name": "data", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.BarcodeProduct" + } + } + } + } + } + }, + "/v1/qrcode": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Create QR Code", + "parameters": [ + { + "type": "string", + "description": "data to be encoded into qrcode", + "name": "data", + "in": "query" + } + ], + "responses": { + "200": { + "description": "image/jpeg", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/reporting/bill-of-materials": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Reporting" + ], + "summary": "Export Bill of Materials", + "responses": { + "200": { + "description": "text/csv", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/status": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Base" + ], + "summary": "Application Info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.APISummary" + } + } + } + } + }, + "/v1/users/change-password": { + "put": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "User" + ], + "summary": "Change Password", + "parameters": [ + { + "description": "Password Payload", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1.ChangePassword" + } + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/users/login": { + "post": { + "consumes": [ + "application/x-www-form-urlencoded", + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Authentication" + ], + "summary": "User Login", + "parameters": [ + { + "description": "Login Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1.LoginForm" + } + }, + { + "type": "string", + "description": "auth provider", + "name": "provider", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.TokenResponse" + } + } + } + } + }, + "/v1/users/logout": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Authentication" + ], + "summary": "User Logout", + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/users/refresh": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "handleAuthRefresh returns a handler that will issue a new token from an existing token.\nThis does not validate that the user still exists within the database.", + "tags": [ + "Authentication" + ], + "summary": "User Token Refresh", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/v1/users/register": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "summary": "Register New User", + "parameters": [ + { + "description": "User Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/services.UserRegistration" + } + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/users/self": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "summary": "Get User Self", + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/v1.Wrapped" + }, + { + "type": "object", + "properties": { + "item": { + "$ref": "#/definitions/repo.UserOut" + } + } + } + ] + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "summary": "Update Account", + "parameters": [ + { + "description": "User Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.UserUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/v1.Wrapped" + }, + { + "type": "object", + "properties": { + "item": { + "$ref": "#/definitions/repo.UserUpdate" + } + } + } + ] + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "summary": "Delete Account", + "responses": { + "204": { + "description": "No Content" + } + } + } + } + }, + "definitions": { + "attachment.Type": { + "type": "string", + "enum": [ + "attachment", + "photo", + "manual", + "warranty", + "attachment", + "receipt", + "thumbnail" + ], + "x-enum-varnames": [ + "DefaultType", + "TypePhoto", + "TypeManual", + "TypeWarranty", + "TypeAttachment", + "TypeReceipt", + "TypeThumbnail" + ] + }, + "authroles.Role": { + "type": "string", + "enum": [ + "user", + "admin", + "user", + "attachments" + ], + "x-enum-varnames": [ + "DefaultRole", + "RoleAdmin", + "RoleUser", + "RoleAttachments" + ] + }, + "currencies.Currency": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "local": { + "type": "string" + }, + "name": { + "type": "string" + }, + "symbol": { + "type": "string" + } + } + }, + "ent.Attachment": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AttachmentQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.AttachmentEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "mime_type": { + "description": "MimeType holds the value of the \"mime_type\" field.", + "type": "string" + }, + "path": { + "description": "Path holds the value of the \"path\" field.", + "type": "string" + }, + "primary": { + "description": "Primary holds the value of the \"primary\" field.", + "type": "boolean" + }, + "title": { + "description": "Title holds the value of the \"title\" field.", + "type": "string" + }, + "type": { + "description": "Type holds the value of the \"type\" field.", + "allOf": [ + { + "$ref": "#/definitions/attachment.Type" + } + ] + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.AttachmentEdges": { + "type": "object", + "properties": { + "item": { + "description": "Item holds the value of the item edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Item" + } + ] + }, + "thumbnail": { + "description": "Thumbnail holds the value of the thumbnail edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Attachment" + } + ] + } + } + }, + "ent.AuthRoles": { + "type": "object", + "properties": { + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AuthRolesQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.AuthRolesEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "integer" + }, + "role": { + "description": "Role holds the value of the \"role\" field.", + "allOf": [ + { + "$ref": "#/definitions/authroles.Role" + } + ] + } + } + }, + "ent.AuthRolesEdges": { + "type": "object", + "properties": { + "token": { + "description": "Token holds the value of the token edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.AuthTokens" + } + ] + } + } + }, + "ent.AuthTokens": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AuthTokensQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.AuthTokensEdges" + } + ] + }, + "expires_at": { + "description": "ExpiresAt holds the value of the \"expires_at\" field.", + "type": "string" + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "token": { + "description": "Token holds the value of the \"token\" field.", + "type": "array", + "items": { + "type": "integer" + } + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.AuthTokensEdges": { + "type": "object", + "properties": { + "roles": { + "description": "Roles holds the value of the roles edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.AuthRoles" + } + ] + }, + "user": { + "description": "User holds the value of the user edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.User" + } + ] + } + } + }, + "ent.Group": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "currency": { + "description": "Currency holds the value of the \"currency\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the GroupQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.GroupEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.GroupEdges": { + "type": "object", + "properties": { + "invitation_tokens": { + "description": "InvitationTokens holds the value of the invitation_tokens edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.GroupInvitationToken" + } + }, + "items": { + "description": "Items holds the value of the items edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Item" + } + }, + "labels": { + "description": "Labels holds the value of the labels edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Label" + } + }, + "locations": { + "description": "Locations holds the value of the locations edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Location" + } + }, + "notifiers": { + "description": "Notifiers holds the value of the notifiers edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Notifier" + } + }, + "users": { + "description": "Users holds the value of the users edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.User" + } + } + } + }, + "ent.GroupInvitationToken": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the GroupInvitationTokenQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.GroupInvitationTokenEdges" + } + ] + }, + "expires_at": { + "description": "ExpiresAt holds the value of the \"expires_at\" field.", + "type": "string" + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "token": { + "description": "Token holds the value of the \"token\" field.", + "type": "array", + "items": { + "type": "integer" + } + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + }, + "uses": { + "description": "Uses holds the value of the \"uses\" field.", + "type": "integer" + } + } + }, + "ent.GroupInvitationTokenEdges": { + "type": "object", + "properties": { + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + } + } + }, + "ent.Item": { + "type": "object", + "properties": { + "archived": { + "description": "Archived holds the value of the \"archived\" field.", + "type": "boolean" + }, + "asset_id": { + "description": "AssetID holds the value of the \"asset_id\" field.", + "type": "integer" + }, + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "description": { + "description": "Description holds the value of the \"description\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the ItemQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.ItemEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "import_ref": { + "description": "ImportRef holds the value of the \"import_ref\" field.", + "type": "string" + }, + "insured": { + "description": "Insured holds the value of the \"insured\" field.", + "type": "boolean" + }, + "lifetime_warranty": { + "description": "LifetimeWarranty holds the value of the \"lifetime_warranty\" field.", + "type": "boolean" + }, + "manufacturer": { + "description": "Manufacturer holds the value of the \"manufacturer\" field.", + "type": "string" + }, + "model_number": { + "description": "ModelNumber holds the value of the \"model_number\" field.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "notes": { + "description": "Notes holds the value of the \"notes\" field.", + "type": "string" + }, + "purchase_from": { + "description": "PurchaseFrom holds the value of the \"purchase_from\" field.", + "type": "string" + }, + "purchase_price": { + "description": "PurchasePrice holds the value of the \"purchase_price\" field.", + "type": "number" + }, + "purchase_time": { + "description": "PurchaseTime holds the value of the \"purchase_time\" field.", + "type": "string" + }, + "quantity": { + "description": "Quantity holds the value of the \"quantity\" field.", + "type": "integer" + }, + "serial_number": { + "description": "SerialNumber holds the value of the \"serial_number\" field.", + "type": "string" + }, + "sold_notes": { + "description": "SoldNotes holds the value of the \"sold_notes\" field.", + "type": "string" + }, + "sold_price": { + "description": "SoldPrice holds the value of the \"sold_price\" field.", + "type": "number" + }, + "sold_time": { + "description": "SoldTime holds the value of the \"sold_time\" field.", + "type": "string" + }, + "sold_to": { + "description": "SoldTo holds the value of the \"sold_to\" field.", + "type": "string" + }, + "sync_child_items_locations": { + "description": "SyncChildItemsLocations holds the value of the \"sync_child_items_locations\" field.", + "type": "boolean" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + }, + "warranty_details": { + "description": "WarrantyDetails holds the value of the \"warranty_details\" field.", + "type": "string" + }, + "warranty_expires": { + "description": "WarrantyExpires holds the value of the \"warranty_expires\" field.", + "type": "string" + } + } + }, + "ent.ItemEdges": { + "type": "object", + "properties": { + "attachments": { + "description": "Attachments holds the value of the attachments edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Attachment" + } + }, + "children": { + "description": "Children holds the value of the children edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Item" + } + }, + "fields": { + "description": "Fields holds the value of the fields edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.ItemField" + } + }, + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + }, + "label": { + "description": "Label holds the value of the label edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Label" + } + }, + "location": { + "description": "Location holds the value of the location edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Location" + } + ] + }, + "maintenance_entries": { + "description": "MaintenanceEntries holds the value of the maintenance_entries edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.MaintenanceEntry" + } + }, + "parent": { + "description": "Parent holds the value of the parent edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Item" + } + ] + } + } + }, + "ent.ItemField": { + "type": "object", + "properties": { + "boolean_value": { + "description": "BooleanValue holds the value of the \"boolean_value\" field.", + "type": "boolean" + }, + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "description": { + "description": "Description holds the value of the \"description\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the ItemFieldQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.ItemFieldEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "number_value": { + "description": "NumberValue holds the value of the \"number_value\" field.", + "type": "integer" + }, + "text_value": { + "description": "TextValue holds the value of the \"text_value\" field.", + "type": "string" + }, + "time_value": { + "description": "TimeValue holds the value of the \"time_value\" field.", + "type": "string" + }, + "type": { + "description": "Type holds the value of the \"type\" field.", + "allOf": [ + { + "$ref": "#/definitions/itemfield.Type" + } + ] + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.ItemFieldEdges": { + "type": "object", + "properties": { + "item": { + "description": "Item holds the value of the item edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Item" + } + ] + } + } + }, + "ent.Label": { + "type": "object", + "properties": { + "color": { + "description": "Color holds the value of the \"color\" field.", + "type": "string" + }, + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "description": { + "description": "Description holds the value of the \"description\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the LabelQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.LabelEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.LabelEdges": { + "type": "object", + "properties": { + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + }, + "items": { + "description": "Items holds the value of the items edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Item" + } + } + } + }, + "ent.Location": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "description": { + "description": "Description holds the value of the \"description\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the LocationQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.LocationEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.LocationEdges": { + "type": "object", + "properties": { + "children": { + "description": "Children holds the value of the children edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Location" + } + }, + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + }, + "items": { + "description": "Items holds the value of the items edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Item" + } + }, + "parent": { + "description": "Parent holds the value of the parent edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Location" + } + ] + } + } + }, + "ent.MaintenanceEntry": { + "type": "object", + "properties": { + "cost": { + "description": "Cost holds the value of the \"cost\" field.", + "type": "number" + }, + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "date": { + "description": "Date holds the value of the \"date\" field.", + "type": "string" + }, + "description": { + "description": "Description holds the value of the \"description\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the MaintenanceEntryQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.MaintenanceEntryEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "item_id": { + "description": "ItemID holds the value of the \"item_id\" field.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "scheduled_date": { + "description": "ScheduledDate holds the value of the \"scheduled_date\" field.", + "type": "string" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.MaintenanceEntryEdges": { + "type": "object", + "properties": { + "item": { + "description": "Item holds the value of the item edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Item" + } + ] + } + } + }, + "ent.Notifier": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the NotifierQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.NotifierEdges" + } + ] + }, + "group_id": { + "description": "GroupID holds the value of the \"group_id\" field.", + "type": "string" + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "is_active": { + "description": "IsActive holds the value of the \"is_active\" field.", + "type": "boolean" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + }, + "user_id": { + "description": "UserID holds the value of the \"user_id\" field.", + "type": "string" + } + } + }, + "ent.NotifierEdges": { + "type": "object", + "properties": { + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + }, + "user": { + "description": "User holds the value of the user edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.User" + } + ] + } + } + }, + "ent.User": { + "type": "object", + "properties": { + "activated_on": { + "description": "ActivatedOn holds the value of the \"activated_on\" field.", + "type": "string" + }, + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the UserQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.UserEdges" + } + ] + }, + "email": { + "description": "Email holds the value of the \"email\" field.", + "type": "string" + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "is_superuser": { + "description": "IsSuperuser holds the value of the \"is_superuser\" field.", + "type": "boolean" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "role": { + "description": "Role holds the value of the \"role\" field.", + "allOf": [ + { + "$ref": "#/definitions/user.Role" + } + ] + }, + "superuser": { + "description": "Superuser holds the value of the \"superuser\" field.", + "type": "boolean" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.UserEdges": { + "type": "object", + "properties": { + "auth_tokens": { + "description": "AuthTokens holds the value of the auth_tokens edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.AuthTokens" + } + }, + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + }, + "notifiers": { + "description": "Notifiers holds the value of the notifiers edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Notifier" + } + } + } + }, + "itemfield.Type": { + "type": "string", + "enum": [ + "text", + "number", + "boolean", + "time" + ], + "x-enum-varnames": [ + "TypeText", + "TypeNumber", + "TypeBoolean", + "TypeTime" + ] + }, + "repo.BarcodeProduct": { + "type": "object", + "properties": { + "barcode": { + "type": "string" + }, + "imageBase64": { + "type": "string" + }, + "imageURL": { + "type": "string" + }, + "item": { + "$ref": "#/definitions/repo.ItemCreate" + }, + "manufacturer": { + "type": "string" + }, + "modelNumber": { + "description": "Identifications", + "type": "string" + }, + "notes": { + "description": "Extras", + "type": "string" + }, + "search_engine_name": { + "type": "string" + } + } + }, + "repo.DuplicateOptions": { + "type": "object", + "properties": { + "copyAttachments": { + "type": "boolean" + }, + "copyCustomFields": { + "type": "boolean" + }, + "copyMaintenance": { + "type": "boolean" + }, + "copyPrefix": { + "type": "string" + } + } + }, + "repo.Group": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "currency": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.GroupStatistics": { + "type": "object", + "properties": { + "totalItemPrice": { + "type": "number" + }, + "totalItems": { + "type": "integer" + }, + "totalLabels": { + "type": "integer" + }, + "totalLocations": { + "type": "integer" + }, + "totalUsers": { + "type": "integer" + }, + "totalWithWarranty": { + "type": "integer" + } + } + }, + "repo.GroupUpdate": { + "type": "object", + "properties": { + "currency": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "repo.ItemAttachment": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "path": { + "type": "string" + }, + "primary": { + "type": "boolean" + }, + "thumbnail": { + "$ref": "#/definitions/ent.Attachment" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.ItemAttachmentUpdate": { + "type": "object", + "properties": { + "primary": { + "type": "boolean" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "repo.ItemCreate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "description": { + "type": "string", + "maxLength": 1000 + }, + "labelIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "locationId": { + "description": "Edges", + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + "parentId": { + "type": "string", + "x-nullable": true + }, + "quantity": { + "type": "integer" + } + } + }, + "repo.ItemField": { + "type": "object", + "properties": { + "booleanValue": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "numberValue": { + "type": "integer" + }, + "textValue": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "repo.ItemOut": { + "type": "object", + "properties": { + "archived": { + "type": "boolean" + }, + "assetId": { + "type": "string", + "example": "0" + }, + "attachments": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ItemAttachment" + } + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ItemField" + } + }, + "id": { + "type": "string" + }, + "imageId": { + "type": "string", + "x-nullable": true, + "x-omitempty": true + }, + "insured": { + "type": "boolean" + }, + "labels": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.LabelSummary" + } + }, + "lifetimeWarranty": { + "description": "Warranty", + "type": "boolean" + }, + "location": { + "description": "Edges", + "allOf": [ + { + "$ref": "#/definitions/repo.LocationSummary" + } + ], + "x-nullable": true, + "x-omitempty": true + }, + "manufacturer": { + "type": "string" + }, + "modelNumber": { + "type": "string" + }, + "name": { + "type": "string" + }, + "notes": { + "description": "Extras", + "type": "string" + }, + "parent": { + "allOf": [ + { + "$ref": "#/definitions/repo.ItemSummary" + } + ], + "x-nullable": true, + "x-omitempty": true + }, + "purchaseFrom": { + "type": "string" + }, + "purchasePrice": { + "type": "number" + }, + "purchaseTime": { + "description": "Purchase", + "type": "string" + }, + "quantity": { + "type": "integer" + }, + "serialNumber": { + "type": "string" + }, + "soldNotes": { + "type": "string" + }, + "soldPrice": { + "type": "number" + }, + "soldTime": { + "description": "Sold", + "type": "string" + }, + "soldTo": { + "type": "string" + }, + "syncChildItemsLocations": { + "type": "boolean" + }, + "thumbnailId": { + "type": "string", + "x-nullable": true, + "x-omitempty": true + }, + "updatedAt": { + "type": "string" + }, + "warrantyDetails": { + "type": "string" + }, + "warrantyExpires": { + "type": "string" + } + } + }, + "repo.ItemPatch": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "quantity": { + "type": "integer", + "x-nullable": true, + "x-omitempty": true + } + } + }, + "repo.ItemPath": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "$ref": "#/definitions/repo.ItemType" + } + } + }, + "repo.ItemSummary": { + "type": "object", + "properties": { + "archived": { + "type": "boolean" + }, + "assetId": { + "type": "string", + "example": "0" + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "imageId": { + "type": "string", + "x-nullable": true, + "x-omitempty": true + }, + "insured": { + "type": "boolean" + }, + "labels": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.LabelSummary" + } + }, + "location": { + "description": "Edges", + "allOf": [ + { + "$ref": "#/definitions/repo.LocationSummary" + } + ], + "x-nullable": true, + "x-omitempty": true + }, + "name": { + "type": "string" + }, + "purchasePrice": { + "type": "number" + }, + "quantity": { + "type": "integer" + }, + "soldTime": { + "description": "Sale details", + "type": "string" + }, + "thumbnailId": { + "type": "string", + "x-nullable": true, + "x-omitempty": true + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.ItemType": { + "type": "string", + "enum": [ + "location", + "item" + ], + "x-enum-varnames": [ + "ItemTypeLocation", + "ItemTypeItem" + ] + }, + "repo.ItemUpdate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "archived": { + "type": "boolean" + }, + "assetId": { + "type": "string" + }, + "description": { + "type": "string", + "maxLength": 1000 + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ItemField" + } + }, + "id": { + "type": "string" + }, + "insured": { + "type": "boolean" + }, + "labelIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "lifetimeWarranty": { + "description": "Warranty", + "type": "boolean" + }, + "locationId": { + "description": "Edges", + "type": "string" + }, + "manufacturer": { + "type": "string" + }, + "modelNumber": { + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + "notes": { + "description": "Extras", + "type": "string" + }, + "parentId": { + "type": "string", + "x-nullable": true, + "x-omitempty": true + }, + "purchaseFrom": { + "type": "string", + "maxLength": 255 + }, + "purchasePrice": { + "type": "number", + "x-nullable": true, + "x-omitempty": true + }, + "purchaseTime": { + "description": "Purchase", + "type": "string" + }, + "quantity": { + "type": "integer" + }, + "serialNumber": { + "description": "Identifications", + "type": "string" + }, + "soldNotes": { + "type": "string" + }, + "soldPrice": { + "type": "number", + "x-nullable": true, + "x-omitempty": true + }, + "soldTime": { + "description": "Sold", + "type": "string" + }, + "soldTo": { + "type": "string", + "maxLength": 255 + }, + "syncChildItemsLocations": { + "type": "boolean" + }, + "warrantyDetails": { + "type": "string" + }, + "warrantyExpires": { + "type": "string" + } + } + }, + "repo.LabelCreate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "color": { + "type": "string" + }, + "description": { + "type": "string", + "maxLength": 1000 + }, + "name": { + "type": "string", + "maxLength": 255, + "minLength": 1 + } + } + }, + "repo.LabelOut": { + "type": "object", + "properties": { + "color": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.LabelSummary": { + "type": "object", + "properties": { + "color": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.LocationCreate": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "parentId": { + "type": "string", + "x-nullable": true + } + } + }, + "repo.LocationOut": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.LocationSummary" + } + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "parent": { + "$ref": "#/definitions/repo.LocationSummary" + }, + "totalPrice": { + "type": "number" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.LocationOutCount": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "itemCount": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.LocationSummary": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.LocationUpdate": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "parentId": { + "type": "string", + "x-nullable": true + } + } + }, + "repo.MaintenanceEntry": { + "type": "object", + "properties": { + "completedDate": { + "type": "string" + }, + "cost": { + "type": "string", + "example": "0" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "scheduledDate": { + "type": "string" + } + } + }, + "repo.MaintenanceEntryCreate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "completedDate": { + "type": "string" + }, + "cost": { + "type": "string", + "example": "0" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "scheduledDate": { + "type": "string" + } + } + }, + "repo.MaintenanceEntryUpdate": { + "type": "object", + "properties": { + "completedDate": { + "type": "string" + }, + "cost": { + "type": "string", + "example": "0" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "scheduledDate": { + "type": "string" + } + } + }, + "repo.MaintenanceEntryWithDetails": { + "type": "object", + "properties": { + "completedDate": { + "type": "string" + }, + "cost": { + "type": "string", + "example": "0" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "itemID": { + "type": "string" + }, + "itemName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "scheduledDate": { + "type": "string" + } + } + }, + "repo.MaintenanceFilterStatus": { + "type": "string", + "enum": [ + "scheduled", + "completed", + "both" + ], + "x-enum-varnames": [ + "MaintenanceFilterStatusScheduled", + "MaintenanceFilterStatusCompleted", + "MaintenanceFilterStatusBoth" + ] + }, + "repo.NotifierCreate": { + "type": "object", + "required": [ + "name", + "url" + ], + "properties": { + "isActive": { + "type": "boolean" + }, + "name": { + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + "url": { + "type": "string" + } + } + }, + "repo.NotifierOut": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "groupId": { + "type": "string" + }, + "id": { + "type": "string" + }, + "isActive": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string" + } + } + }, + "repo.NotifierUpdate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "isActive": { + "type": "boolean" + }, + "name": { + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + "url": { + "type": "string", + "x-nullable": true + } + } + }, + "repo.PaginationResult-repo_ItemSummary": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ItemSummary" + } + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "total": { + "type": "integer" + } + } + }, + "repo.TotalsByOrganizer": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "total": { + "type": "number" + } + } + }, + "repo.TreeItem": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.TreeItem" + } + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "repo.UserOut": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "groupId": { + "type": "string" + }, + "groupName": { + "type": "string" + }, + "id": { + "type": "string" + }, + "isOwner": { + "type": "boolean" + }, + "isSuperuser": { + "type": "boolean" + }, + "name": { + "type": "string" + } + } + }, + "repo.UserUpdate": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "repo.ValueOverTime": { + "type": "object", + "properties": { + "end": { + "type": "string" + }, + "entries": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ValueOverTimeEntry" + } + }, + "start": { + "type": "string" + }, + "valueAtEnd": { + "type": "number" + }, + "valueAtStart": { + "type": "number" + } + } + }, + "repo.ValueOverTimeEntry": { + "type": "object", + "properties": { + "date": { + "type": "string" + }, + "name": { + "type": "string" + }, + "value": { + "type": "number" + } + } + }, + "services.Latest": { + "type": "object", + "properties": { + "date": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "services.UserRegistration": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "name": { + "type": "string" + }, + "password": { + "type": "string" + }, + "token": { + "type": "string" + } + } + }, + "user.Role": { + "type": "string", + "enum": [ + "user", + "user", + "owner" + ], + "x-enum-varnames": [ + "DefaultRole", + "RoleUser", + "RoleOwner" + ] + }, + "v1.APISummary": { + "type": "object", + "properties": { + "allowRegistration": { + "type": "boolean" + }, + "build": { + "$ref": "#/definitions/v1.Build" + }, + "demo": { + "type": "boolean" + }, + "health": { + "type": "boolean" + }, + "labelPrinting": { + "type": "boolean" + }, + "latest": { + "$ref": "#/definitions/services.Latest" + }, + "message": { + "type": "string" + }, + "title": { + "type": "string" + }, + "versions": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "v1.ActionAmountResult": { + "type": "object", + "properties": { + "completed": { + "type": "integer" + } + } + }, + "v1.Build": { + "type": "object", + "properties": { + "buildTime": { + "type": "string" + }, + "commit": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "v1.ChangePassword": { + "type": "object", + "properties": { + "current": { + "type": "string" + }, + "new": { + "type": "string" + } + } + }, + "v1.GroupInvitation": { + "type": "object", + "properties": { + "expiresAt": { + "type": "string" + }, + "token": { + "type": "string" + }, + "uses": { + "type": "integer" + } + } + }, + "v1.GroupInvitationCreate": { + "type": "object", + "required": [ + "uses" + ], + "properties": { + "expiresAt": { + "type": "string" + }, + "uses": { + "type": "integer", + "maximum": 100, + "minimum": 1 + } + } + }, + "v1.ItemAttachmentToken": { + "type": "object", + "properties": { + "token": { + "type": "string" + } + } + }, + "v1.LoginForm": { + "type": "object", + "properties": { + "password": { + "type": "string", + "example": "admin" + }, + "stayLoggedIn": { + "type": "boolean" + }, + "username": { + "type": "string", + "example": "admin@admin.com" + } + } + }, + "v1.TokenResponse": { + "type": "object", + "properties": { + "attachmentToken": { + "type": "string" + }, + "expiresAt": { + "type": "string" + }, + "token": { + "type": "string" + } + } + }, + "v1.Wrapped": { + "type": "object", + "properties": { + "item": {} + } + }, + "validate.ErrorResponse": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "fields": { + "type": "string" + } + } + } + }, + "securityDefinitions": { + "Bearer": { + "description": "\"Type 'Bearer TOKEN' to correctly set the API Key\"", + "type": "apiKey", + "name": "Authorization", + "in": "header" + } + } +} \ No newline at end of file diff --git a/backend/app/api/static/docs/swagger.yaml b/backend/app/api/static/docs/swagger.yaml index b14734bc..cf1289d8 100644 --- a/backend/app/api/static/docs/swagger.yaml +++ b/backend/app/api/static/docs/swagger.yaml @@ -675,6 +675,17 @@ definitions: search_engine_name: type: string type: object + repo.DuplicateOptions: + properties: + copyAttachments: + type: boolean + copyCustomFields: + type: boolean + copyMaintenance: + type: boolean + copyPrefix: + type: string + type: object repo.Group: properties: createdAt: @@ -1020,7 +1031,7 @@ definitions: color: type: string description: - maxLength: 255 + maxLength: 1000 type: string name: maxLength: 255 @@ -2163,6 +2174,32 @@ paths: summary: Update Item Attachment tags: - Items Attachments + /v1/items/{id}/duplicate: + post: + parameters: + - description: Item ID + in: path + name: id + required: true + type: string + - description: Duplicate Options + in: body + name: payload + required: true + schema: + $ref: '#/definitions/repo.DuplicateOptions' + produces: + - application/json + responses: + "201": + description: Created + schema: + $ref: '#/definitions/repo.ItemOut' + security: + - Bearer: [] + summary: Duplicate Item + tags: + - Items /v1/items/{id}/maintenance: get: deprecated: true diff --git a/backend/go.mod b/backend/go.mod index 4259d2f4..d80ed397 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -1,11 +1,11 @@ module github.com/sysadminsmedia/homebox/backend -go 1.24 +go 1.24.0 toolchain go1.24.3 require ( - entgo.io/ent v0.14.4 + entgo.io/ent v0.14.5 github.com/ardanlabs/conf/v3 v3.8.0 github.com/containrrr/shoutrrr v0.8.0 github.com/evanoberholster/imagemeta v0.3.1 @@ -14,92 +14,91 @@ require ( github.com/gen2brain/jpegxl v0.4.5 github.com/gen2brain/webp v0.5.5 github.com/go-chi/chi/v5 v5.2.2 - github.com/go-playground/validator/v10 v10.26.0 + github.com/go-playground/validator/v10 v10.27.0 github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 github.com/google/uuid v1.6.0 github.com/gorilla/schema v1.4.1 github.com/hay-kot/httpkit v0.0.11 github.com/lib/pq v1.10.9 - github.com/mattn/go-sqlite3 v1.14.28 - github.com/olahol/melody v1.2.1 + github.com/mattn/go-sqlite3 v1.14.32 + github.com/olahol/melody v1.3.0 github.com/pkg/errors v0.9.1 github.com/pressly/goose/v3 v3.24.3 github.com/rs/zerolog v1.34.0 - github.com/shirou/gopsutil/v4 v4.25.5 + github.com/shirou/gopsutil/v4 v4.25.7 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/stretchr/testify v1.10.0 github.com/swaggo/http-swagger/v2 v2.0.2 - github.com/swaggo/swag/v2 v2.0.0-rc4 + github.com/swaggo/swag v1.16.6 github.com/yeqown/go-qrcode/v2 v2.2.5 github.com/yeqown/go-qrcode/writer/standard v1.3.0 github.com/zeebo/blake3 v0.2.4 go.balki.me/anyhttp v0.5.2 - gocloud.dev v0.41.0 - gocloud.dev/pubsub/kafkapubsub v0.41.0 - gocloud.dev/pubsub/natspubsub v0.41.0 - gocloud.dev/pubsub/rabbitpubsub v0.41.0 - golang.org/x/crypto v0.39.0 - golang.org/x/image v0.28.0 - golang.org/x/text v0.26.0 - modernc.org/sqlite v1.37.1 + gocloud.dev v0.43.0 + gocloud.dev/pubsub/kafkapubsub v0.43.0 + gocloud.dev/pubsub/natspubsub v0.43.0 + gocloud.dev/pubsub/rabbitpubsub v0.43.0 + golang.org/x/crypto v0.41.0 + golang.org/x/image v0.30.0 + golang.org/x/text v0.28.0 + modernc.org/sqlite v1.38.2 ) require ( - ariga.io/atlas v0.31.1-0.20250212144724-069be8033e83 // indirect - cel.dev/expr v0.22.1 // indirect - cloud.google.com/go v0.120.0 // indirect - cloud.google.com/go/auth v0.15.0 // indirect + ariga.io/atlas v0.32.1-0.20250325101103-175b25e1c1b9 // indirect + cel.dev/expr v0.24.0 // indirect + cloud.google.com/go v0.121.4 // indirect + cloud.google.com/go/auth v0.16.4 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect - cloud.google.com/go/compute/metadata v0.6.0 // indirect - cloud.google.com/go/iam v1.4.2 // indirect - cloud.google.com/go/monitoring v1.24.1 // indirect - cloud.google.com/go/pubsub v1.48.0 // indirect - cloud.google.com/go/storage v1.51.0 // indirect + cloud.google.com/go/compute/metadata v0.8.0 // indirect + cloud.google.com/go/iam v1.5.2 // indirect + cloud.google.com/go/monitoring v1.24.2 // indirect + cloud.google.com/go/pubsub v1.49.0 // indirect + cloud.google.com/go/storage v1.55.0 // indirect github.com/Azure/azure-amqp-common-go/v3 v3.2.3 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.8.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.9.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1 // indirect github.com/Azure/go-amqp v1.4.0 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest/to v0.4.1 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect - github.com/IBM/sarama v1.45.1 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 // indirect + github.com/IBM/sarama v1.45.2 // indirect github.com/KyleBanks/depth v1.2.1 // indirect - github.com/agext/levenshtein v1.2.1 // indirect - github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect + github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect - github.com/aws/aws-sdk-go v1.55.6 // indirect - github.com/aws/aws-sdk-go-v2 v1.36.3 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 // indirect - github.com/aws/aws-sdk-go-v2/config v1.29.12 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.65 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.69 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect + github.com/aws/aws-sdk-go v1.55.7 // indirect + github.com/aws/aws-sdk-go-v2 v1.36.5 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 // indirect + github.com/aws/aws-sdk-go-v2/config v1.29.17 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.70 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.84 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.78.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sns v1.34.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sqs v1.38.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.25.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 // indirect - github.com/aws/smithy-go v1.22.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.36 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.84.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sns v1.34.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sqs v1.38.8 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.25.5 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 // indirect + github.com/aws/smithy-go v1.22.4 // indirect github.com/bmatcuk/doublestar v1.3.4 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/eapache/go-resiliency v1.7.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect @@ -107,33 +106,33 @@ require ( github.com/ebitengine/purego v0.8.4 // indirect github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect - github.com/fatih/color v1.15.0 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fogleman/gg v1.3.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.8 // indirect - github.com/go-logr/logr v1.4.2 // indirect + github.com/gabriel-vasile/mimetype v1.4.9 // indirect + github.com/go-jose/go-jose/v4 v4.1.1 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/inflect v0.19.0 // indirect - github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/spec v0.20.9 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/jsonpointer v0.21.2 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/spec v0.21.0 // indirect + github.com/go-openapi/swag v0.23.1 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/golang-jwt/jwt/v5 v5.2.2 // indirect - github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect + github.com/golang-jwt/jwt/v5 v5.2.3 // indirect github.com/golang/snappy v1.0.0 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/wire v0.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect - github.com/googleapis/gax-go/v2 v2.14.1 // indirect - github.com/gorilla/websocket v1.5.0 // indirect + github.com/googleapis/gax-go/v2 v2.15.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect - github.com/hashicorp/hcl/v2 v2.13.0 // indirect + github.com/hashicorp/hcl/v2 v2.18.1 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.7.6 // indirect @@ -142,69 +141,67 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mailru/easyjson v0.9.0 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mfridman/interpolate v0.0.2 // indirect - github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 // indirect - github.com/nats-io/nats.go v1.40.1 // indirect - github.com/nats-io/nkeys v0.4.10 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/nats-io/nats.go v1.44.0 // indirect + github.com/nats-io/nkeys v0.4.11 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect - github.com/philhofer/fwd v1.1.2 // indirect + github.com/philhofer/fwd v1.2.0 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/rabbitmq/amqp091-go v1.10.0 // indirect - github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/sethvargo/go-retry v0.3.0 // indirect - github.com/sv-tools/openapi v0.2.1 // indirect - github.com/swaggo/files/v2 v2.0.0 // indirect - github.com/swaggo/swag v1.16.4 // indirect + github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect + github.com/swaggo/files/v2 v2.0.2 // indirect github.com/tetratelabs/wazero v1.9.0 // indirect - github.com/tinylib/msgp v1.1.8 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect github.com/yeqown/reedsolomon v1.0.0 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect github.com/zclconf/go-cty v1.14.4 // indirect github.com/zclconf/go-cty-yaml v1.1.0 // indirect - go.opencensus.io v0.24.0 // indirect + github.com/zeebo/errs v1.4.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.35.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect - go.opentelemetry.io/otel v1.35.0 // indirect - go.opentelemetry.io/otel/metric v1.35.0 // indirect - go.opentelemetry.io/otel/sdk v1.35.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.35.0 // indirect - go.opentelemetry.io/otel/trace v1.35.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.37.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect - golang.org/x/mod v0.25.0 // indirect - golang.org/x/net v0.40.0 // indirect - golang.org/x/oauth2 v0.28.0 // indirect - golang.org/x/sync v0.15.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/time v0.11.0 // indirect - golang.org/x/tools v0.33.0 // indirect + golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 // indirect + golang.org/x/mod v0.27.0 // indirect + golang.org/x/net v0.43.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/tools v0.36.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect - google.golang.org/api v0.228.0 // indirect - google.golang.org/genproto v0.0.0-20250324211829-b45e905df463 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 // indirect - google.golang.org/grpc v1.71.0 // indirect - google.golang.org/protobuf v1.36.6 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect + google.golang.org/api v0.247.0 // indirect + google.golang.org/genproto v0.0.0-20250715232539-7130f93afb79 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250715232539-7130f93afb79 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a // indirect + google.golang.org/grpc v1.74.2 // indirect + google.golang.org/protobuf v1.36.7 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - modernc.org/libc v1.65.7 // indirect + modernc.org/libc v1.66.7 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect ) diff --git a/backend/go.sum b/backend/go.sum index dd8d0970..b24c7400 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -1,48 +1,47 @@ -ariga.io/atlas v0.31.1-0.20250212144724-069be8033e83 h1:nX4HXncwIdvQ8/8sIUIf1nyCkK8qdBaHQ7EtzPpuiGE= -ariga.io/atlas v0.31.1-0.20250212144724-069be8033e83/go.mod h1:Oe1xWPuu5q9LzyrWfbZmEZxFYeu4BHTyzfjeW2aZp/w= -cel.dev/expr v0.22.1 h1:xoFEsNh972Yzey8N9TCPx2nDvMN7TMhQEzxLuj/iRrI= -cel.dev/expr v0.22.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.120.0 h1:wc6bgG9DHyKqF5/vQvX1CiZrtHnxJjBlKUyF9nP6meA= -cloud.google.com/go v0.120.0/go.mod h1:/beW32s8/pGRuj4IILWQNd4uuebeT4dkOhKmkfit64Q= -cloud.google.com/go/auth v0.15.0 h1:Ly0u4aA5vG/fsSsxu98qCQBemXtAtJf+95z9HK+cxps= -cloud.google.com/go/auth v0.15.0/go.mod h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8= +ariga.io/atlas v0.32.1-0.20250325101103-175b25e1c1b9 h1:E0wvcUXTkgyN4wy4LGtNzMNGMytJN8afmIWXJVMi4cc= +ariga.io/atlas v0.32.1-0.20250325101103-175b25e1c1b9/go.mod h1:Oe1xWPuu5q9LzyrWfbZmEZxFYeu4BHTyzfjeW2aZp/w= +cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= +cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cloud.google.com/go v0.121.4 h1:cVvUiY0sX0xwyxPwdSU2KsF9knOVmtRyAMt8xou0iTs= +cloud.google.com/go v0.121.4/go.mod h1:XEBchUiHFJbz4lKBZwYBDHV/rSyfFktk737TLDU089s= +cloud.google.com/go/auth v0.16.4 h1:fXOAIQmkApVvcIn7Pc2+5J8QTMVbUGLscnSVNl11su8= +cloud.google.com/go/auth v0.16.4/go.mod h1:j10ncYwjX/g3cdX7GpEzsdM+d+ZNsXAbb6qXA7p1Y5M= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= -cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= -cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= -cloud.google.com/go/iam v1.4.2 h1:4AckGYAYsowXeHzsn/LCKWIwSWLkdb0eGjH8wWkd27Q= -cloud.google.com/go/iam v1.4.2/go.mod h1:REGlrt8vSlh4dfCJfSEcNjLGq75wW75c5aU3FLOYq34= +cloud.google.com/go/compute/metadata v0.8.0 h1:HxMRIbao8w17ZX6wBnjhcDkW6lTFpgcaobyVfZWqRLA= +cloud.google.com/go/compute/metadata v0.8.0/go.mod h1:sYOGTp851OV9bOFJ9CH7elVvyzopvWQFNNghtDQ/Biw= +cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= +cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= -cloud.google.com/go/longrunning v0.6.6 h1:XJNDo5MUfMM05xK3ewpbSdmt7R2Zw+aQEMbdQR65Rbw= -cloud.google.com/go/longrunning v0.6.6/go.mod h1:hyeGJUrPHcx0u2Uu1UFSoYZLn4lkMrccJig0t4FI7yw= -cloud.google.com/go/monitoring v1.24.1 h1:vKiypZVFD/5a3BbQMvI4gZdl8445ITzXFh257XBgrS0= -cloud.google.com/go/monitoring v1.24.1/go.mod h1:Z05d1/vn9NaujqY2voG6pVQXoJGbp+r3laV+LySt9K0= -cloud.google.com/go/pubsub v1.48.0 h1:ntFpQVrr10Wj/GXSOpxGmexGynldv/bFp25H0jy8aOs= -cloud.google.com/go/pubsub v1.48.0/go.mod h1:AAtyjyIT/+zaY1ERKFJbefOvkUxRDNp3nD6TdfdqUZk= -cloud.google.com/go/storage v1.51.0 h1:ZVZ11zCiD7b3k+cH5lQs/qcNaoSz3U9I0jgwVzqDlCw= -cloud.google.com/go/storage v1.51.0/go.mod h1:YEJfu/Ki3i5oHC/7jyTgsGZwdQ8P9hqMqvpi5kRKGgc= -cloud.google.com/go/trace v1.11.5 h1:CALS1loyxJMnRiCwZSpdf8ac7iCsjreMxFD2WGxzzHU= -cloud.google.com/go/trace v1.11.5/go.mod h1:TwblCcqNInriu5/qzaeYEIH7wzUcchSdeY2l5wL3Eec= -entgo.io/ent v0.14.4 h1:/DhDraSLXIkBhyiVoJeSshr4ZYi7femzhj6/TckzZuI= -entgo.io/ent v0.14.4/go.mod h1:aDPE/OziPEu8+OWbzy4UlvWmD2/kbRuWfK2A40hcxJM= +cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= +cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= +cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= +cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= +cloud.google.com/go/pubsub v1.49.0 h1:5054IkbslnrMCgA2MAEPcsN3Ky+AyMpEZcii/DoySPo= +cloud.google.com/go/pubsub v1.49.0/go.mod h1:K1FswTWP+C1tI/nfi3HQecoVeFvL4HUOB1tdaNXKhUY= +cloud.google.com/go/storage v1.55.0 h1:NESjdAToN9u1tmhVqhXCaCwYBuvEhZLLv0gBr+2znf0= +cloud.google.com/go/storage v1.55.0/go.mod h1:ztSmTTwzsdXe5syLVS0YsbFxXuvEmEyZj7v7zChEmuY= +cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= +cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= +entgo.io/ent v0.14.5 h1:Rj2WOYJtCkWyFo6a+5wB3EfBRP0rnx1fMk6gGA0UUe4= +entgo.io/ent v0.14.5/go.mod h1:zTzLmWtPvGpmSwtkaayM2cm5m819NdM7z7tYPq3vN0U= github.com/Azure/azure-amqp-common-go/v3 v3.2.3 h1:uDF62mbd9bypXWi19V1bN5NZEO84JqgmI5G73ibAmrk= github.com/Azure/azure-amqp-common-go/v3 v3.2.3/go.mod h1:7rPmbSfszeovxGfc5fSAXE4ehlXQZHpMja2OtxC2Tas= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1 h1:DSDNVxqkoXJiko6x8a90zidoYqnYYa6c1MTzDKzKkTo= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1/go.mod h1:zGqV2R4Cr/k8Uye5w+dgQ06WJtEcbQG/8J7BB6hnCr4= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 h1:F0gBpfdPLGsw+nsgk6aqqkZS1jiixa5WwFe3fk/T3Ys= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2/go.mod h1:SqINnQ9lVVdRlyC8cd1lCI0SdX4n2paeABd2K8ggfnE= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.1 h1:Wc1ml6QlJs2BHQ/9Bqu1jiyggbsSjramq2oUmp5WeIo= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.1/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 h1:B+blDbyVIG3WaikNxPnhPiJ1MThR03b3vKGtER95TP4= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1/go.mod h1:JdM5psgjfBf5fo2uWOZhflPWyDBZ/O/CNAH9CtsuZE4= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= -github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.8.0 h1:JNgM3Tz592fUHU2vgwgvOgKxo5s9Ki0y2wicBeckn70= -github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.8.0/go.mod h1:6vUKmzY17h6dpn9ZLAhM4R/rcrltBeq52qZIkUR7Oro= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0 h1:PiSrjRPpkQNjrM8H0WwKMnZUdu1RGMtd/LdGKUrOo+c= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0/go.mod h1:oDrbWx4ewMylP7xHivfgixbfGBT6APAwsSoHRKotnIc= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0 h1:UXT0o77lXQrikd1kgwIPQOUect7EoR/+sbP4wQKdzxM= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0/go.mod h1:cTvi54pg19DoT07ekoeMgE/taAwNtCShVeZqA+Iv2xI= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA= +github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.9.1 h1:CRZwf68N55u7ZZo3Xx2ynuqEA6k5GZfwsEUkU8qsAPk= +github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.9.1/go.mod h1:NydgUaroiShkgOcb+X6OUdS3RalWBrvDNtOyFHJtsZY= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.0 h1:LR0kAX9ykz8G4YgLCaRDVJ3+n43R8MneB5dTy2konZo= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.0/go.mod h1:DWAciXemNf++PQJLeXUB4HHH5OpsAh12HZnu2wXE1jA= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1 h1:lhZdRq7TIx0GJQvSyX2Si406vrYsov2FXGp/RnSEtcs= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1/go.mod h1:8cl44BDmi+effbARHMQjgOKA2AYvcohNm7KEt42mSV8= github.com/Azure/go-amqp v0.17.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= github.com/Azure/go-amqp v1.4.0 h1:Xj3caqi4comOF/L1Uc5iuBxR/pB6KumejC01YQOqOR4= github.com/Azure/go-amqp v1.4.0/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE= @@ -60,91 +59,85 @@ github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJ github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs= github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 h1:6/0iUd0xrnX7qt+mLNRwg5c0PGv8wpE8K90ryANQwMI= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= -github.com/IBM/sarama v1.45.1 h1:nY30XqYpqyXOXSNoe2XCgjj9jklGM1Ye94ierUb1jQ0= -github.com/IBM/sarama v1.45.1/go.mod h1:qifDhA3VWSrQ1TjSMyxDl3nYL3oX2C83u+G6L79sq4w= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 h1:owcC2UnmsZycprQ5RfRgjydWhuoxg71LUfyiQdijZuM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0/go.mod h1:ZPpqegjbE99EPKsu3iUWV22A04wzGPcAY/ziSIQEEgs= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.53.0 h1:4LP6hvB4I5ouTbGgWtixJhgED6xdf67twf9PoY96Tbg= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.53.0/go.mod h1:jUZ5LYlw40WMd07qxcQJD5M40aUxrfwqQX1g7zxYnrQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 h1:Ron4zCA/yk6U7WOBXhTJcDpsUBG9npumK6xw2auFltQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0/go.mod h1:cSgYe11MCNYunTnRXrKiR/tHc0eoKjICUuWpNZoVCOo= +github.com/IBM/sarama v1.45.2 h1:8m8LcMCu3REcwpa7fCP6v2fuPuzVwXDAM2DOv3CBrKw= +github.com/IBM/sarama v1.45.2/go.mod h1:ppaoTcVdGv186/z6MEKsMm70A5fwJfRTpstI37kVn3Y= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= -github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8= -github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= -github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= -github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= +github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= github.com/ardanlabs/conf/v3 v3.8.0 h1:Mvv2wZJz8tIl705m5BU3ZRCP1V6TKY6qebA8i4sykrY= github.com/ardanlabs/conf/v3 v3.8.0/go.mod h1:XlL9P0quWP4m1weOVFmlezabinbZLI05niDof/+Ochk= -github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk= -github.com/aws/aws-sdk-go v1.55.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= -github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM= -github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 h1:zAybnyUQXIZ5mok5Jqwlf58/TFE7uvd3IAsa1aF9cXs= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10/go.mod h1:qqvMj6gHLR/EXWZw4ZbqlPbQUyenf4h82UQUlKc+l14= -github.com/aws/aws-sdk-go-v2/config v1.29.12 h1:Y/2a+jLPrPbHpFkpAAYkVEtJmxORlXoo5k2g1fa2sUo= -github.com/aws/aws-sdk-go-v2/config v1.29.12/go.mod h1:xse1YTjmORlb/6fhkWi8qJh3cvZi4JoVNhc+NbJt4kI= -github.com/aws/aws-sdk-go-v2/credentials v1.17.65 h1:q+nV2yYegofO/SUXruT+pn4KxkxmaQ++1B/QedcKBFM= -github.com/aws/aws-sdk-go-v2/credentials v1.17.65/go.mod h1:4zyjAuGOdikpNYiSGpsGz8hLGmUzlY8pc8r9QQ/RXYQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.69 h1:6VFPH/Zi9xYFMJKPQOX5URYkQoXRWeJ7V/7Y6ZDYoms= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.69/go.mod h1:GJj8mmO6YT6EqgduWocwhMoxTLFitkhIrK+owzrYL2I= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q= +github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE= +github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.36.5 h1:0OF9RiEMEdDdZEMqF9MRjevyxAQcf6gY+E7vwBILFj0= +github.com/aws/aws-sdk-go-v2 v1.36.5/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 h1:12SpdwU8Djs+YGklkinSSlcrPyj3H4VifVsKf78KbwA= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11/go.mod h1:dd+Lkp6YmMryke+qxW/VnKyhMBDTYP41Q2Bb+6gNZgY= +github.com/aws/aws-sdk-go-v2/config v1.29.17 h1:jSuiQ5jEe4SAMH6lLRMY9OVC+TqJLP5655pBGjmnjr0= +github.com/aws/aws-sdk-go-v2/config v1.29.17/go.mod h1:9P4wwACpbeXs9Pm9w1QTh6BwWwJjwYvJ1iCt5QbCXh8= +github.com/aws/aws-sdk-go-v2/credentials v1.17.70 h1:ONnH5CM16RTXRkS8Z1qg7/s2eDOhHhaXVd72mmyv4/0= +github.com/aws/aws-sdk-go-v2/credentials v1.17.70/go.mod h1:M+lWhhmomVGgtuPOhO85u4pEa3SmssPTdcYpP/5J/xc= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32 h1:KAXP9JSHO1vKGCr5f4O6WmlVKLFFXgWYAGoJosorxzU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32/go.mod h1:h4Sg6FQdexC1yYG9RDnOvLbW1a/P986++/Y/a+GyEM8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.84 h1:cTXRdLkpBanlDwISl+5chq5ui1d1YWg4PWMR9c3kXyw= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.84/go.mod h1:kwSy5X7tfIHN39uucmjQVs2LvDdXEjQucgQQEqCggEo= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 h1:SsytQyTMHMDPspp+spo7XwXTP44aJZZAC7fBV2C5+5s= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36/go.mod h1:Q1lnJArKRXkenyog6+Y+zr7WDpk4e6XlR6gs20bbeNo= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 h1:i2vNHQiXUvKhs3quBR6aqlgJaiaexz/aNvdCktW/kAM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36/go.mod h1:UdyGa7Q91id/sdyHPwth+043HhmP6yP9MBHgbZM0xo8= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 h1:ZNTqv4nIdE/DiBfUUfXcLZ/Spcuz+RjeziUtNJackkM= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34/go.mod h1:zf7Vcd1ViW7cPqYWEHLHJkS50X0JS2IKz9Cgaj6ugrs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.0 h1:lguz0bmOoGzozP9XfRJR1QIayEYo+2vP/No3OfLF0pU= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.0/go.mod h1:iu6FSzgt+M2/x3Dk8zhycdIcHjEFb36IS8HVUVFoMg0= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 h1:moLQUoVq91LiqT1nbvzDukyqAlCv89ZmwaHw/ZFlFZg= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15/go.mod h1:ZH34PJUc8ApjBIfgQCFvkWcUDBtl/WTD+uiYHjd8igA= -github.com/aws/aws-sdk-go-v2/service/s3 v1.78.2 h1:jIiopHEV22b4yQP2q36Y0OmwLbsxNWdWwfZRR5QRRO4= -github.com/aws/aws-sdk-go-v2/service/s3 v1.78.2/go.mod h1:U5SNqwhXB3Xe6F47kXvWihPl/ilGaEDe8HD/50Z9wxc= -github.com/aws/aws-sdk-go-v2/service/sns v1.34.2 h1:PajtbJ/5bEo6iUAIGMYnK8ljqg2F1h4mMCGh1acjN30= -github.com/aws/aws-sdk-go-v2/service/sns v1.34.2/go.mod h1:PJtxxMdj747j8DeZENRTTYAz/lx/pADn/U0k7YNNiUY= -github.com/aws/aws-sdk-go-v2/service/sqs v1.38.3 h1:j5BchjfDoS7K26vPdyJlyxBIIBGDflq3qjjJKBDlbcI= -github.com/aws/aws-sdk-go-v2/service/sqs v1.38.3/go.mod h1:Bar4MrRxeqdn6XIh8JGfiXuFRmyrrsZNTJotxEJmWW0= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.2 h1:pdgODsAhGo4dvzC3JAG5Ce0PX8kWXrTZGx+jxADD+5E= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.2/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0 h1:90uX0veLKcdHVfvxhkWUQSCi5VabtwMLFutYiRke4oo= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 h1:PZV5W8yk4OtH1JAuhV2PXwwO9v5G5Aoj+eMCn4T+1Kc= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.17/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= -github.com/aws/smithy-go v1.22.3 h1:Z//5NuZCSW6R4PhQ93hShNbyBbn8BWCmCVCt+Q8Io5k= -github.com/aws/smithy-go v1.22.3/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.36 h1:GMYy2EOWfzdP3wfVAGXBNKY5vK4K8vMET4sYOYltmqs= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.36/go.mod h1:gDhdAV6wL3PmPqBhiPbnlS447GoWs8HTTOYef9/9Inw= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 h1:CXV68E2dNqhuynZJPB80bhPQwAKqBWVer887figW6Jc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4/go.mod h1:/xFi9KtvBXP97ppCz1TAEvU1Uf66qvid89rbem3wCzQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.4 h1:nAP2GYbfh8dd2zGZqFRSMlq+/F6cMPBUuCsGAMkN074= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.4/go.mod h1:LT10DsiGjLWh4GbjInf9LQejkYEhBgBCjLG5+lvk4EE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 h1:t0E6FzREdtCsiLIoLCWsYliNsRBgyGD/MCK571qk4MI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17/go.mod h1:ygpklyoaypuyDvOM5ujWGrYWpAK3h7ugnmKCU/76Ys4= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17 h1:qcLWgdhq45sDM9na4cvXax9dyLitn8EYBRl8Ak4XtG4= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17/go.mod h1:M+jkjBFZ2J6DJrjMv2+vkBbuht6kxJYtJiwoVgX4p4U= +github.com/aws/aws-sdk-go-v2/service/s3 v1.84.0 h1:0reDqfEN+tB+sozj2r92Bep8MEwBZgtAXTND1Kk9OXg= +github.com/aws/aws-sdk-go-v2/service/s3 v1.84.0/go.mod h1:kUklwasNoCn5YpyAqC/97r6dzTA1SRKJfKq16SXeoDU= +github.com/aws/aws-sdk-go-v2/service/sns v1.34.7 h1:OBuZE9Wt8h2imuRktu+WfjiTGrnYdCIJg8IX92aalHE= +github.com/aws/aws-sdk-go-v2/service/sns v1.34.7/go.mod h1:4WYoZAhHt+dWYpoOQUgkUKfuQbE6Gg/hW4oXE0pKS9U= +github.com/aws/aws-sdk-go-v2/service/sqs v1.38.8 h1:80dpSqWMwx2dAm30Ib7J6ucz1ZHfiv5OCRwN/EnCOXQ= +github.com/aws/aws-sdk-go-v2/service/sqs v1.38.8/go.mod h1:IzNt/udsXlETCdvBOL0nmyMe2t9cGmXmZgsdoZGYYhI= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.5 h1:AIRJ3lfb2w/1/8wOOSqYb9fUKGwQbtysJ2H1MofRUPg= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.5/go.mod h1:b7SiVprpU+iGazDUqvRSLf5XmCdn+JtT1on7uNL6Ipc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3 h1:BpOxT3yhLwSJ77qIY3DoHAQjZsc4HEGfMCE4NGy3uFg= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3/go.mod h1:vq/GQR1gOFLquZMSrxUK/cpvKCNVYibNyJ1m7JrU88E= +github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 h1:NFOJ/NXEGV4Rq//71Hs1jC/NvPs1ezajK+yQmkwnPV0= +github.com/aws/aws-sdk-go-v2/service/sts v1.34.0/go.mod h1:7ph2tGpfQvwzgistp2+zga9f+bCjlQJPkPUmMgDSD7w= +github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw= +github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0= github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f h1:C5bqEmzEPLsHm9Mv73lSE9e9bKV23aB1vxOsmZrkl3k= -github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/coder/websocket v1.8.13 h1:f3QZdXy7uGVz+4uCJy2nTZyM0yTBj8yANEHhqlXZ9FE= github.com/coder/websocket v1.8.13/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs= github.com/containrrr/shoutrrr v0.8.0 h1:mfG2ATzIS7NR2Ec6XL+xyoHzN97H8WPjir8aYzJUSec= github.com/containrrr/shoutrrr v0.8.0/go.mod h1:ioyQAyu1LJY6sILuNyKaQaw+9Ttik5QePU8atnAdO2o= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= @@ -158,22 +151,18 @@ github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/evanoberholster/imagemeta v0.3.1 h1:E4GUjXcvlVMjP9joN25+bBNf3Al3MTTfMqCrDOCW+LE= github.com/evanoberholster/imagemeta v0.3.1/go.mod h1:V0vtDJmjTqvwAYO8r+u33NRVIMXQb0qSqEfImoKEiXM= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= @@ -181,8 +170,8 @@ github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzP github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= -github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= +github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY= +github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok= github.com/gen2brain/avif v0.4.4 h1:Ga/ss7qcWWQm2bxFpnjYjhJsNfZrWs5RsyklgFjKRSE= github.com/gen2brain/avif v0.4.4/go.mod h1:/XCaJcjZraQwKVhpu9aEd9aLOssYOawLvhMBtmHVGqk= github.com/gen2brain/heic v0.4.5 h1:Cq3hPu6wwlTJNv2t48ro3oWje54h82Q5pALeCBNgaSk= @@ -193,36 +182,33 @@ github.com/gen2brain/webp v0.5.5 h1:MvQR75yIPU/9nSqYT5h13k4URaJK3gf9tgz/ksRbyEg= github.com/gen2brain/webp v0.5.5/go.mod h1:xOSMzp4aROt2KFW++9qcK/RBTOVC2S9tJG66ip/9Oc0= github.com/go-chi/chi/v5 v5.2.2 h1:CMwsvRVTbXVytCk1Wd72Zy1LAsAh9GxMmSNWLHCG618= github.com/go-chi/chi/v5 v5.2.2/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= +github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= +github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8= -github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/jsonpointer v0.21.2 h1:AqQaNADVwq/VnkCmQg6ogE+M3FOsKTytwges0JdwVuA= +github.com/go-openapi/jsonpointer v0.21.2/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= +github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= +github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.26.0 h1:SP05Nqhjcvz81uJaRfEV0YBSSSGMc/iMaVtFbr3Sw2k= -github.com/go-playground/validator/v10 v10.26.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= +github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4= +github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= @@ -230,37 +216,18 @@ github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3a github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 h1:FWNFq4fM1wPfcK40yHE5UO3RUdSNPaBC+j3PokzA6OQ= github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= -github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.3 h1:kkGXqQOBSDDWRhWNXTFpqGSCMyh/PLnqUvMGJPDJDs0= +github.com/golang-jwt/jwt/v5 v5.2.3/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= @@ -275,21 +242,20 @@ github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI= github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA= github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= -github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= -github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= +github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo= +github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc= github.com/gorilla/schema v1.4.1 h1:jUg5hUjCSDZpNGLuXQOgIWGdlgrIdYvgQ0wZtdK1M3E= github.com/gorilla/schema v1.4.1/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -298,8 +264,8 @@ github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9 github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/hcl/v2 v2.13.0 h1:0Apadu1w6M11dyGFxWnmhhcMjkbAiKCv7G1r/2QgCNc= -github.com/hashicorp/hcl/v2 v2.13.0/go.mod h1:e4z5nxYlWNPdDSNYX+ph14EvWYMFm3eP0zIUqPc2jr0= +github.com/hashicorp/hcl/v2 v2.18.1 h1:6nxnOJFku1EuSawSD81fuviYUV8DxFr3fp2dUi3ZYSo= +github.com/hashicorp/hcl/v2 v2.18.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= github.com/hay-kot/httpkit v0.0.11 h1:ZdB2uqsFBSDpfUoClGK5c5orjBjQkEVSXh7fZX5FKEk= github.com/hay-kot/httpkit v0.0.11/go.mod h1:0kZdk5/swzdfqfg2c6pBWimcgeJ9PTyO97EbHnYl2Sw= github.com/jarcoal/httpmock v1.3.0 h1:2RJ8GP0IIaWwcC9Fp2BmVi8Kog3v2Hn7VXM3fTd+nuc= @@ -324,18 +290,14 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs= -github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw= +github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU= +github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= @@ -346,46 +308,44 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A= -github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= +github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= -github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/nats-io/jwt/v2 v2.5.0 h1:WQQ40AAlqqfx+f6ku+i0pOVm+ASirD4fUh+oQsiE9Ak= github.com/nats-io/jwt/v2 v2.5.0/go.mod h1:24BeQtRwxRV8ruvC4CojXlx/WQ/VjuwlYiH+vu/+ibI= github.com/nats-io/nats-server/v2 v2.9.23 h1:6Wj6H6QpP9FMlpCyWUaNu2yeZ/qGj+mdRkZ1wbikExU= github.com/nats-io/nats-server/v2 v2.9.23/go.mod h1:wEjrEy9vnqIGE4Pqz4/c75v9Pmaq7My2IgFmnykc4C0= -github.com/nats-io/nats.go v1.40.1 h1:MLjDkdsbGUeCMKFyCFoLnNn/HDTqcgVa3EQm+pMNDPk= -github.com/nats-io/nats.go v1.40.1/go.mod h1:wV73x0FSI/orHPSYoyMeJB+KajMDoWyXmFaRrrYaaTo= -github.com/nats-io/nkeys v0.4.10 h1:glmRrpCmYLHByYcePvnTBEAwawwapjCPMjy2huw20wc= -github.com/nats-io/nkeys v0.4.10/go.mod h1:OjRrnIKnWBFl+s4YK5ChQfvHP2fxqZexrKJoVVyWB3U= +github.com/nats-io/nats.go v1.44.0 h1:ECKVrDLdh/kDPV1g0gAQ+2+m2KprqZK5O/eJAyAnH2M= +github.com/nats-io/nats.go v1.44.0/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g= +github.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0= +github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/olahol/melody v1.2.1 h1:xdwRkzHxf+B0w4TKbGpUSSkV516ZucQZJIWLztOWICQ= -github.com/olahol/melody v1.2.1/go.mod h1:GgkTl6Y7yWj/HtfD48Q5vLKPVoZOH+Qqgfa7CvJgJM4= +github.com/olahol/melody v1.3.0 h1:n7UlKiQnxVrgxKoM0d7usZiN+Z0y2lVENtYLgKtXS6s= +github.com/olahol/melody v1.3.0/go.mod h1:GgkTl6Y7yWj/HtfD48Q5vLKPVoZOH+Qqgfa7CvJgJM4= github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU= github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts= github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= -github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= -github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= @@ -394,19 +354,19 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pressly/goose/v3 v3.24.3 h1:DSWWNwwggVUsYZ0X2VitiAa9sKuqtBfe+Jr9zFGwWlM= github.com/pressly/goose/v3 v3.24.3/go.mod h1:v9zYL4xdViLHCUUJh/mhjnm6JrK7Eul8AS93IxiZM4E= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw= github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= -github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= +github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 h1:bsUq1dX0N8AOIL7EB/X911+m4EHsnWEHeJ0c+3TTBrg= +github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/redis/go-redis/v9 v9.8.0 h1:q3nRvjrlge/6UD7eTu/DSg2uYiU2mCL0G/uzBWqhicI= +github.com/redis/go-redis/v9 v9.8.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= @@ -414,14 +374,16 @@ github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7 github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= -github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah2SE= github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas= -github.com/shirou/gopsutil/v4 v4.25.5 h1:rtd9piuSMGeU8g1RMXjZs9y9luK5BwtnG7dZaQUJAsc= -github.com/shirou/gopsutil/v4 v4.25.5/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c= +github.com/shirou/gopsutil/v4 v4.25.7 h1:bNb2JuqKuAu3tRlPv5piSmBZyMfecwQ+t/ILq+1JqVM= +github.com/shirou/gopsutil/v4 v4.25.7/go.mod h1:XV/egmwJtd3ZQjBpJVY5kndsiOO4IRqy9TQnmm6VP7U= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= +github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= +github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -433,24 +395,20 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/sv-tools/openapi v0.2.1 h1:ES1tMQMJFGibWndMagvdoo34T1Vllxr1Nlm5wz6b1aA= -github.com/sv-tools/openapi v0.2.1/go.mod h1:k5VuZamTw1HuiS9p2Wl5YIDWzYnHG6/FgPOSFXLAhGg= -github.com/swaggo/files/v2 v2.0.0 h1:hmAt8Dkynw7Ssz46F6pn8ok6YmGZqHSVLZ+HQM7i0kw= -github.com/swaggo/files/v2 v2.0.0/go.mod h1:24kk2Y9NYEJ5lHuCra6iVwkMjIekMCaFq/0JQj66kyM= +github.com/swaggo/files/v2 v2.0.2 h1:Bq4tgS/yxLB/3nwOMcul5oLEUKa877Ykgz3CJMVbQKU= +github.com/swaggo/files/v2 v2.0.2/go.mod h1:TVqetIzZsO9OhHX1Am9sRf9LdrFZqoK49N37KON/jr0= github.com/swaggo/http-swagger/v2 v2.0.2 h1:FKCdLsl+sFCx60KFsyM0rDarwiUSZ8DqbfSyIKC9OBg= github.com/swaggo/http-swagger/v2 v2.0.2/go.mod h1:r7/GBkAWIfK6E/OLnE8fXnviHiDeAHmgIyooa4xm3AQ= -github.com/swaggo/swag v1.16.4 h1:clWJtd9LStiG3VeijiCfOVODP6VpHtKdQy9ELFG3s1A= -github.com/swaggo/swag v1.16.4/go.mod h1:VBsHJRsDvfYvqoiMKnsdwhNV9LEMHgEDZcyVYX0sxPg= -github.com/swaggo/swag/v2 v2.0.0-rc4 h1:SZ8cK68gcV6cslwrJMIOqPkJELRwq4gmjvk77MrvHvY= -github.com/swaggo/swag/v2 v2.0.0-rc4/go.mod h1:Ow7Y8gF16BTCDn8YxZbyKn8FkMLRUHekv1kROJZpbvE= +github.com/swaggo/swag v1.16.6 h1:qBNcx53ZaX+M5dxVyTrgQ0PJ/ACK+NzhwcbieTt+9yI= +github.com/swaggo/swag v1.16.6/go.mod h1:ngP2etMK5a0P3QBizic5MEwpRmluJZPHjXcMoj4Xesg= github.com/tetratelabs/wazero v1.9.0 h1:IcZ56OuxrtaEz8UYNRHBrUa9bYeX9oVY93KspZZBf/I= github.com/tetratelabs/wazero v1.9.0/go.mod h1:TSbcXCfFP0L2FGkRPxHphadXPjo1T6W+CseNNY7EkjM= -github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= -github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= github.com/yeqown/go-qrcode/v2 v2.2.5 h1:HCOe2bSjkhZyYoyyNaXNzh4DJZll6inVJQQw+8228Zk= github.com/yeqown/go-qrcode/v2 v2.2.5/go.mod h1:uHpt9CM0V1HeXLz+Wg5MN50/sI/fQhfkZlOM+cOTHxw= github.com/yeqown/go-qrcode/writer/standard v1.3.0 h1:chdyhEfRtUPgQtuPeaWVGQ/TQx4rE1PqeoW3U+53t34= @@ -468,123 +426,102 @@ github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/blake3 v0.2.4 h1:KYQPkhpRtcqh0ssGYcKLG1JYvddkEA8QwCM/yBqhaZI= github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCRUjcE= +github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= +github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= go.balki.me/anyhttp v0.5.2 h1:et4tCDXLeXpWfMNvRKG7ojfrnlr3du7cEaG966MLSpA= go.balki.me/anyhttp v0.5.2/go.mod h1:JhfekOIjgVODoVqUCficjpIgmB3wwlB7jhN0eN2EZ/s= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/detectors/gcp v1.35.0 h1:bGvFt68+KTiAKFlacHW6AhA56GF2rS0bdD3aJYEnmzA= -go.opentelemetry.io/contrib/detectors/gcp v1.35.0/go.mod h1:qGWP8/+ILwMRIUf9uIVLloR1uo5ZYAslM4O6OqUi1DA= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= -go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= -go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= -go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= -go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= -go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +go.opentelemetry.io/contrib/detectors/gcp v1.37.0 h1:B+WbN9RPsvobe6q4vP6KgM8/9plR/HNjgGBrfcOlweA= +go.opentelemetry.io/contrib/detectors/gcp v1.37.0/go.mod h1:K5zQ3TT7p2ru9Qkzk0bKtCql0RGkPj9pRjpXgZJZ+rU= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 h1:rbRJ8BBoVMsQShESYZ0FkvcITu8X8QNwJogcLUmDNNw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0/go.mod h1:ru6KHrNtNHxM4nD/vd6QrLVWgKhxPYgblq4VAtNawTQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.37.0 h1:6VjV6Et+1Hd2iLZEPtdV7vie80Yyqf7oikJLjQ/myi0= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.37.0/go.mod h1:u8hcp8ji5gaM/RfcOo8z9NMnf1pVLfVY7lBY2VOGuUU= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -gocloud.dev v0.41.0 h1:qBKd9jZkBKEghYbP/uThpomhedK5s2Gy6Lz7h/zYYrM= -gocloud.dev v0.41.0/go.mod h1:IetpBcWLUwroOOxKr90lhsZ8vWxeSkuszBnW62sbcf0= -gocloud.dev/pubsub/kafkapubsub v0.41.0 h1:Ft6YB77ejqk++VjW51UP39RH/WDAMtv6ed3+PHMxBzg= -gocloud.dev/pubsub/kafkapubsub v0.41.0/go.mod h1:kJf4c6b+4yJk6nXmv33yXKblbrgWmrYCzI5QEsr27G0= -gocloud.dev/pubsub/natspubsub v0.41.0 h1:UxNb0DiAzdnyHut6jcCG7u6lsB/hzxTyZ/RHWeCUJ4Q= -gocloud.dev/pubsub/natspubsub v0.41.0/go.mod h1:uCBKjwvIcuNuf3+ft4wUI9hPHHKQvroxq9ZPB/410ac= -gocloud.dev/pubsub/rabbitpubsub v0.41.0 h1:RutvHbacZxlFr0t3wlr+kz63j53UOfHY3PJR8NKN1EI= -gocloud.dev/pubsub/rabbitpubsub v0.41.0/go.mod h1:s7oQXOlQ2FOj8XmYMv5Ocgs1t+8hIXfsKaWGgECM9SQ= +gocloud.dev v0.43.0 h1:aW3eq4RMyehbJ54PMsh4hsp7iX8cO/98ZRzJJOzN/5M= +gocloud.dev v0.43.0/go.mod h1:eD8rkg7LhKUHrzkEdLTZ+Ty/vgPHPCd+yMQdfelQVu4= +gocloud.dev/pubsub/kafkapubsub v0.43.0 h1:Kgwi0na69W3RgxEffEkdrMhox6A3Q0gajoJtjHGVr/s= +gocloud.dev/pubsub/kafkapubsub v0.43.0/go.mod h1:uKI0CXuj7HJ/YnnOLQ3VkDnuUnkz+q/d+tRzmfhmOOU= +gocloud.dev/pubsub/natspubsub v0.43.0 h1:k35tFoaorvD9Fa26zVEEzyXiMOEyXNHc0pBOmRYvQI0= +gocloud.dev/pubsub/natspubsub v0.43.0/go.mod h1:xJn8TO8pGYieDn6AsRFsYfhQW8cnC+xGmG9APGNxkpQ= +gocloud.dev/pubsub/rabbitpubsub v0.43.0 h1:6nNZFSlJ1dk2GujL8PFltfLz3vC6IbrpjGS4FTduo1s= +gocloud.dev/pubsub/rabbitpubsub v0.43.0/go.mod h1:sEaueAGat+OASRoB3QDkghCtibKttgg7X6zsPTm1pl0= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= -golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI= -golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ= -golang.org/x/image v0.28.0 h1:gdem5JW1OLS4FbkWgLO+7ZeFzYtL3xClb97GaUzYMFE= -golang.org/x/image v0.28.0/go.mod h1:GUJYXtnGKEUgggyzh+Vxt+AviiCcyiwpsl8iQ8MvwGY= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= +golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 h1:SbTAbRFnd5kjQXbczszQ0hdk3ctwYf3qBNH9jIsGclE= +golang.org/x/exp v0.0.0-20250813145105-42675adae3e6/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4= +golang.org/x/image v0.30.0 h1:jD5RhkmVAnjqaCUXfbGBrn3lpxbknfN9w2UhHHU+5B4= +golang.org/x/image v0.30.0/go.mod h1:SAEUTxCCMWSrJcCy/4HwavEsfZZJlYxeHLc6tTiAe/c= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= +golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= -golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= -golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= @@ -592,66 +529,39 @@ golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= -golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= -golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= -golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= -golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= +golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= +golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/api v0.228.0 h1:X2DJ/uoWGnY5obVjewbp8icSL5U4FzuCfy9OjbLSnLs= -google.golang.org/api v0.228.0/go.mod h1:wNvRS1Pbe8r4+IfBIniV8fwCpGwTrYa+kMUDiC5z5a4= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20250324211829-b45e905df463 h1:qEFnJI6AnfZk0NNe8YTyXQh5i//Zxi4gBHwRgp76qpw= -google.golang.org/genproto v0.0.0-20250324211829-b45e905df463/go.mod h1:SqIx1NV9hcvqdLHo7uNZDS5lrUJybQ3evo3+z/WBfA0= -google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 h1:hE3bRWtU6uceqlh4fhrSnUyjKHMKB9KrTLLG+bc0ddM= -google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463/go.mod h1:U90ffi8eUL9MwPcrJylN5+Mk2v3vuPDptd5yyNUiRR8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 h1:e0AIkUUhxyBKh6ssZNrAMeqhA7RKUj42346d1y02i2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= -google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/api v0.247.0 h1:tSd/e0QrUlLsrwMKmkbQhYVa109qIintOls2Wh6bngc= +google.golang.org/api v0.247.0/go.mod h1:r1qZOPmxXffXg6xS5uhx16Fa/UFY8QU/K4bfKrnvovM= +google.golang.org/genproto v0.0.0-20250715232539-7130f93afb79 h1:Nt6z9UHqSlIdIGJdz6KhTIs2VRx/iOsA5iE8bmQNcxs= +google.golang.org/genproto v0.0.0-20250715232539-7130f93afb79/go.mod h1:kTmlBHMPqR5uCZPBvwa2B18mvubkjyY3CRLI0c6fj0s= +google.golang.org/genproto/googleapis/api v0.0.0-20250715232539-7130f93afb79 h1:iOye66xuaAK0WnkPuhQPUFy8eJcmwUXqGGP3om6IxX8= +google.golang.org/genproto/googleapis/api v0.0.0-20250715232539-7130f93afb79/go.mod h1:HKJDgKsFUnv5VAGeQjz8kxcgDP0HoE0iZNp0OdZNlhE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a h1:tPE/Kp+x9dMSwUm/uM0JKK0IfdiJkwAbSMSeZBXXJXc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a/go.mod h1:gw1tLEfykwDz2ET4a12jcXt4couGAm7IwsVaTy0Sflo= +google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4= +google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -659,21 +569,20 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -modernc.org/cc/v4 v4.26.1 h1:+X5NtzVBn0KgsBCBe+xkDC7twLb/jNVj9FPgiwSQO3s= -modernc.org/cc/v4 v4.26.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= +modernc.org/cc/v4 v4.26.3 h1:yEN8dzrkRFnn4PUUKXLYIqVf2PJYAEjMTFjO3BDGc3I= +modernc.org/cc/v4 v4.26.3/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= modernc.org/ccgo/v4 v4.28.0 h1:rjznn6WWehKq7dG4JtLRKxb52Ecv8OUGah8+Z/SfpNU= modernc.org/ccgo/v4 v4.28.0/go.mod h1:JygV3+9AV6SmPhDasu4JgquwU81XAKLd3OKTUDNOiKE= -modernc.org/fileutil v1.3.1 h1:8vq5fe7jdtEvoCf3Zf9Nm0Q05sH6kGx0Op2CPx1wTC8= -modernc.org/fileutil v1.3.1/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc= +modernc.org/fileutil v1.3.15 h1:rJAXTP6ilMW/1+kzDiqmBlHLWszheUFXIyGQIAvjJpY= +modernc.org/fileutil v1.3.15/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc= modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= -modernc.org/libc v1.65.7 h1:Ia9Z4yzZtWNtUIuiPuQ7Qf7kxYrxP1/jeHZzG8bFu00= -modernc.org/libc v1.65.7/go.mod h1:011EQibzzio/VX3ygj1qGFt5kMjP0lHb0qCW5/D/pQU= +modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= +modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= +modernc.org/libc v1.66.7 h1:rjhZ8OSCybKWxS1CJr0hikpEi6Vg+944Ouyrd+bQsoY= +modernc.org/libc v1.66.7/go.mod h1:ln6tbWX0NH+mzApEoDRvilBvAWFt1HX7AUA4VDdVDPM= modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= @@ -682,8 +591,8 @@ modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/sqlite v1.37.1 h1:EgHJK/FPoqC+q2YBXg7fUmES37pCHFc97sI7zSayBEs= -modernc.org/sqlite v1.37.1/go.mod h1:XwdRtsE1MpiBcL54+MbKcaDvcuej+IYSMfLN6gSKV8g= +modernc.org/sqlite v1.38.2 h1:Aclu7+tgjgcQVShZqim41Bbw9Cho0y/7WzYptXqkEek= +modernc.org/sqlite v1.38.2/go.mod h1:cPTJYSlgg3Sfg046yBShXENNtPrWrDX8bsbAQBzgQ5E= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= diff --git a/backend/internal/core/services/service_items.go b/backend/internal/core/services/service_items.go index 650ce6a6..95bb0fb7 100644 --- a/backend/internal/core/services/service_items.go +++ b/backend/internal/core/services/service_items.go @@ -38,6 +38,10 @@ func (svc *ItemService) Create(ctx Context, item repo.ItemCreate) (repo.ItemOut, return svc.repo.Items.Create(ctx, ctx.GID, item) } +func (svc *ItemService) Duplicate(ctx Context, gid, id uuid.UUID, options repo.DuplicateOptions) (repo.ItemOut, error) { + return svc.repo.Items.Duplicate(ctx, gid, id, options) +} + func (svc *ItemService) EnsureAssetID(ctx context.Context, gid uuid.UUID) (int, error) { items, err := svc.repo.Items.GetAllZeroAssetID(ctx, gid) if err != nil { diff --git a/backend/internal/data/ent/entity_predicates.go b/backend/internal/data/ent/entity_predicates.go index b4e4d1f8..0674c542 100644 --- a/backend/internal/data/ent/entity_predicates.go +++ b/backend/internal/data/ent/entity_predicates.go @@ -33,13 +33,15 @@ func AccentInsensitiveContains(field string, searchValue string) predicate.Entit "%"+normalizedSearch+"%", )) case "postgres": - // For PostgreSQL, try to use unaccent extension if available - // Fall back to REPLACE-based normalization if not available - normalizeFunc := buildPostgreSQLNormalizeExpression(s.C(field)) - s.Where(sql.ExprP( - "LOWER("+normalizeFunc+") LIKE ?", - "%"+normalizedSearch+"%", - )) + // For PostgreSQL, use REPLACE-based normalization to avoid unaccent dependency + normalizeFunc := buildGenericNormalizeExpression(s.C(field)) + // Use sql.P() for proper PostgreSQL parameter binding ($1, $2, etc.) + s.Where(sql.P(func(b *sql.Builder) { + b.WriteString("LOWER(") + b.WriteString(normalizeFunc) + b.WriteString(") LIKE ") + b.Arg("%" + normalizedSearch + "%") + })) default: // Default fallback using REPLACE for common accented characters normalizeFunc := buildGenericNormalizeExpression(s.C(field)) @@ -56,15 +58,6 @@ func buildSQLiteNormalizeExpression(fieldExpr string) string { return buildGenericNormalizeExpression(fieldExpr) } -// buildPostgreSQLNormalizeExpression creates a PostgreSQL expression to normalize accented characters -func buildPostgreSQLNormalizeExpression(fieldExpr string) string { - // Use a CASE statement to check if unaccent function exists before using it - // This prevents errors when the unaccent extension is not installed - return "CASE WHEN EXISTS (SELECT 1 FROM pg_proc WHERE proname = 'unaccent') " + - "THEN unaccent(" + fieldExpr + ") " + - "ELSE " + buildGenericNormalizeExpression(fieldExpr) + " END" -} - // buildGenericNormalizeExpression creates a database-agnostic expression to normalize common accented characters func buildGenericNormalizeExpression(fieldExpr string) string { // Chain REPLACE functions to handle the most common accented characters diff --git a/backend/internal/data/ent/entity_predicates_test.go b/backend/internal/data/ent/entity_predicates_test.go index cd993786..90968719 100644 --- a/backend/internal/data/ent/entity_predicates_test.go +++ b/backend/internal/data/ent/entity_predicates_test.go @@ -58,15 +58,6 @@ func TestSQLiteNormalizeExpression(t *testing.T) { assert.Contains(t, result, "'ó'", "Should handle Spanish ó") } -func TestPostgreSQLNormalizeExpression(t *testing.T) { - result := buildPostgreSQLNormalizeExpression("test_field") - - // Should contain unaccent function and CASE WHEN logic - assert.Contains(t, result, "unaccent(") - assert.Contains(t, result, "CASE WHEN EXISTS") - assert.Contains(t, result, "test_field") -} - func TestAccentInsensitivePredicateCreation(t *testing.T) { tests := []struct { name string diff --git a/backend/internal/data/migrations/migrations.go b/backend/internal/data/migrations/migrations.go index 01839220..838ba5eb 100644 --- a/backend/internal/data/migrations/migrations.go +++ b/backend/internal/data/migrations/migrations.go @@ -3,6 +3,8 @@ package migrations import ( "embed" + "fmt" + "github.com/rs/zerolog/log" ) @@ -17,15 +19,16 @@ var sqliteFiles embed.FS // migration files in the binary at build time. The function takes a string // parameter "dialect" which specifies the SQL dialect to use. It returns an // embedded file system containing the migration files for the specified dialect. -func Migrations(dialect string) embed.FS { +func Migrations(dialect string) (embed.FS, error) { switch dialect { case "postgres": - return postgresFiles + return postgresFiles, nil case "sqlite3": - return sqliteFiles + return sqliteFiles, nil default: - log.Fatal().Str("dialect", dialect).Msg("unknown sql dialect") + log.Error().Str("dialect", dialect).Msg("unknown sql dialect") + return embed.FS{}, fmt.Errorf("unknown sql dialect: %s", dialect) } // This should never get hit, but just in case - return sqliteFiles + return sqliteFiles, nil } diff --git a/backend/internal/data/repo/repo_item_attachments.go b/backend/internal/data/repo/repo_item_attachments.go index 1373b0e7..94c79e98 100644 --- a/backend/internal/data/repo/repo_item_attachments.go +++ b/backend/internal/data/repo/repo_item_attachments.go @@ -5,6 +5,15 @@ import ( "context" "crypto/md5" "fmt" + "image" + "io" + "io/fs" + "net/http" + "path/filepath" + "runtime" + "strings" + "time" + "github.com/evanoberholster/imagemeta" "github.com/gen2brain/avif" "github.com/gen2brain/heic" @@ -17,13 +26,6 @@ import ( "github.com/sysadminsmedia/homebox/backend/pkgs/utils" "github.com/zeebo/blake3" "golang.org/x/image/draw" - "image" - "io" - "io/fs" - "net/http" - "path/filepath" - "strings" - "time" "github.com/google/uuid" "github.com/sysadminsmedia/homebox/backend/internal/data/ent" @@ -100,13 +102,30 @@ func (r *AttachmentRepo) path(gid uuid.UUID, hash string) string { } func (r *AttachmentRepo) GetConnString() string { + // Handle the default case for file storage + // which is file:///./ meaning relative to the current working directory if strings.HasPrefix(r.storage.ConnString, "file:///./") { dir, err := filepath.Abs(strings.TrimPrefix(r.storage.ConnString, "file:///./")) + if runtime.GOOS == "windows" { + dir = fmt.Sprintf("/%s", dir) + } if err != nil { log.Err(err).Msg("failed to get absolute path for attachment directory") return r.storage.ConnString } - return fmt.Sprintf("file://%s?no_tmp_dir=true", dir) + return strings.ReplaceAll(fmt.Sprintf("file://%s?no_tmp_dir=true", dir), "\\", "/") + } else if strings.HasPrefix(r.storage.ConnString, "file://") { + // Handle the case for file storage with an absolute path + // Convert Windows paths to a format compatible with fileblob + // e.g. file:///C:/path/to/file becomes file:///C/path + dir := strings.TrimPrefix(strings.ReplaceAll(r.storage.ConnString, "\\", "/"), "file://") + if runtime.GOOS == "windows" { + // Remove the colon from the drive letter (in case the user adds it) + dir = strings.ReplaceAll(dir, ":", "") + // Ensure the path starts with a slash for Windows compatibility + dir = fmt.Sprintf("/%s", dir) + } + return fmt.Sprintf("file://%s", dir) } return r.storage.ConnString } diff --git a/backend/internal/data/repo/repo_items.go b/backend/internal/data/repo/repo_items.go index 6e1718fe..0f0f6090 100644 --- a/backend/internal/data/repo/repo_items.go +++ b/backend/internal/data/repo/repo_items.go @@ -3,9 +3,10 @@ package repo import ( "context" "fmt" - "github.com/sysadminsmedia/homebox/backend/internal/data/ent/entitytype" "time" + "github.com/sysadminsmedia/homebox/backend/internal/data/ent/entitytype" + "github.com/google/uuid" "github.com/sysadminsmedia/homebox/backend/internal/core/services/reporting/eventbus" "github.com/sysadminsmedia/homebox/backend/internal/data/ent" @@ -46,6 +47,13 @@ type ( OrderBy string `json:"orderBy"` } + DuplicateOptions struct { + CopyMaintenance bool `json:"copyMaintenance"` + CopyAttachments bool `json:"copyAttachments"` + CopyCustomFields bool `json:"copyCustomFields"` + CopyPrefix string `json:"copyPrefix"` + } + ItemField struct { ID uuid.UUID `json:"id,omitempty"` Type string `json:"type"` @@ -1011,3 +1019,164 @@ func (e *ItemsRepository) SetPrimaryPhotos(ctx context.Context, gid uuid.UUID) ( return updated, nil } + +// Duplicate creates a copy of an item with configurable options for what data to copy. +// The new item will have the next available asset ID and a customizable prefix in the name. +func (e *ItemsRepository) Duplicate(ctx context.Context, gid, id uuid.UUID, options DuplicateOptions) (ItemOut, error) { + tx, err := e.db.Tx(ctx) + if err != nil { + return ItemOut{}, err + } + committed := false + defer func() { + if !committed { + if err := tx.Rollback(); err != nil { + log.Warn().Err(err).Msg("failed to rollback transaction during item duplication") + } + } + }() + + // Get the original item with all its data + originalItem, err := e.getOne(ctx, item.ID(id), item.HasGroupWith(group.ID(gid))) + if err != nil { + return ItemOut{}, err + } + + nextAssetID, err := e.GetHighestAssetID(ctx, gid) + if err != nil { + return ItemOut{}, err + } + nextAssetID++ + + // Set default copy prefix if not provided + if options.CopyPrefix == "" { + options.CopyPrefix = "Copy of " + } + + // Create the new item directly in the transaction + newItemID := uuid.New() + itemBuilder := tx.Item.Create(). + SetID(newItemID). + SetName(options.CopyPrefix + originalItem.Name). + SetDescription(originalItem.Description). + SetQuantity(originalItem.Quantity). + SetLocationID(originalItem.Location.ID). + SetGroupID(gid). + SetAssetID(int(nextAssetID)). + SetSerialNumber(originalItem.SerialNumber). + SetModelNumber(originalItem.ModelNumber). + SetManufacturer(originalItem.Manufacturer). + SetLifetimeWarranty(originalItem.LifetimeWarranty). + SetWarrantyExpires(originalItem.WarrantyExpires.Time()). + SetWarrantyDetails(originalItem.WarrantyDetails). + SetPurchaseTime(originalItem.PurchaseTime.Time()). + SetPurchaseFrom(originalItem.PurchaseFrom). + SetPurchasePrice(originalItem.PurchasePrice). + SetSoldTime(originalItem.SoldTime.Time()). + SetSoldTo(originalItem.SoldTo). + SetSoldPrice(originalItem.SoldPrice). + SetSoldNotes(originalItem.SoldNotes). + SetNotes(originalItem.Notes). + SetInsured(originalItem.Insured). + SetArchived(originalItem.Archived). + SetSyncChildItemsLocations(originalItem.SyncChildItemsLocations) + + if originalItem.Parent != nil { + itemBuilder.SetParentID(originalItem.Parent.ID) + } + + // Add labels + if len(originalItem.Labels) > 0 { + labelIDs := make([]uuid.UUID, len(originalItem.Labels)) + for i, label := range originalItem.Labels { + labelIDs[i] = label.ID + } + itemBuilder.AddLabelIDs(labelIDs...) + } + + _, err = itemBuilder.Save(ctx) + if err != nil { + return ItemOut{}, err + } + + // Copy custom fields if requested + if options.CopyCustomFields { + for _, field := range originalItem.Fields { + _, err = tx.ItemField.Create(). + SetItemID(newItemID). + SetType(itemfield.Type(field.Type)). + SetName(field.Name). + SetTextValue(field.TextValue). + SetNumberValue(field.NumberValue). + SetBooleanValue(field.BooleanValue). + Save(ctx) + if err != nil { + log.Warn().Err(err).Str("field_name", field.Name).Msg("failed to copy custom field during duplication") + continue + } + } + } + + // Copy attachments if requested + if options.CopyAttachments { + for _, att := range originalItem.Attachments { + // Get the original attachment file + originalAttachment, err := tx.Attachment.Query(). + Where(attachment.ID(att.ID)). + Only(ctx) + if err != nil { + // Log error but continue to copy other attachments + log.Warn().Err(err).Str("attachment_id", att.ID.String()).Msg("failed to find attachment during duplication") + continue + } + + // Create a copy of the attachment with the same file path + // Since files are stored with hash-based paths, this is safe + _, err = tx.Attachment.Create(). + SetItemID(newItemID). + SetType(originalAttachment.Type). + SetTitle(originalAttachment.Title). + SetPath(originalAttachment.Path). + SetMimeType(originalAttachment.MimeType). + SetPrimary(originalAttachment.Primary). + Save(ctx) + if err != nil { + log.Warn().Err(err).Str("original_attachment_id", att.ID.String()).Msg("failed to copy attachment during duplication") + continue + } + } + } + + // Copy maintenance entries if requested + if options.CopyMaintenance { + maintenanceEntries, err := tx.MaintenanceEntry.Query(). + Where(maintenanceentry.HasItemWith(item.ID(id))). + All(ctx) + if err == nil { + for _, entry := range maintenanceEntries { + _, err = tx.MaintenanceEntry.Create(). + SetItemID(newItemID). + SetDate(entry.Date). + SetScheduledDate(entry.ScheduledDate). + SetName(entry.Name). + SetDescription(entry.Description). + SetCost(entry.Cost). + Save(ctx) + if err != nil { + log.Warn().Err(err).Str("maintenance_entry_id", entry.ID.String()).Msg("failed to copy maintenance entry during duplication") + continue + } + } + } + } + + if err := tx.Commit(); err != nil { + return ItemOut{}, err + } + committed = true + + e.publishMutationEvent(gid) + + // Get the final item with all copied data + return e.GetOne(ctx, newItemID) +} diff --git a/backend/internal/data/repo/repo_labels.go b/backend/internal/data/repo/repo_labels.go index 6238a8b3..fab7a1ec 100644 --- a/backend/internal/data/repo/repo_labels.go +++ b/backend/internal/data/repo/repo_labels.go @@ -20,14 +20,14 @@ type LabelRepository struct { type ( LabelCreate struct { Name string `json:"name" validate:"required,min=1,max=255"` - Description string `json:"description" validate:"max=255"` + Description string `json:"description" validate:"max=1000"` Color string `json:"color"` } LabelUpdate struct { ID uuid.UUID `json:"id"` Name string `json:"name" validate:"required,min=1,max=255"` - Description string `json:"description" validate:"max=255"` + Description string `json:"description" validate:"max=1000"` Color string `json:"color"` } diff --git a/backend/internal/sys/config/conf.go b/backend/internal/sys/config/conf.go index 10bca909..bad0ccf0 100644 --- a/backend/internal/sys/config/conf.go +++ b/backend/internal/sys/config/conf.go @@ -61,14 +61,16 @@ type WebConfig struct { } type LabelMakerConf struct { - Width int64 `yaml:"width" conf:"default:526"` - Height int64 `yaml:"height" conf:"default:200"` - Padding int64 `yaml:"padding" conf:"default:32"` - Margin int64 `yaml:"margin" conf:"default:32"` - FontSize float64 `yaml:"font_size" conf:"default:32.0"` - PrintCommand *string `yaml:"string"` - AdditionalInformation *string `yaml:"string"` - DynamicLength bool `yaml:"bool" conf:"default:true"` + Width int64 `yaml:"width" conf:"default:526"` + Height int64 `yaml:"height" conf:"default:200"` + Padding int64 `yaml:"padding" conf:"default:32"` + Margin int64 `yaml:"margin" conf:"default:32"` + FontSize float64 `yaml:"font_size" conf:"default:32.0"` + PrintCommand *string `yaml:"string"` + AdditionalInformation *string `yaml:"string"` + DynamicLength bool `yaml:"bool" conf:"default:true"` + LabelServiceUrl *string `yaml:"label_service_url"` + LabelServiceTimeout *time.Duration `yaml:"label_service_timeout"` } type BarcodeAPIConf struct { diff --git a/backend/internal/sys/config/conf_database.go b/backend/internal/sys/config/conf_database.go index 4cbbdaa9..af674a7e 100644 --- a/backend/internal/sys/config/conf_database.go +++ b/backend/internal/sys/config/conf_database.go @@ -17,7 +17,7 @@ type Database struct { Host string `yaml:"host"` Port string `yaml:"port"` Database string `yaml:"database"` - SslMode string `yaml:"ssl_mode"` + SslMode string `yaml:"ssl_mode" conf:"default:prefer"` SslRootCert string `yaml:"ssl_rootcert"` SslCert string `yaml:"ssl_cert"` SslKey string `yaml:"ssl_key"` diff --git a/backend/pkgs/labelmaker/labelmaker.go b/backend/pkgs/labelmaker/labelmaker.go index fc1406e7..a28bb72a 100644 --- a/backend/pkgs/labelmaker/labelmaker.go +++ b/backend/pkgs/labelmaker/labelmaker.go @@ -9,6 +9,8 @@ import ( "image/png" "io" "log" + "net/http" + "net/url" "os" "os/exec" "path/filepath" @@ -138,11 +140,18 @@ func wrapText(text string, face font.Face, maxWidth int, maxHeight int, lineHeig return wrappedLines, "" } -func GenerateLabel(w io.Writer, params *GenerateParameters) error { +func GenerateLabel(w io.Writer, params *GenerateParameters, cfg *config.Config) error { if err := params.Validate(); err != nil { return err } + // If LabelServiceUrl is configured, fetch the label from the URL instead of generating it + if cfg != nil && cfg.LabelMaker.LabelServiceUrl != nil && *cfg.LabelMaker.LabelServiceUrl != "" { + log.Printf("LabelServiceUrl configured: %s", *cfg.LabelMaker.LabelServiceUrl) + + return fetchLabelFromURL(w, *cfg.LabelMaker.LabelServiceUrl, params, cfg) + } + bodyText := params.DescriptionText if params.AdditionalInformation != nil { bodyText = bodyText + "\n" + *params.AdditionalInformation @@ -218,7 +227,7 @@ func GenerateLabel(w io.Writer, params *GenerateParameters) error { // Create the actual image with calculated height bounds := image.Rect(0, 0, params.Width, requiredHeight) img := image.NewRGBA(bounds) - draw.Draw(img, bounds, &image.Uniform{color.White}, image.Point{}, draw.Src) + draw.Draw(img, bounds, &image.Uniform{C: color.White}, image.Point{}, draw.Src) // Draw QR code onto the image draw.Draw(img, @@ -279,6 +288,98 @@ func createContext(font *truetype.Font, size float64, img *image.RGBA, dpi float return c } +// fetchLabelFromURL fetches an image from the specified URL and writes it to the writer +func fetchLabelFromURL(w io.Writer, serviceURL string, params *GenerateParameters, cfg *config.Config) error { + // Parse the base URL + baseURL, err := url.Parse(serviceURL) + if err != nil { + return fmt.Errorf("failed to parse service URL %s: %w", serviceURL, err) + } + + // Build query parameters with the same attributes passed to print command + query := url.Values{} + query.Set("Width", fmt.Sprintf("%d", params.Width)) + query.Set("Height", fmt.Sprintf("%d", params.Height)) + query.Set("QrSize", fmt.Sprintf("%d", params.QrSize)) + query.Set("Margin", fmt.Sprintf("%d", params.Margin)) + query.Set("ComponentPadding", fmt.Sprintf("%d", params.ComponentPadding)) + query.Set("TitleText", params.TitleText) + query.Set("TitleFontSize", fmt.Sprintf("%f", params.TitleFontSize)) + query.Set("DescriptionText", params.DescriptionText) + query.Set("DescriptionFontSize", fmt.Sprintf("%f", params.DescriptionFontSize)) + query.Set("Dpi", fmt.Sprintf("%f", params.Dpi)) + query.Set("URL", params.URL) + query.Set("DynamicLength", fmt.Sprintf("%t", params.DynamicLength)) + + // Add AdditionalInformation if it exists + if params.AdditionalInformation != nil { + query.Set("AdditionalInformation", *params.AdditionalInformation) + } + + // Set the query parameters + baseURL.RawQuery = query.Encode() + finalServiceURL := baseURL.String() + + log.Printf("Fetching label from URL: %s", finalServiceURL) + + // Use configured timeout or default to 30 seconds + timeout := 30 * time.Second + if cfg != nil && cfg.LabelMaker.LabelServiceTimeout != nil { + timeout = *cfg.LabelMaker.LabelServiceTimeout + } + + // Create HTTP client with configurable timeout + client := &http.Client{ + Timeout: timeout, + } + + // Create HTTP request with custom headers + req, err := http.NewRequest("GET", finalServiceURL, nil) + if err != nil { + return fmt.Errorf("failed to create request for URL %s: %w", finalServiceURL, err) + } + + // Set custom headers + req.Header.Set("User-Agent", "Homebox-LabelMaker/1.0") + req.Header.Set("Accept", "image/*") + + // Make HTTP request to the label service + resp, err := client.Do(req) + if err != nil { + return fmt.Errorf("failed to fetch label from URL %s: %w", finalServiceURL, err) + } + + // Check if the response status is OK + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("label service returned status %d for URL %s", resp.StatusCode, finalServiceURL) + } + + // Check if the response is an image + contentType := resp.Header.Get("Content-Type") + if !strings.HasPrefix(contentType, "image/") { + return fmt.Errorf("label service returned invalid content type %s, expected image/*", contentType) + } + + // Set default max response size (10MB) + maxResponseSize := int64(10 << 20) + if cfg != nil { + maxResponseSize = cfg.Web.MaxUploadSize << 20 + } + limitedReader := io.LimitReader(resp.Body, maxResponseSize) + + // Copy the response body to the writer + _, err = io.Copy(w, limitedReader) + if err != nil { + return fmt.Errorf("failed to write fetched label data: %w", err) + } + + if err := resp.Body.Close(); err != nil { + log.Printf("failed to close response body: %v", err) + } + + return nil +} + func PrintLabel(cfg *config.Config, params *GenerateParameters) error { tmpFile := filepath.Join(os.TempDir(), fmt.Sprintf("label-%d.png", time.Now().UnixNano())) f, err := os.OpenFile(tmpFile, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) @@ -292,7 +393,7 @@ func PrintLabel(cfg *config.Config, params *GenerateParameters) error { } }() - err = GenerateLabel(f, params) + err = GenerateLabel(f, params, cfg) if err != nil { return err } diff --git a/docker-compose.yml b/docker-compose.yml index f576b709..e0240c29 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ services: image: homebox build: context: . - dockerfile: ./Dockerfile.rootless + dockerfile: ./Dockerfile.hardened args: - COMMIT=head - BUILD_TIME=0001-01-01T00:00:00Z diff --git a/docs/en/api/openapi-2.0.json b/docs/en/api/openapi-2.0.json index 2b027605..c62359b9 100644 --- a/docs/en/api/openapi-2.0.json +++ b/docs/en/api/openapi-2.0.json @@ -1 +1,4374 @@ -{"schemes":["https","http"],"swagger":"2.0","info":{"description":"Track, Manage, and Organize your Things.","title":"Homebox API","contact":{"name":"Homebox Team","url":"https://discord.homebox.software"},"version":"1.0"},"host":"demo.homebox.software","basePath":"/api","paths":{"/v1/actions/create-missing-thumbnails":{"post":{"security":[{"Bearer":[]}],"description":"Creates thumbnails for items that are missing them","produces":["application/json"],"tags":["Actions"],"summary":"Create Missing Thumbnails","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ActionAmountResult"}}}}},"/v1/actions/ensure-asset-ids":{"post":{"security":[{"Bearer":[]}],"description":"Ensures all items in the database have an asset ID","produces":["application/json"],"tags":["Actions"],"summary":"Ensure Asset IDs","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ActionAmountResult"}}}}},"/v1/actions/ensure-import-refs":{"post":{"security":[{"Bearer":[]}],"description":"Ensures all items in the database have an import ref","produces":["application/json"],"tags":["Actions"],"summary":"Ensures Import Refs","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ActionAmountResult"}}}}},"/v1/actions/set-primary-photos":{"post":{"security":[{"Bearer":[]}],"description":"Sets the first photo of each item as the primary photo","produces":["application/json"],"tags":["Actions"],"summary":"Set Primary Photos","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ActionAmountResult"}}}}},"/v1/actions/zero-item-time-fields":{"post":{"security":[{"Bearer":[]}],"description":"Resets all item date fields to the beginning of the day","produces":["application/json"],"tags":["Actions"],"summary":"Zero Out Time Fields","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ActionAmountResult"}}}}},"/v1/assets/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"Get Item by Asset ID","parameters":[{"type":"string","description":"Asset ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.PaginationResult-repo_ItemSummary"}}}}},"/v1/currency":{"get":{"produces":["application/json"],"tags":["Base"],"summary":"Currency","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/currencies.Currency"}}}}},"/v1/entities/{id}/attachments":{"post":{"security":[{"Bearer":[]}],"consumes":["multipart/form-data"],"produces":["application/json"],"tags":["Items Attachments"],"summary":"Create Item Attachment","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"file","description":"File attachment","name":"file","in":"formData","required":true},{"type":"string","description":"Type of file","name":"type","in":"formData"},{"type":"boolean","description":"Is this the primary attachment","name":"primary","in":"formData"},{"type":"string","description":"name of the file including extension","name":"name","in":"formData","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/validate.ErrorResponse"}}}}},"/v1/entities/{id}/attachments/{attachment_id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/octet-stream"],"tags":["Items Attachments"],"summary":"Get Item Attachment","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ItemAttachmentToken"}}}},"put":{"security":[{"Bearer":[]}],"tags":["Items Attachments"],"summary":"Update Item Attachment","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true},{"description":"Attachment Update","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.ItemAttachmentUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}}}},"delete":{"security":[{"Bearer":[]}],"tags":["Items Attachments"],"summary":"Delete Item Attachment","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/entities/{id}/maintenance":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Item Maintenance"],"summary":"Get Maintenance Log","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"enum":["scheduled","completed","both"],"type":"string","x-enum-varnames":["MaintenanceFilterStatusScheduled","MaintenanceFilterStatusCompleted","MaintenanceFilterStatusBoth"],"name":"status","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.MaintenanceEntryWithDetails"}}}}},"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Item Maintenance"],"summary":"Create Maintenance Entry","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"description":"Entry Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.MaintenanceEntryCreate"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/repo.MaintenanceEntry"}}}}},"/v1/groups":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Group"],"summary":"Get Group","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.Group"}}}},"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Group"],"summary":"Update Group","parameters":[{"description":"User Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.GroupUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.Group"}}}}},"/v1/groups/invitations":{"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Group"],"summary":"Create Group Invitation","parameters":[{"description":"User Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/v1.GroupInvitationCreate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.GroupInvitation"}}}}},"/v1/groups/statistics":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Statistics"],"summary":"Get Group Statistics","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.GroupStatistics"}}}}},"/v1/groups/statistics/labels":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Statistics"],"summary":"Get Label Statistics","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.TotalsByOrganizer"}}}}}},"/v1/groups/statistics/locations":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Statistics"],"summary":"Get Location Statistics","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.TotalsByOrganizer"}}}}}},"/v1/groups/statistics/purchase-price":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Statistics"],"summary":"Get Purchase Price Statistics","parameters":[{"type":"string","description":"start date","name":"start","in":"query"},{"type":"string","description":"end date","name":"end","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ValueOverTime"}}}}},"/v1/items":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Query All Items","deprecated":true,"parameters":[{"type":"string","description":"search string","name":"q","in":"query"},{"type":"integer","description":"page number","name":"page","in":"query"},{"type":"integer","description":"items per page","name":"pageSize","in":"query"},{"type":"array","items":{"type":"string"},"collectionFormat":"multi","description":"label Ids","name":"labels","in":"query"},{"type":"array","items":{"type":"string"},"collectionFormat":"multi","description":"location Ids","name":"locations","in":"query"},{"type":"array","items":{"type":"string"},"collectionFormat":"multi","description":"parent Ids","name":"parentIds","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.PaginationResult-repo_ItemSummary"}}}},"post":{"security":[{"Bearer":[]}],"consumes":["application/json"],"produces":["application/json"],"tags":["Items"],"summary":"Create Item","deprecated":true,"parameters":[{"description":"Item Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.ItemCreate"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/repo.ItemSummary"}}}}},"/v1/items/export":{"get":{"security":[{"Bearer":[]}],"tags":["Items"],"summary":"(Deprecated) Export Items","deprecated":true,"responses":{"200":{"description":"text/csv","schema":{"type":"string"}}}}},"/v1/items/fields":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Get All Custom Field Names","deprecated":true,"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"type":"string"}}}}}},"/v1/items/fields/values":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Get All Custom Field Values","deprecated":true,"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"type":"string"}}}}}},"/v1/items/import":{"post":{"security":[{"Bearer":[]}],"consumes":["multipart/form-data"],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Import Items","deprecated":true,"parameters":[{"type":"file","description":"Image to upload","name":"csv","in":"formData","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/items/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Get Item","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}}}},"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Update Item","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"description":"Item Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.ItemUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}}}},"delete":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Delete Item","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}},"patch":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Update Item","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"description":"Item Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.ItemPatch"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}}}}},"/v1/items/{id}/attachments":{"post":{"security":[{"Bearer":[]}],"consumes":["multipart/form-data"],"produces":["application/json"],"tags":["Items Attachments"],"summary":"Create Item Attachment","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"file","description":"File attachment","name":"file","in":"formData","required":true},{"type":"string","description":"Type of file","name":"type","in":"formData"},{"type":"boolean","description":"Is this the primary attachment","name":"primary","in":"formData"},{"type":"string","description":"name of the file including extension","name":"name","in":"formData","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/validate.ErrorResponse"}}}}},"/v1/items/{id}/attachments/{attachment_id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/octet-stream"],"tags":["Items Attachments"],"summary":"Get Item Attachment","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.ItemAttachmentToken"}}}},"put":{"security":[{"Bearer":[]}],"tags":["Items Attachments"],"summary":"Update Item Attachment","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true},{"description":"Attachment Update","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.ItemAttachmentUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.ItemOut"}}}},"delete":{"security":[{"Bearer":[]}],"tags":["Items Attachments"],"summary":"Delete Item Attachment","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"string","description":"Attachment ID","name":"attachment_id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/items/{id}/maintenance":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Item Maintenance"],"summary":"Get Maintenance Log","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"enum":["scheduled","completed","both"],"type":"string","x-enum-varnames":["MaintenanceFilterStatusScheduled","MaintenanceFilterStatusCompleted","MaintenanceFilterStatusBoth"],"name":"status","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.MaintenanceEntryWithDetails"}}}}},"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Item Maintenance"],"summary":"Create Maintenance Entry","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"description":"Entry Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.MaintenanceEntryCreate"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/repo.MaintenanceEntry"}}}}},"/v1/items/{id}/path":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"(Deprecated) Get the full path of an item","deprecated":true,"parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.ItemPath"}}}}}},"/v1/labelmaker/assets/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"Get Asset label","parameters":[{"type":"string","description":"Asset ID","name":"id","in":"path","required":true},{"type":"boolean","description":"Print this label, defaults to false","name":"print","in":"query"}],"responses":{"200":{"description":"image/png","schema":{"type":"string"}}}}},"/v1/labelmaker/item/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"Get Item label","parameters":[{"type":"string","description":"Item ID","name":"id","in":"path","required":true},{"type":"boolean","description":"Print this label, defaults to false","name":"print","in":"query"}],"responses":{"200":{"description":"image/png","schema":{"type":"string"}}}}},"/v1/labelmaker/location/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"Get Location label","parameters":[{"type":"string","description":"Location ID","name":"id","in":"path","required":true},{"type":"boolean","description":"Print this label, defaults to false","name":"print","in":"query"}],"responses":{"200":{"description":"image/png","schema":{"type":"string"}}}}},"/v1/labels":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Labels"],"summary":"Get All Labels","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.LabelOut"}}}}},"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Labels"],"summary":"Create Label","parameters":[{"description":"Label Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.LabelCreate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LabelSummary"}}}}},"/v1/labels/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Labels"],"summary":"Get Label","parameters":[{"type":"string","description":"Label ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LabelOut"}}}},"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Labels"],"summary":"Update Label","parameters":[{"type":"string","description":"Label ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LabelOut"}}}},"delete":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Labels"],"summary":"Delete Label","parameters":[{"type":"string","description":"Label ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/locations":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Get All Locations","deprecated":true,"parameters":[{"type":"boolean","description":"Filter locations with parents","name":"filterChildren","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.LocationOutCount"}}}}},"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Create Location","deprecated":true,"parameters":[{"description":"Location Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.LocationCreate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LocationSummary"}}}}},"/v1/locations/tree":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Get Locations Tree","deprecated":true,"parameters":[{"type":"boolean","description":"include items in response tree","name":"withItems","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.TreeItem"}}}}}},"/v1/locations/{id}":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Get Location","deprecated":true,"parameters":[{"type":"string","description":"Location ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LocationOut"}}}},"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Update Location","deprecated":true,"parameters":[{"type":"string","description":"Location ID","name":"id","in":"path","required":true},{"description":"Location Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.LocationUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.LocationOut"}}}},"delete":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Locations"],"summary":"(Deprecated) Delete Location","deprecated":true,"parameters":[{"type":"string","description":"Location ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/maintenance":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Maintenance"],"summary":"Query All Maintenance","parameters":[{"enum":["scheduled","completed","both"],"type":"string","x-enum-varnames":["MaintenanceFilterStatusScheduled","MaintenanceFilterStatusCompleted","MaintenanceFilterStatusBoth"],"name":"status","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.MaintenanceEntryWithDetails"}}}}}},"/v1/maintenance/{id}":{"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Maintenance"],"summary":"Update Maintenance Entry","parameters":[{"type":"string","description":"Maintenance ID","name":"id","in":"path","required":true},{"description":"Entry Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.MaintenanceEntryUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.MaintenanceEntry"}}}},"delete":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Maintenance"],"summary":"Delete Maintenance Entry","parameters":[{"type":"string","description":"Maintenance ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/notifiers":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Notifiers"],"summary":"Get Notifiers","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.NotifierOut"}}}}},"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Notifiers"],"summary":"Create Notifier","parameters":[{"description":"Notifier Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.NotifierCreate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.NotifierOut"}}}}},"/v1/notifiers/test":{"post":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Notifiers"],"summary":"Test Notifier","parameters":[{"type":"string","description":"URL","name":"url","in":"query","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/notifiers/{id}":{"put":{"security":[{"Bearer":[]}],"tags":["Notifiers"],"summary":"Update Notifier","parameters":[{"type":"string","description":"Notifier ID","name":"id","in":"path","required":true},{"description":"Notifier Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.NotifierUpdate"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/repo.NotifierOut"}}}},"delete":{"security":[{"Bearer":[]}],"tags":["Notifiers"],"summary":"Delete a Notifier","parameters":[{"type":"string","description":"Notifier ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content"}}}},"/v1/products/search-from-barcode":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"Search EAN from Barcode","parameters":[{"type":"string","description":"barcode to be searched","name":"data","in":"query"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/repo.BarcodeProduct"}}}}}},"/v1/qrcode":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Items"],"summary":"Create QR Code","parameters":[{"type":"string","description":"data to be encoded into qrcode","name":"data","in":"query"}],"responses":{"200":{"description":"image/jpeg","schema":{"type":"string"}}}}},"/v1/reporting/bill-of-materials":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["Reporting"],"summary":"Export Bill of Materials","responses":{"200":{"description":"text/csv","schema":{"type":"string"}}}}},"/v1/status":{"get":{"produces":["application/json"],"tags":["Base"],"summary":"Application Info","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.APISummary"}}}}},"/v1/users/change-password":{"put":{"security":[{"Bearer":[]}],"tags":["User"],"summary":"Change Password","parameters":[{"description":"Password Payload","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/v1.ChangePassword"}}],"responses":{"204":{"description":"No Content"}}}},"/v1/users/login":{"post":{"consumes":["application/x-www-form-urlencoded","application/json"],"produces":["application/json"],"tags":["Authentication"],"summary":"User Login","parameters":[{"description":"Login Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/v1.LoginForm"}},{"type":"string","description":"auth provider","name":"provider","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/v1.TokenResponse"}}}}},"/v1/users/logout":{"post":{"security":[{"Bearer":[]}],"tags":["Authentication"],"summary":"User Logout","responses":{"204":{"description":"No Content"}}}},"/v1/users/refresh":{"get":{"security":[{"Bearer":[]}],"description":"handleAuthRefresh returns a handler that will issue a new token from an existing token.\nThis does not validate that the user still exists within the database.","tags":["Authentication"],"summary":"User Token Refresh","responses":{"200":{"description":"OK"}}}},"/v1/users/register":{"post":{"produces":["application/json"],"tags":["User"],"summary":"Register New User","parameters":[{"description":"User Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/services.UserRegistration"}}],"responses":{"204":{"description":"No Content"}}}},"/v1/users/self":{"get":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["User"],"summary":"Get User Self","responses":{"200":{"description":"OK","schema":{"allOf":[{"$ref":"#/definitions/v1.Wrapped"},{"type":"object","properties":{"item":{"$ref":"#/definitions/repo.UserOut"}}}]}}}},"put":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["User"],"summary":"Update Account","parameters":[{"description":"User Data","name":"payload","in":"body","required":true,"schema":{"$ref":"#/definitions/repo.UserUpdate"}}],"responses":{"200":{"description":"OK","schema":{"allOf":[{"$ref":"#/definitions/v1.Wrapped"},{"type":"object","properties":{"item":{"$ref":"#/definitions/repo.UserUpdate"}}}]}}}},"delete":{"security":[{"Bearer":[]}],"produces":["application/json"],"tags":["User"],"summary":"Delete Account","responses":{"204":{"description":"No Content"}}}}},"definitions":{"attachment.Type":{"type":"string","enum":["attachment","photo","manual","warranty","attachment","receipt","thumbnail"],"x-enum-varnames":["DefaultType","TypePhoto","TypeManual","TypeWarranty","TypeAttachment","TypeReceipt","TypeThumbnail"]},"authroles.Role":{"type":"string","enum":["user","admin","user","attachments"],"x-enum-varnames":["DefaultRole","RoleAdmin","RoleUser","RoleAttachments"]},"currencies.Currency":{"type":"object","properties":{"code":{"type":"string"},"local":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"}}},"ent.Attachment":{"type":"object","properties":{"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AttachmentQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.AttachmentEdges"}]},"id":{"description":"ID of the ent.","type":"string"},"mime_type":{"description":"MimeType holds the value of the \"mime_type\" field.","type":"string"},"path":{"description":"Path holds the value of the \"path\" field.","type":"string"},"primary":{"description":"Primary holds the value of the \"primary\" field.","type":"boolean"},"title":{"description":"Title holds the value of the \"title\" field.","type":"string"},"type":{"description":"Type holds the value of the \"type\" field.","allOf":[{"$ref":"#/definitions/attachment.Type"}]},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.AttachmentEdges":{"type":"object","properties":{"entity":{"description":"Entity holds the value of the entity edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]},"thumbnail":{"description":"Thumbnail holds the value of the thumbnail edge.","allOf":[{"$ref":"#/definitions/ent.Attachment"}]}}},"ent.AuthRoles":{"type":"object","properties":{"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AuthRolesQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.AuthRolesEdges"}]},"id":{"description":"ID of the ent.","type":"integer"},"role":{"description":"Role holds the value of the \"role\" field.","allOf":[{"$ref":"#/definitions/authroles.Role"}]}}},"ent.AuthRolesEdges":{"type":"object","properties":{"token":{"description":"Token holds the value of the token edge.","allOf":[{"$ref":"#/definitions/ent.AuthTokens"}]}}},"ent.AuthTokens":{"type":"object","properties":{"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AuthTokensQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.AuthTokensEdges"}]},"expires_at":{"description":"ExpiresAt holds the value of the \"expires_at\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"token":{"description":"Token holds the value of the \"token\" field.","type":"array","items":{"type":"integer"}},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.AuthTokensEdges":{"type":"object","properties":{"roles":{"description":"Roles holds the value of the roles edge.","allOf":[{"$ref":"#/definitions/ent.AuthRoles"}]},"user":{"description":"User holds the value of the user edge.","allOf":[{"$ref":"#/definitions/ent.User"}]}}},"ent.Entity":{"type":"object","properties":{"archived":{"description":"Archived holds the value of the \"archived\" field.","type":"boolean"},"asset_id":{"description":"AssetID holds the value of the \"asset_id\" field.","type":"integer"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"description":{"description":"Description holds the value of the \"description\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the EntityQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.EntityEdges"}]},"id":{"description":"ID of the ent.","type":"string"},"import_ref":{"description":"ImportRef holds the value of the \"import_ref\" field.","type":"string"},"insured":{"description":"Insured holds the value of the \"insured\" field.","type":"boolean"},"lifetime_warranty":{"description":"LifetimeWarranty holds the value of the \"lifetime_warranty\" field.","type":"boolean"},"manufacturer":{"description":"Manufacturer holds the value of the \"manufacturer\" field.","type":"string"},"model_number":{"description":"ModelNumber holds the value of the \"model_number\" field.","type":"string"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"notes":{"description":"Notes holds the value of the \"notes\" field.","type":"string"},"purchase_from":{"description":"PurchaseFrom holds the value of the \"purchase_from\" field.","type":"string"},"purchase_price":{"description":"PurchasePrice holds the value of the \"purchase_price\" field.","type":"number"},"purchase_time":{"description":"PurchaseTime holds the value of the \"purchase_time\" field.","type":"string"},"quantity":{"description":"Quantity holds the value of the \"quantity\" field.","type":"integer"},"serial_number":{"description":"SerialNumber holds the value of the \"serial_number\" field.","type":"string"},"sold_notes":{"description":"SoldNotes holds the value of the \"sold_notes\" field.","type":"string"},"sold_price":{"description":"SoldPrice holds the value of the \"sold_price\" field.","type":"number"},"sold_time":{"description":"SoldTime holds the value of the \"sold_time\" field.","type":"string"},"sold_to":{"description":"SoldTo holds the value of the \"sold_to\" field.","type":"string"},"sync_child_entities_locations":{"description":"SyncChildEntitiesLocations holds the value of the \"sync_child_entities_locations\" field.","type":"boolean"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"},"warranty_details":{"description":"WarrantyDetails holds the value of the \"warranty_details\" field.","type":"string"},"warranty_expires":{"description":"WarrantyExpires holds the value of the \"warranty_expires\" field.","type":"string"}}},"ent.EntityEdges":{"type":"object","properties":{"attachments":{"description":"Attachments holds the value of the attachments edge.","type":"array","items":{"$ref":"#/definitions/ent.Attachment"}},"children":{"description":"Children holds the value of the children edge.","type":"array","items":{"$ref":"#/definitions/ent.Entity"}},"entity":{"description":"Entity holds the value of the entity edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]},"fields":{"description":"Fields holds the value of the fields edge.","type":"array","items":{"$ref":"#/definitions/ent.EntityField"}},"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]},"label":{"description":"Label holds the value of the label edge.","type":"array","items":{"$ref":"#/definitions/ent.Label"}},"location":{"description":"Location holds the value of the location edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]},"maintenance_entries":{"description":"MaintenanceEntries holds the value of the maintenance_entries edge.","type":"array","items":{"$ref":"#/definitions/ent.MaintenanceEntry"}},"parent":{"description":"Parent holds the value of the parent edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]},"type":{"description":"Type holds the value of the type edge.","allOf":[{"$ref":"#/definitions/ent.EntityType"}]}}},"ent.EntityField":{"type":"object","properties":{"boolean_value":{"description":"BooleanValue holds the value of the \"boolean_value\" field.","type":"boolean"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"description":{"description":"Description holds the value of the \"description\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the EntityFieldQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.EntityFieldEdges"}]},"id":{"description":"ID of the ent.","type":"string"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"number_value":{"description":"NumberValue holds the value of the \"number_value\" field.","type":"integer"},"text_value":{"description":"TextValue holds the value of the \"text_value\" field.","type":"string"},"time_value":{"description":"TimeValue holds the value of the \"time_value\" field.","type":"string"},"type":{"description":"Type holds the value of the \"type\" field.","allOf":[{"$ref":"#/definitions/entityfield.Type"}]},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.EntityFieldEdges":{"type":"object","properties":{"entity":{"description":"Entity holds the value of the entity edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]}}},"ent.EntityType":{"type":"object","properties":{"color":{"description":"Color holds the value of the \"color\" field.","type":"string"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"description":{"description":"Description holds the value of the \"description\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the EntityTypeQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.EntityTypeEdges"}]},"icon":{"description":"Icon holds the value of the \"icon\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"is_location":{"description":"IsLocation holds the value of the \"is_location\" field.","type":"boolean"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.EntityTypeEdges":{"type":"object","properties":{"entities":{"description":"Entities holds the value of the entities edge.","type":"array","items":{"$ref":"#/definitions/ent.Entity"}},"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]}}},"ent.Group":{"type":"object","properties":{"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"currency":{"description":"Currency holds the value of the \"currency\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the GroupQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.GroupEdges"}]},"id":{"description":"ID of the ent.","type":"string"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.GroupEdges":{"type":"object","properties":{"entities":{"description":"Entities holds the value of the entities edge.","type":"array","items":{"$ref":"#/definitions/ent.Entity"}},"entity_types":{"description":"EntityTypes holds the value of the entity_types edge.","type":"array","items":{"$ref":"#/definitions/ent.EntityType"}},"invitation_tokens":{"description":"InvitationTokens holds the value of the invitation_tokens edge.","type":"array","items":{"$ref":"#/definitions/ent.GroupInvitationToken"}},"labels":{"description":"Labels holds the value of the labels edge.","type":"array","items":{"$ref":"#/definitions/ent.Label"}},"notifiers":{"description":"Notifiers holds the value of the notifiers edge.","type":"array","items":{"$ref":"#/definitions/ent.Notifier"}},"users":{"description":"Users holds the value of the users edge.","type":"array","items":{"$ref":"#/definitions/ent.User"}}}},"ent.GroupInvitationToken":{"type":"object","properties":{"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the GroupInvitationTokenQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.GroupInvitationTokenEdges"}]},"expires_at":{"description":"ExpiresAt holds the value of the \"expires_at\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"token":{"description":"Token holds the value of the \"token\" field.","type":"array","items":{"type":"integer"}},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"},"uses":{"description":"Uses holds the value of the \"uses\" field.","type":"integer"}}},"ent.GroupInvitationTokenEdges":{"type":"object","properties":{"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]}}},"ent.Label":{"type":"object","properties":{"color":{"description":"Color holds the value of the \"color\" field.","type":"string"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"description":{"description":"Description holds the value of the \"description\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the LabelQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.LabelEdges"}]},"id":{"description":"ID of the ent.","type":"string"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.LabelEdges":{"type":"object","properties":{"entities":{"description":"Entities holds the value of the entities edge.","type":"array","items":{"$ref":"#/definitions/ent.Entity"}},"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]}}},"ent.MaintenanceEntry":{"type":"object","properties":{"cost":{"description":"Cost holds the value of the \"cost\" field.","type":"number"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"date":{"description":"Date holds the value of the \"date\" field.","type":"string"},"description":{"description":"Description holds the value of the \"description\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the MaintenanceEntryQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.MaintenanceEntryEdges"}]},"entity_id":{"description":"EntityID holds the value of the \"entity_id\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"scheduled_date":{"description":"ScheduledDate holds the value of the \"scheduled_date\" field.","type":"string"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.MaintenanceEntryEdges":{"type":"object","properties":{"entity":{"description":"Entity holds the value of the entity edge.","allOf":[{"$ref":"#/definitions/ent.Entity"}]}}},"ent.Notifier":{"type":"object","properties":{"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the NotifierQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.NotifierEdges"}]},"group_id":{"description":"GroupID holds the value of the \"group_id\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"is_active":{"description":"IsActive holds the value of the \"is_active\" field.","type":"boolean"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"},"user_id":{"description":"UserID holds the value of the \"user_id\" field.","type":"string"}}},"ent.NotifierEdges":{"type":"object","properties":{"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]},"user":{"description":"User holds the value of the user edge.","allOf":[{"$ref":"#/definitions/ent.User"}]}}},"ent.User":{"type":"object","properties":{"activated_on":{"description":"ActivatedOn holds the value of the \"activated_on\" field.","type":"string"},"created_at":{"description":"CreatedAt holds the value of the \"created_at\" field.","type":"string"},"edges":{"description":"Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the UserQuery when eager-loading is set.","allOf":[{"$ref":"#/definitions/ent.UserEdges"}]},"email":{"description":"Email holds the value of the \"email\" field.","type":"string"},"id":{"description":"ID of the ent.","type":"string"},"is_superuser":{"description":"IsSuperuser holds the value of the \"is_superuser\" field.","type":"boolean"},"name":{"description":"Name holds the value of the \"name\" field.","type":"string"},"role":{"description":"Role holds the value of the \"role\" field.","allOf":[{"$ref":"#/definitions/user.Role"}]},"superuser":{"description":"Superuser holds the value of the \"superuser\" field.","type":"boolean"},"updated_at":{"description":"UpdatedAt holds the value of the \"updated_at\" field.","type":"string"}}},"ent.UserEdges":{"type":"object","properties":{"auth_tokens":{"description":"AuthTokens holds the value of the auth_tokens edge.","type":"array","items":{"$ref":"#/definitions/ent.AuthTokens"}},"group":{"description":"Group holds the value of the group edge.","allOf":[{"$ref":"#/definitions/ent.Group"}]},"notifiers":{"description":"Notifiers holds the value of the notifiers edge.","type":"array","items":{"$ref":"#/definitions/ent.Notifier"}}}},"entityfield.Type":{"type":"string","enum":["text","number","boolean","time"],"x-enum-varnames":["TypeText","TypeNumber","TypeBoolean","TypeTime"]},"repo.BarcodeProduct":{"type":"object","properties":{"barcode":{"type":"string"},"imageBase64":{"type":"string"},"imageURL":{"type":"string"},"item":{"$ref":"#/definitions/repo.ItemCreate"},"manufacturer":{"type":"string"},"modelNumber":{"description":"Identifications","type":"string"},"notes":{"description":"Extras","type":"string"},"search_engine_name":{"type":"string"}}},"repo.Group":{"type":"object","properties":{"createdAt":{"type":"string"},"currency":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.GroupStatistics":{"type":"object","properties":{"totalItemPrice":{"type":"number"},"totalItems":{"type":"integer"},"totalLabels":{"type":"integer"},"totalLocations":{"type":"integer"},"totalUsers":{"type":"integer"},"totalWithWarranty":{"type":"integer"}}},"repo.GroupUpdate":{"type":"object","properties":{"currency":{"type":"string"},"name":{"type":"string"}}},"repo.ItemAttachment":{"type":"object","properties":{"createdAt":{"type":"string"},"id":{"type":"string"},"mimeType":{"type":"string"},"path":{"type":"string"},"primary":{"type":"boolean"},"thumbnail":{"$ref":"#/definitions/ent.Attachment"},"title":{"type":"string"},"type":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.ItemAttachmentUpdate":{"type":"object","properties":{"primary":{"type":"boolean"},"title":{"type":"string"},"type":{"type":"string"}}},"repo.ItemCreate":{"type":"object","required":["name"],"properties":{"description":{"type":"string","maxLength":1000},"labelIds":{"type":"array","items":{"type":"string"}},"locationId":{"description":"Edges","type":"string"},"name":{"type":"string","maxLength":255,"minLength":1},"parentId":{"type":"string","x-nullable":true},"quantity":{"type":"integer"}}},"repo.ItemField":{"type":"object","properties":{"booleanValue":{"type":"boolean"},"id":{"type":"string"},"name":{"type":"string"},"numberValue":{"type":"integer"},"textValue":{"type":"string"},"type":{"type":"string"}}},"repo.ItemOut":{"type":"object","properties":{"archived":{"type":"boolean"},"assetId":{"type":"string","example":"0"},"attachments":{"type":"array","items":{"$ref":"#/definitions/repo.ItemAttachment"}},"createdAt":{"type":"string"},"description":{"type":"string"},"fields":{"type":"array","items":{"$ref":"#/definitions/repo.ItemField"}},"id":{"type":"string"},"imageId":{"type":"string","x-nullable":true,"x-omitempty":true},"insured":{"type":"boolean"},"labels":{"type":"array","items":{"$ref":"#/definitions/repo.LabelSummary"}},"lifetimeWarranty":{"description":"Warranty","type":"boolean"},"location":{"description":"Edges","allOf":[{"$ref":"#/definitions/repo.LocationSummary"}],"x-nullable":true,"x-omitempty":true},"manufacturer":{"type":"string"},"modelNumber":{"type":"string"},"name":{"type":"string"},"notes":{"description":"Extras","type":"string"},"parent":{"allOf":[{"$ref":"#/definitions/repo.ItemSummary"}],"x-nullable":true,"x-omitempty":true},"purchaseFrom":{"type":"string"},"purchasePrice":{"type":"number"},"purchaseTime":{"description":"Purchase","type":"string"},"quantity":{"type":"integer"},"serialNumber":{"type":"string"},"soldNotes":{"type":"string"},"soldPrice":{"type":"number"},"soldTime":{"description":"Sold","type":"string"},"soldTo":{"type":"string"},"syncChildItemsLocations":{"type":"boolean"},"thumbnailId":{"type":"string","x-nullable":true,"x-omitempty":true},"updatedAt":{"type":"string"},"warrantyDetails":{"type":"string"},"warrantyExpires":{"type":"string"}}},"repo.ItemPatch":{"type":"object","properties":{"id":{"type":"string"},"quantity":{"type":"integer","x-nullable":true,"x-omitempty":true}}},"repo.ItemPath":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"$ref":"#/definitions/repo.ItemType"}}},"repo.ItemSummary":{"type":"object","properties":{"archived":{"type":"boolean"},"assetId":{"type":"string","example":"0"},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"imageId":{"type":"string","x-nullable":true,"x-omitempty":true},"insured":{"type":"boolean"},"labels":{"type":"array","items":{"$ref":"#/definitions/repo.LabelSummary"}},"location":{"description":"Edges","allOf":[{"$ref":"#/definitions/repo.LocationSummary"}],"x-nullable":true,"x-omitempty":true},"name":{"type":"string"},"purchasePrice":{"type":"number"},"quantity":{"type":"integer"},"soldTime":{"description":"Sale details","type":"string"},"thumbnailId":{"type":"string","x-nullable":true,"x-omitempty":true},"updatedAt":{"type":"string"}}},"repo.ItemType":{"type":"string","enum":["location","item"],"x-enum-varnames":["ItemTypeLocation","ItemTypeItem"]},"repo.ItemUpdate":{"type":"object","required":["name"],"properties":{"archived":{"type":"boolean"},"assetId":{"type":"string"},"description":{"type":"string","maxLength":1000},"fields":{"type":"array","items":{"$ref":"#/definitions/repo.ItemField"}},"id":{"type":"string"},"insured":{"type":"boolean"},"labelIds":{"type":"array","items":{"type":"string"}},"lifetimeWarranty":{"description":"Warranty","type":"boolean"},"locationId":{"description":"Edges","type":"string"},"manufacturer":{"type":"string"},"modelNumber":{"type":"string"},"name":{"type":"string","maxLength":255,"minLength":1},"notes":{"description":"Extras","type":"string"},"parentId":{"type":"string","x-nullable":true,"x-omitempty":true},"purchaseFrom":{"type":"string","maxLength":255},"purchasePrice":{"type":"number","x-nullable":true,"x-omitempty":true},"purchaseTime":{"description":"Purchase","type":"string"},"quantity":{"type":"integer"},"serialNumber":{"description":"Identifications","type":"string"},"soldNotes":{"type":"string"},"soldPrice":{"type":"number","x-nullable":true,"x-omitempty":true},"soldTime":{"description":"Sold","type":"string"},"soldTo":{"type":"string","maxLength":255},"syncChildItemsLocations":{"type":"boolean"},"warrantyDetails":{"type":"string"},"warrantyExpires":{"type":"string"}}},"repo.LabelCreate":{"type":"object","required":["name"],"properties":{"color":{"type":"string"},"description":{"type":"string","maxLength":255},"name":{"type":"string","maxLength":255,"minLength":1}}},"repo.LabelOut":{"type":"object","properties":{"color":{"type":"string"},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.LabelSummary":{"type":"object","properties":{"color":{"type":"string"},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.LocationCreate":{"type":"object","properties":{"description":{"type":"string"},"name":{"type":"string"},"parentId":{"type":"string","x-nullable":true}}},"repo.LocationOut":{"type":"object","properties":{"children":{"type":"array","items":{"$ref":"#/definitions/repo.LocationSummary"}},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"parent":{"$ref":"#/definitions/repo.LocationSummary"},"totalPrice":{"type":"number"},"updatedAt":{"type":"string"}}},"repo.LocationOutCount":{"type":"object","properties":{"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"itemCount":{"type":"integer"},"name":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.LocationSummary":{"type":"object","properties":{"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"updatedAt":{"type":"string"}}},"repo.LocationUpdate":{"type":"object","properties":{"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"parentId":{"type":"string","x-nullable":true}}},"repo.MaintenanceEntry":{"type":"object","properties":{"completedDate":{"type":"string"},"cost":{"type":"string","example":"0"},"description":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"scheduledDate":{"type":"string"}}},"repo.MaintenanceEntryCreate":{"type":"object","required":["name"],"properties":{"completedDate":{"type":"string"},"cost":{"type":"string","example":"0"},"description":{"type":"string"},"name":{"type":"string"},"scheduledDate":{"type":"string"}}},"repo.MaintenanceEntryUpdate":{"type":"object","properties":{"completedDate":{"type":"string"},"cost":{"type":"string","example":"0"},"description":{"type":"string"},"name":{"type":"string"},"scheduledDate":{"type":"string"}}},"repo.MaintenanceEntryWithDetails":{"type":"object","properties":{"completedDate":{"type":"string"},"cost":{"type":"string","example":"0"},"description":{"type":"string"},"id":{"type":"string"},"itemID":{"type":"string"},"itemName":{"type":"string"},"name":{"type":"string"},"scheduledDate":{"type":"string"}}},"repo.MaintenanceFilterStatus":{"type":"string","enum":["scheduled","completed","both"],"x-enum-varnames":["MaintenanceFilterStatusScheduled","MaintenanceFilterStatusCompleted","MaintenanceFilterStatusBoth"]},"repo.NotifierCreate":{"type":"object","required":["name","url"],"properties":{"isActive":{"type":"boolean"},"name":{"type":"string","maxLength":255,"minLength":1},"url":{"type":"string"}}},"repo.NotifierOut":{"type":"object","properties":{"createdAt":{"type":"string"},"groupId":{"type":"string"},"id":{"type":"string"},"isActive":{"type":"boolean"},"name":{"type":"string"},"updatedAt":{"type":"string"},"url":{"type":"string"},"userId":{"type":"string"}}},"repo.NotifierUpdate":{"type":"object","required":["name"],"properties":{"isActive":{"type":"boolean"},"name":{"type":"string","maxLength":255,"minLength":1},"url":{"type":"string","x-nullable":true}}},"repo.PaginationResult-repo_ItemSummary":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/definitions/repo.ItemSummary"}},"page":{"type":"integer"},"pageSize":{"type":"integer"},"total":{"type":"integer"}}},"repo.TotalsByOrganizer":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"total":{"type":"number"}}},"repo.TreeItem":{"type":"object","properties":{"children":{"type":"array","items":{"$ref":"#/definitions/repo.TreeItem"}},"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"}}},"repo.UserOut":{"type":"object","properties":{"email":{"type":"string"},"groupId":{"type":"string"},"groupName":{"type":"string"},"id":{"type":"string"},"isOwner":{"type":"boolean"},"isSuperuser":{"type":"boolean"},"name":{"type":"string"}}},"repo.UserUpdate":{"type":"object","properties":{"email":{"type":"string"},"name":{"type":"string"}}},"repo.ValueOverTime":{"type":"object","properties":{"end":{"type":"string"},"entries":{"type":"array","items":{"$ref":"#/definitions/repo.ValueOverTimeEntry"}},"start":{"type":"string"},"valueAtEnd":{"type":"number"},"valueAtStart":{"type":"number"}}},"repo.ValueOverTimeEntry":{"type":"object","properties":{"date":{"type":"string"},"name":{"type":"string"},"value":{"type":"number"}}},"services.Latest":{"type":"object","properties":{"date":{"type":"string"},"version":{"type":"string"}}},"services.UserRegistration":{"type":"object","properties":{"email":{"type":"string"},"name":{"type":"string"},"password":{"type":"string"},"token":{"type":"string"}}},"user.Role":{"type":"string","enum":["user","user","owner"],"x-enum-varnames":["DefaultRole","RoleUser","RoleOwner"]},"v1.APISummary":{"type":"object","properties":{"allowRegistration":{"type":"boolean"},"build":{"$ref":"#/definitions/v1.Build"},"demo":{"type":"boolean"},"health":{"type":"boolean"},"labelPrinting":{"type":"boolean"},"latest":{"$ref":"#/definitions/services.Latest"},"message":{"type":"string"},"title":{"type":"string"},"versions":{"type":"array","items":{"type":"string"}}}},"v1.ActionAmountResult":{"type":"object","properties":{"completed":{"type":"integer"}}},"v1.Build":{"type":"object","properties":{"buildTime":{"type":"string"},"commit":{"type":"string"},"version":{"type":"string"}}},"v1.ChangePassword":{"type":"object","properties":{"current":{"type":"string"},"new":{"type":"string"}}},"v1.GroupInvitation":{"type":"object","properties":{"expiresAt":{"type":"string"},"token":{"type":"string"},"uses":{"type":"integer"}}},"v1.GroupInvitationCreate":{"type":"object","required":["uses"],"properties":{"expiresAt":{"type":"string"},"uses":{"type":"integer","maximum":100,"minimum":1}}},"v1.ItemAttachmentToken":{"type":"object","properties":{"token":{"type":"string"}}},"v1.LoginForm":{"type":"object","properties":{"password":{"type":"string","example":"admin"},"stayLoggedIn":{"type":"boolean"},"username":{"type":"string","example":"admin@admin.com"}}},"v1.TokenResponse":{"type":"object","properties":{"attachmentToken":{"type":"string"},"expiresAt":{"type":"string"},"token":{"type":"string"}}},"v1.Wrapped":{"type":"object","properties":{"item":{}}},"validate.ErrorResponse":{"type":"object","properties":{"error":{"type":"string"},"fields":{"type":"string"}}}},"securityDefinitions":{"Bearer":{"description":"\"Type 'Bearer TOKEN' to correctly set the API Key\"","type":"apiKey","name":"Authorization","in":"header"}}} \ No newline at end of file +{ + "schemes": [ + "https", + "http" + ], + "swagger": "2.0", + "info": { + "description": "Track, Manage, and Organize your Things.", + "title": "Homebox API", + "contact": { + "name": "Homebox Team", + "url": "https://discord.homebox.software" + }, + "version": "1.0" + }, + "host": "demo.homebox.software", + "basePath": "/api", + "paths": { + "/v1/actions/create-missing-thumbnails": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Creates thumbnails for items that are missing them", + "produces": [ + "application/json" + ], + "tags": [ + "Actions" + ], + "summary": "Create Missing Thumbnails", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ActionAmountResult" + } + } + } + } + }, + "/v1/actions/ensure-asset-ids": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Ensures all items in the database have an asset ID", + "produces": [ + "application/json" + ], + "tags": [ + "Actions" + ], + "summary": "Ensure Asset IDs", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ActionAmountResult" + } + } + } + } + }, + "/v1/actions/ensure-import-refs": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Ensures all items in the database have an import ref", + "produces": [ + "application/json" + ], + "tags": [ + "Actions" + ], + "summary": "Ensures Import Refs", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ActionAmountResult" + } + } + } + } + }, + "/v1/actions/set-primary-photos": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Sets the first photo of each item as the primary photo", + "produces": [ + "application/json" + ], + "tags": [ + "Actions" + ], + "summary": "Set Primary Photos", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ActionAmountResult" + } + } + } + } + }, + "/v1/actions/zero-item-time-fields": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Resets all item date fields to the beginning of the day", + "produces": [ + "application/json" + ], + "tags": [ + "Actions" + ], + "summary": "Zero Out Time Fields", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ActionAmountResult" + } + } + } + } + }, + "/v1/assets/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get Item by Asset ID", + "parameters": [ + { + "type": "string", + "description": "Asset ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.PaginationResult-repo_ItemSummary" + } + } + } + } + }, + "/v1/currency": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Base" + ], + "summary": "Currency", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/currencies.Currency" + } + } + } + } + }, + "/v1/groups": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Group" + ], + "summary": "Get Group", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.Group" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Group" + ], + "summary": "Update Group", + "parameters": [ + { + "description": "User Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.GroupUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.Group" + } + } + } + } + }, + "/v1/groups/invitations": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Group" + ], + "summary": "Create Group Invitation", + "parameters": [ + { + "description": "User Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1.GroupInvitationCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.GroupInvitation" + } + } + } + } + }, + "/v1/groups/statistics": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Statistics" + ], + "summary": "Get Group Statistics", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.GroupStatistics" + } + } + } + } + }, + "/v1/groups/statistics/labels": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Statistics" + ], + "summary": "Get Label Statistics", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.TotalsByOrganizer" + } + } + } + } + } + }, + "/v1/groups/statistics/locations": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Statistics" + ], + "summary": "Get Location Statistics", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.TotalsByOrganizer" + } + } + } + } + } + }, + "/v1/groups/statistics/purchase-price": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Statistics" + ], + "summary": "Get Purchase Price Statistics", + "parameters": [ + { + "type": "string", + "description": "start date", + "name": "start", + "in": "query" + }, + { + "type": "string", + "description": "end date", + "name": "end", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ValueOverTime" + } + } + } + } + }, + "/v1/items": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Query All Items", + "parameters": [ + { + "type": "string", + "description": "search string", + "name": "q", + "in": "query" + }, + { + "type": "integer", + "description": "page number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "items per page", + "name": "pageSize", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi", + "description": "label Ids", + "name": "labels", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi", + "description": "location Ids", + "name": "locations", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi", + "description": "parent Ids", + "name": "parentIds", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.PaginationResult-repo_ItemSummary" + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Create Item", + "parameters": [ + { + "description": "Item Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.ItemCreate" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/repo.ItemSummary" + } + } + } + } + }, + "/v1/items/export": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Items" + ], + "summary": "Export Items", + "responses": { + "200": { + "description": "text/csv", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/items/fields": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get All Custom Field Names", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/v1/items/fields/values": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get All Custom Field Values", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/v1/items/import": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Import Items", + "parameters": [ + { + "type": "file", + "description": "Image to upload", + "name": "csv", + "in": "formData", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/items/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get Item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Update Item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Item Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.ItemUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Delete Item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + }, + "patch": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Update Item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Item Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.ItemPatch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + } + } + } + }, + "/v1/items/{id}/attachments": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items Attachments" + ], + "summary": "Create Item Attachment", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "file", + "description": "File attachment", + "name": "file", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "Type of file", + "name": "type", + "in": "formData" + }, + { + "type": "boolean", + "description": "Is this the primary attachment", + "name": "primary", + "in": "formData" + }, + { + "type": "string", + "description": "name of the file including extension", + "name": "name", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + }, + "422": { + "description": "Unprocessable Entity", + "schema": { + "$ref": "#/definitions/validate.ErrorResponse" + } + } + } + } + }, + "/v1/items/{id}/attachments/{attachment_id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/octet-stream" + ], + "tags": [ + "Items Attachments" + ], + "summary": "Get Item Attachment", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Attachment ID", + "name": "attachment_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.ItemAttachmentToken" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Items Attachments" + ], + "summary": "Update Item Attachment", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Attachment ID", + "name": "attachment_id", + "in": "path", + "required": true + }, + { + "description": "Attachment Update", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.ItemAttachmentUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Items Attachments" + ], + "summary": "Delete Item Attachment", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Attachment ID", + "name": "attachment_id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/items/{id}/duplicate": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Duplicate Item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Duplicate Options", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.DuplicateOptions" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/repo.ItemOut" + } + } + } + } + }, + "/v1/items/{id}/maintenance": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Item Maintenance" + ], + "summary": "Get Maintenance Log", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "enum": [ + "scheduled", + "completed", + "both" + ], + "type": "string", + "x-enum-varnames": [ + "MaintenanceFilterStatusScheduled", + "MaintenanceFilterStatusCompleted", + "MaintenanceFilterStatusBoth" + ], + "name": "status", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.MaintenanceEntryWithDetails" + } + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Item Maintenance" + ], + "summary": "Create Maintenance Entry", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Entry Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.MaintenanceEntryCreate" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/repo.MaintenanceEntry" + } + } + } + } + }, + "/v1/items/{id}/path": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get the full path of an item", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ItemPath" + } + } + } + } + } + }, + "/v1/labelmaker/assets/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get Asset label", + "parameters": [ + { + "type": "string", + "description": "Asset ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "boolean", + "description": "Print this label, defaults to false", + "name": "print", + "in": "query" + } + ], + "responses": { + "200": { + "description": "image/png", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/labelmaker/item/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Get Item label", + "parameters": [ + { + "type": "string", + "description": "Item ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "boolean", + "description": "Print this label, defaults to false", + "name": "print", + "in": "query" + } + ], + "responses": { + "200": { + "description": "image/png", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/labelmaker/location/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Get Location label", + "parameters": [ + { + "type": "string", + "description": "Location ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "boolean", + "description": "Print this label, defaults to false", + "name": "print", + "in": "query" + } + ], + "responses": { + "200": { + "description": "image/png", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/labels": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Labels" + ], + "summary": "Get All Labels", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.LabelOut" + } + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Labels" + ], + "summary": "Create Label", + "parameters": [ + { + "description": "Label Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.LabelCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LabelSummary" + } + } + } + } + }, + "/v1/labels/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Labels" + ], + "summary": "Get Label", + "parameters": [ + { + "type": "string", + "description": "Label ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LabelOut" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Labels" + ], + "summary": "Update Label", + "parameters": [ + { + "type": "string", + "description": "Label ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LabelOut" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Labels" + ], + "summary": "Delete Label", + "parameters": [ + { + "type": "string", + "description": "Label ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/locations": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Get All Locations", + "parameters": [ + { + "type": "boolean", + "description": "Filter locations with parents", + "name": "filterChildren", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.LocationOutCount" + } + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Create Location", + "parameters": [ + { + "description": "Location Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.LocationCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LocationSummary" + } + } + } + } + }, + "/v1/locations/tree": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Get Locations Tree", + "parameters": [ + { + "type": "boolean", + "description": "include items in response tree", + "name": "withItems", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.TreeItem" + } + } + } + } + } + }, + "/v1/locations/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Get Location", + "parameters": [ + { + "type": "string", + "description": "Location ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LocationOut" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Update Location", + "parameters": [ + { + "type": "string", + "description": "Location ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Location Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.LocationUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.LocationOut" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Locations" + ], + "summary": "Delete Location", + "parameters": [ + { + "type": "string", + "description": "Location ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/maintenance": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Maintenance" + ], + "summary": "Query All Maintenance", + "parameters": [ + { + "enum": [ + "scheduled", + "completed", + "both" + ], + "type": "string", + "x-enum-varnames": [ + "MaintenanceFilterStatusScheduled", + "MaintenanceFilterStatusCompleted", + "MaintenanceFilterStatusBoth" + ], + "name": "status", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.MaintenanceEntryWithDetails" + } + } + } + } + } + }, + "/v1/maintenance/{id}": { + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Maintenance" + ], + "summary": "Update Maintenance Entry", + "parameters": [ + { + "type": "string", + "description": "Maintenance ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Entry Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.MaintenanceEntryUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.MaintenanceEntry" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Maintenance" + ], + "summary": "Delete Maintenance Entry", + "parameters": [ + { + "type": "string", + "description": "Maintenance ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/notifiers": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Notifiers" + ], + "summary": "Get Notifiers", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.NotifierOut" + } + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Notifiers" + ], + "summary": "Create Notifier", + "parameters": [ + { + "description": "Notifier Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.NotifierCreate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.NotifierOut" + } + } + } + } + }, + "/v1/notifiers/test": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Notifiers" + ], + "summary": "Test Notifier", + "parameters": [ + { + "type": "string", + "description": "URL", + "name": "url", + "in": "query", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/notifiers/{id}": { + "put": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Notifiers" + ], + "summary": "Update Notifier", + "parameters": [ + { + "type": "string", + "description": "Notifier ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Notifier Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.NotifierUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/repo.NotifierOut" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Notifiers" + ], + "summary": "Delete a Notifier", + "parameters": [ + { + "type": "string", + "description": "Notifier ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/products/search-from-barcode": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Search EAN from Barcode", + "parameters": [ + { + "type": "string", + "description": "barcode to be searched", + "name": "data", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.BarcodeProduct" + } + } + } + } + } + }, + "/v1/qrcode": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Create QR Code", + "parameters": [ + { + "type": "string", + "description": "data to be encoded into qrcode", + "name": "data", + "in": "query" + } + ], + "responses": { + "200": { + "description": "image/jpeg", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/reporting/bill-of-materials": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Reporting" + ], + "summary": "Export Bill of Materials", + "responses": { + "200": { + "description": "text/csv", + "schema": { + "type": "string" + } + } + } + } + }, + "/v1/status": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Base" + ], + "summary": "Application Info", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.APISummary" + } + } + } + } + }, + "/v1/users/change-password": { + "put": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "User" + ], + "summary": "Change Password", + "parameters": [ + { + "description": "Password Payload", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1.ChangePassword" + } + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/users/login": { + "post": { + "consumes": [ + "application/x-www-form-urlencoded", + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Authentication" + ], + "summary": "User Login", + "parameters": [ + { + "description": "Login Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1.LoginForm" + } + }, + { + "type": "string", + "description": "auth provider", + "name": "provider", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.TokenResponse" + } + } + } + } + }, + "/v1/users/logout": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "tags": [ + "Authentication" + ], + "summary": "User Logout", + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/users/refresh": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "handleAuthRefresh returns a handler that will issue a new token from an existing token.\nThis does not validate that the user still exists within the database.", + "tags": [ + "Authentication" + ], + "summary": "User Token Refresh", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/v1/users/register": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "summary": "Register New User", + "parameters": [ + { + "description": "User Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/services.UserRegistration" + } + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/v1/users/self": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "summary": "Get User Self", + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/v1.Wrapped" + }, + { + "type": "object", + "properties": { + "item": { + "$ref": "#/definitions/repo.UserOut" + } + } + } + ] + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "summary": "Update Account", + "parameters": [ + { + "description": "User Data", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/repo.UserUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/v1.Wrapped" + }, + { + "type": "object", + "properties": { + "item": { + "$ref": "#/definitions/repo.UserUpdate" + } + } + } + ] + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "summary": "Delete Account", + "responses": { + "204": { + "description": "No Content" + } + } + } + } + }, + "definitions": { + "attachment.Type": { + "type": "string", + "enum": [ + "attachment", + "photo", + "manual", + "warranty", + "attachment", + "receipt", + "thumbnail" + ], + "x-enum-varnames": [ + "DefaultType", + "TypePhoto", + "TypeManual", + "TypeWarranty", + "TypeAttachment", + "TypeReceipt", + "TypeThumbnail" + ] + }, + "authroles.Role": { + "type": "string", + "enum": [ + "user", + "admin", + "user", + "attachments" + ], + "x-enum-varnames": [ + "DefaultRole", + "RoleAdmin", + "RoleUser", + "RoleAttachments" + ] + }, + "currencies.Currency": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "local": { + "type": "string" + }, + "name": { + "type": "string" + }, + "symbol": { + "type": "string" + } + } + }, + "ent.Attachment": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AttachmentQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.AttachmentEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "mime_type": { + "description": "MimeType holds the value of the \"mime_type\" field.", + "type": "string" + }, + "path": { + "description": "Path holds the value of the \"path\" field.", + "type": "string" + }, + "primary": { + "description": "Primary holds the value of the \"primary\" field.", + "type": "boolean" + }, + "title": { + "description": "Title holds the value of the \"title\" field.", + "type": "string" + }, + "type": { + "description": "Type holds the value of the \"type\" field.", + "allOf": [ + { + "$ref": "#/definitions/attachment.Type" + } + ] + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.AttachmentEdges": { + "type": "object", + "properties": { + "item": { + "description": "Item holds the value of the item edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Item" + } + ] + }, + "thumbnail": { + "description": "Thumbnail holds the value of the thumbnail edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Attachment" + } + ] + } + } + }, + "ent.AuthRoles": { + "type": "object", + "properties": { + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AuthRolesQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.AuthRolesEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "integer" + }, + "role": { + "description": "Role holds the value of the \"role\" field.", + "allOf": [ + { + "$ref": "#/definitions/authroles.Role" + } + ] + } + } + }, + "ent.AuthRolesEdges": { + "type": "object", + "properties": { + "token": { + "description": "Token holds the value of the token edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.AuthTokens" + } + ] + } + } + }, + "ent.AuthTokens": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AuthTokensQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.AuthTokensEdges" + } + ] + }, + "expires_at": { + "description": "ExpiresAt holds the value of the \"expires_at\" field.", + "type": "string" + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "token": { + "description": "Token holds the value of the \"token\" field.", + "type": "array", + "items": { + "type": "integer" + } + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.AuthTokensEdges": { + "type": "object", + "properties": { + "roles": { + "description": "Roles holds the value of the roles edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.AuthRoles" + } + ] + }, + "user": { + "description": "User holds the value of the user edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.User" + } + ] + } + } + }, + "ent.Group": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "currency": { + "description": "Currency holds the value of the \"currency\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the GroupQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.GroupEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.GroupEdges": { + "type": "object", + "properties": { + "invitation_tokens": { + "description": "InvitationTokens holds the value of the invitation_tokens edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.GroupInvitationToken" + } + }, + "items": { + "description": "Items holds the value of the items edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Item" + } + }, + "labels": { + "description": "Labels holds the value of the labels edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Label" + } + }, + "locations": { + "description": "Locations holds the value of the locations edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Location" + } + }, + "notifiers": { + "description": "Notifiers holds the value of the notifiers edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Notifier" + } + }, + "users": { + "description": "Users holds the value of the users edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.User" + } + } + } + }, + "ent.GroupInvitationToken": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the GroupInvitationTokenQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.GroupInvitationTokenEdges" + } + ] + }, + "expires_at": { + "description": "ExpiresAt holds the value of the \"expires_at\" field.", + "type": "string" + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "token": { + "description": "Token holds the value of the \"token\" field.", + "type": "array", + "items": { + "type": "integer" + } + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + }, + "uses": { + "description": "Uses holds the value of the \"uses\" field.", + "type": "integer" + } + } + }, + "ent.GroupInvitationTokenEdges": { + "type": "object", + "properties": { + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + } + } + }, + "ent.Item": { + "type": "object", + "properties": { + "archived": { + "description": "Archived holds the value of the \"archived\" field.", + "type": "boolean" + }, + "asset_id": { + "description": "AssetID holds the value of the \"asset_id\" field.", + "type": "integer" + }, + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "description": { + "description": "Description holds the value of the \"description\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the ItemQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.ItemEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "import_ref": { + "description": "ImportRef holds the value of the \"import_ref\" field.", + "type": "string" + }, + "insured": { + "description": "Insured holds the value of the \"insured\" field.", + "type": "boolean" + }, + "lifetime_warranty": { + "description": "LifetimeWarranty holds the value of the \"lifetime_warranty\" field.", + "type": "boolean" + }, + "manufacturer": { + "description": "Manufacturer holds the value of the \"manufacturer\" field.", + "type": "string" + }, + "model_number": { + "description": "ModelNumber holds the value of the \"model_number\" field.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "notes": { + "description": "Notes holds the value of the \"notes\" field.", + "type": "string" + }, + "purchase_from": { + "description": "PurchaseFrom holds the value of the \"purchase_from\" field.", + "type": "string" + }, + "purchase_price": { + "description": "PurchasePrice holds the value of the \"purchase_price\" field.", + "type": "number" + }, + "purchase_time": { + "description": "PurchaseTime holds the value of the \"purchase_time\" field.", + "type": "string" + }, + "quantity": { + "description": "Quantity holds the value of the \"quantity\" field.", + "type": "integer" + }, + "serial_number": { + "description": "SerialNumber holds the value of the \"serial_number\" field.", + "type": "string" + }, + "sold_notes": { + "description": "SoldNotes holds the value of the \"sold_notes\" field.", + "type": "string" + }, + "sold_price": { + "description": "SoldPrice holds the value of the \"sold_price\" field.", + "type": "number" + }, + "sold_time": { + "description": "SoldTime holds the value of the \"sold_time\" field.", + "type": "string" + }, + "sold_to": { + "description": "SoldTo holds the value of the \"sold_to\" field.", + "type": "string" + }, + "sync_child_items_locations": { + "description": "SyncChildItemsLocations holds the value of the \"sync_child_items_locations\" field.", + "type": "boolean" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + }, + "warranty_details": { + "description": "WarrantyDetails holds the value of the \"warranty_details\" field.", + "type": "string" + }, + "warranty_expires": { + "description": "WarrantyExpires holds the value of the \"warranty_expires\" field.", + "type": "string" + } + } + }, + "ent.ItemEdges": { + "type": "object", + "properties": { + "attachments": { + "description": "Attachments holds the value of the attachments edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Attachment" + } + }, + "children": { + "description": "Children holds the value of the children edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Item" + } + }, + "fields": { + "description": "Fields holds the value of the fields edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.ItemField" + } + }, + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + }, + "label": { + "description": "Label holds the value of the label edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Label" + } + }, + "location": { + "description": "Location holds the value of the location edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Location" + } + ] + }, + "maintenance_entries": { + "description": "MaintenanceEntries holds the value of the maintenance_entries edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.MaintenanceEntry" + } + }, + "parent": { + "description": "Parent holds the value of the parent edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Item" + } + ] + } + } + }, + "ent.ItemField": { + "type": "object", + "properties": { + "boolean_value": { + "description": "BooleanValue holds the value of the \"boolean_value\" field.", + "type": "boolean" + }, + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "description": { + "description": "Description holds the value of the \"description\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the ItemFieldQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.ItemFieldEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "number_value": { + "description": "NumberValue holds the value of the \"number_value\" field.", + "type": "integer" + }, + "text_value": { + "description": "TextValue holds the value of the \"text_value\" field.", + "type": "string" + }, + "time_value": { + "description": "TimeValue holds the value of the \"time_value\" field.", + "type": "string" + }, + "type": { + "description": "Type holds the value of the \"type\" field.", + "allOf": [ + { + "$ref": "#/definitions/itemfield.Type" + } + ] + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.ItemFieldEdges": { + "type": "object", + "properties": { + "item": { + "description": "Item holds the value of the item edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Item" + } + ] + } + } + }, + "ent.Label": { + "type": "object", + "properties": { + "color": { + "description": "Color holds the value of the \"color\" field.", + "type": "string" + }, + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "description": { + "description": "Description holds the value of the \"description\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the LabelQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.LabelEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.LabelEdges": { + "type": "object", + "properties": { + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + }, + "items": { + "description": "Items holds the value of the items edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Item" + } + } + } + }, + "ent.Location": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "description": { + "description": "Description holds the value of the \"description\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the LocationQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.LocationEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.LocationEdges": { + "type": "object", + "properties": { + "children": { + "description": "Children holds the value of the children edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Location" + } + }, + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + }, + "items": { + "description": "Items holds the value of the items edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Item" + } + }, + "parent": { + "description": "Parent holds the value of the parent edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Location" + } + ] + } + } + }, + "ent.MaintenanceEntry": { + "type": "object", + "properties": { + "cost": { + "description": "Cost holds the value of the \"cost\" field.", + "type": "number" + }, + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "date": { + "description": "Date holds the value of the \"date\" field.", + "type": "string" + }, + "description": { + "description": "Description holds the value of the \"description\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the MaintenanceEntryQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.MaintenanceEntryEdges" + } + ] + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "item_id": { + "description": "ItemID holds the value of the \"item_id\" field.", + "type": "string" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "scheduled_date": { + "description": "ScheduledDate holds the value of the \"scheduled_date\" field.", + "type": "string" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.MaintenanceEntryEdges": { + "type": "object", + "properties": { + "item": { + "description": "Item holds the value of the item edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Item" + } + ] + } + } + }, + "ent.Notifier": { + "type": "object", + "properties": { + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the NotifierQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.NotifierEdges" + } + ] + }, + "group_id": { + "description": "GroupID holds the value of the \"group_id\" field.", + "type": "string" + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "is_active": { + "description": "IsActive holds the value of the \"is_active\" field.", + "type": "boolean" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + }, + "user_id": { + "description": "UserID holds the value of the \"user_id\" field.", + "type": "string" + } + } + }, + "ent.NotifierEdges": { + "type": "object", + "properties": { + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + }, + "user": { + "description": "User holds the value of the user edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.User" + } + ] + } + } + }, + "ent.User": { + "type": "object", + "properties": { + "activated_on": { + "description": "ActivatedOn holds the value of the \"activated_on\" field.", + "type": "string" + }, + "created_at": { + "description": "CreatedAt holds the value of the \"created_at\" field.", + "type": "string" + }, + "edges": { + "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the UserQuery when eager-loading is set.", + "allOf": [ + { + "$ref": "#/definitions/ent.UserEdges" + } + ] + }, + "email": { + "description": "Email holds the value of the \"email\" field.", + "type": "string" + }, + "id": { + "description": "ID of the ent.", + "type": "string" + }, + "is_superuser": { + "description": "IsSuperuser holds the value of the \"is_superuser\" field.", + "type": "boolean" + }, + "name": { + "description": "Name holds the value of the \"name\" field.", + "type": "string" + }, + "role": { + "description": "Role holds the value of the \"role\" field.", + "allOf": [ + { + "$ref": "#/definitions/user.Role" + } + ] + }, + "superuser": { + "description": "Superuser holds the value of the \"superuser\" field.", + "type": "boolean" + }, + "updated_at": { + "description": "UpdatedAt holds the value of the \"updated_at\" field.", + "type": "string" + } + } + }, + "ent.UserEdges": { + "type": "object", + "properties": { + "auth_tokens": { + "description": "AuthTokens holds the value of the auth_tokens edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.AuthTokens" + } + }, + "group": { + "description": "Group holds the value of the group edge.", + "allOf": [ + { + "$ref": "#/definitions/ent.Group" + } + ] + }, + "notifiers": { + "description": "Notifiers holds the value of the notifiers edge.", + "type": "array", + "items": { + "$ref": "#/definitions/ent.Notifier" + } + } + } + }, + "itemfield.Type": { + "type": "string", + "enum": [ + "text", + "number", + "boolean", + "time" + ], + "x-enum-varnames": [ + "TypeText", + "TypeNumber", + "TypeBoolean", + "TypeTime" + ] + }, + "repo.BarcodeProduct": { + "type": "object", + "properties": { + "barcode": { + "type": "string" + }, + "imageBase64": { + "type": "string" + }, + "imageURL": { + "type": "string" + }, + "item": { + "$ref": "#/definitions/repo.ItemCreate" + }, + "manufacturer": { + "type": "string" + }, + "modelNumber": { + "description": "Identifications", + "type": "string" + }, + "notes": { + "description": "Extras", + "type": "string" + }, + "search_engine_name": { + "type": "string" + } + } + }, + "repo.DuplicateOptions": { + "type": "object", + "properties": { + "copyAttachments": { + "type": "boolean" + }, + "copyCustomFields": { + "type": "boolean" + }, + "copyMaintenance": { + "type": "boolean" + }, + "copyPrefix": { + "type": "string" + } + } + }, + "repo.Group": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "currency": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.GroupStatistics": { + "type": "object", + "properties": { + "totalItemPrice": { + "type": "number" + }, + "totalItems": { + "type": "integer" + }, + "totalLabels": { + "type": "integer" + }, + "totalLocations": { + "type": "integer" + }, + "totalUsers": { + "type": "integer" + }, + "totalWithWarranty": { + "type": "integer" + } + } + }, + "repo.GroupUpdate": { + "type": "object", + "properties": { + "currency": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "repo.ItemAttachment": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "path": { + "type": "string" + }, + "primary": { + "type": "boolean" + }, + "thumbnail": { + "$ref": "#/definitions/ent.Attachment" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.ItemAttachmentUpdate": { + "type": "object", + "properties": { + "primary": { + "type": "boolean" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "repo.ItemCreate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "description": { + "type": "string", + "maxLength": 1000 + }, + "labelIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "locationId": { + "description": "Edges", + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + "parentId": { + "type": "string", + "x-nullable": true + }, + "quantity": { + "type": "integer" + } + } + }, + "repo.ItemField": { + "type": "object", + "properties": { + "booleanValue": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "numberValue": { + "type": "integer" + }, + "textValue": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "repo.ItemOut": { + "type": "object", + "properties": { + "archived": { + "type": "boolean" + }, + "assetId": { + "type": "string", + "example": "0" + }, + "attachments": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ItemAttachment" + } + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ItemField" + } + }, + "id": { + "type": "string" + }, + "imageId": { + "type": "string", + "x-nullable": true, + "x-omitempty": true + }, + "insured": { + "type": "boolean" + }, + "labels": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.LabelSummary" + } + }, + "lifetimeWarranty": { + "description": "Warranty", + "type": "boolean" + }, + "location": { + "description": "Edges", + "allOf": [ + { + "$ref": "#/definitions/repo.LocationSummary" + } + ], + "x-nullable": true, + "x-omitempty": true + }, + "manufacturer": { + "type": "string" + }, + "modelNumber": { + "type": "string" + }, + "name": { + "type": "string" + }, + "notes": { + "description": "Extras", + "type": "string" + }, + "parent": { + "allOf": [ + { + "$ref": "#/definitions/repo.ItemSummary" + } + ], + "x-nullable": true, + "x-omitempty": true + }, + "purchaseFrom": { + "type": "string" + }, + "purchasePrice": { + "type": "number" + }, + "purchaseTime": { + "description": "Purchase", + "type": "string" + }, + "quantity": { + "type": "integer" + }, + "serialNumber": { + "type": "string" + }, + "soldNotes": { + "type": "string" + }, + "soldPrice": { + "type": "number" + }, + "soldTime": { + "description": "Sold", + "type": "string" + }, + "soldTo": { + "type": "string" + }, + "syncChildItemsLocations": { + "type": "boolean" + }, + "thumbnailId": { + "type": "string", + "x-nullable": true, + "x-omitempty": true + }, + "updatedAt": { + "type": "string" + }, + "warrantyDetails": { + "type": "string" + }, + "warrantyExpires": { + "type": "string" + } + } + }, + "repo.ItemPatch": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "quantity": { + "type": "integer", + "x-nullable": true, + "x-omitempty": true + } + } + }, + "repo.ItemPath": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "$ref": "#/definitions/repo.ItemType" + } + } + }, + "repo.ItemSummary": { + "type": "object", + "properties": { + "archived": { + "type": "boolean" + }, + "assetId": { + "type": "string", + "example": "0" + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "imageId": { + "type": "string", + "x-nullable": true, + "x-omitempty": true + }, + "insured": { + "type": "boolean" + }, + "labels": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.LabelSummary" + } + }, + "location": { + "description": "Edges", + "allOf": [ + { + "$ref": "#/definitions/repo.LocationSummary" + } + ], + "x-nullable": true, + "x-omitempty": true + }, + "name": { + "type": "string" + }, + "purchasePrice": { + "type": "number" + }, + "quantity": { + "type": "integer" + }, + "soldTime": { + "description": "Sale details", + "type": "string" + }, + "thumbnailId": { + "type": "string", + "x-nullable": true, + "x-omitempty": true + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.ItemType": { + "type": "string", + "enum": [ + "location", + "item" + ], + "x-enum-varnames": [ + "ItemTypeLocation", + "ItemTypeItem" + ] + }, + "repo.ItemUpdate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "archived": { + "type": "boolean" + }, + "assetId": { + "type": "string" + }, + "description": { + "type": "string", + "maxLength": 1000 + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ItemField" + } + }, + "id": { + "type": "string" + }, + "insured": { + "type": "boolean" + }, + "labelIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "lifetimeWarranty": { + "description": "Warranty", + "type": "boolean" + }, + "locationId": { + "description": "Edges", + "type": "string" + }, + "manufacturer": { + "type": "string" + }, + "modelNumber": { + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + "notes": { + "description": "Extras", + "type": "string" + }, + "parentId": { + "type": "string", + "x-nullable": true, + "x-omitempty": true + }, + "purchaseFrom": { + "type": "string", + "maxLength": 255 + }, + "purchasePrice": { + "type": "number", + "x-nullable": true, + "x-omitempty": true + }, + "purchaseTime": { + "description": "Purchase", + "type": "string" + }, + "quantity": { + "type": "integer" + }, + "serialNumber": { + "description": "Identifications", + "type": "string" + }, + "soldNotes": { + "type": "string" + }, + "soldPrice": { + "type": "number", + "x-nullable": true, + "x-omitempty": true + }, + "soldTime": { + "description": "Sold", + "type": "string" + }, + "soldTo": { + "type": "string", + "maxLength": 255 + }, + "syncChildItemsLocations": { + "type": "boolean" + }, + "warrantyDetails": { + "type": "string" + }, + "warrantyExpires": { + "type": "string" + } + } + }, + "repo.LabelCreate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "color": { + "type": "string" + }, + "description": { + "type": "string", + "maxLength": 1000 + }, + "name": { + "type": "string", + "maxLength": 255, + "minLength": 1 + } + } + }, + "repo.LabelOut": { + "type": "object", + "properties": { + "color": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.LabelSummary": { + "type": "object", + "properties": { + "color": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.LocationCreate": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "parentId": { + "type": "string", + "x-nullable": true + } + } + }, + "repo.LocationOut": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.LocationSummary" + } + }, + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "parent": { + "$ref": "#/definitions/repo.LocationSummary" + }, + "totalPrice": { + "type": "number" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.LocationOutCount": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "itemCount": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.LocationSummary": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, + "repo.LocationUpdate": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "parentId": { + "type": "string", + "x-nullable": true + } + } + }, + "repo.MaintenanceEntry": { + "type": "object", + "properties": { + "completedDate": { + "type": "string" + }, + "cost": { + "type": "string", + "example": "0" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "scheduledDate": { + "type": "string" + } + } + }, + "repo.MaintenanceEntryCreate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "completedDate": { + "type": "string" + }, + "cost": { + "type": "string", + "example": "0" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "scheduledDate": { + "type": "string" + } + } + }, + "repo.MaintenanceEntryUpdate": { + "type": "object", + "properties": { + "completedDate": { + "type": "string" + }, + "cost": { + "type": "string", + "example": "0" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "scheduledDate": { + "type": "string" + } + } + }, + "repo.MaintenanceEntryWithDetails": { + "type": "object", + "properties": { + "completedDate": { + "type": "string" + }, + "cost": { + "type": "string", + "example": "0" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "itemID": { + "type": "string" + }, + "itemName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "scheduledDate": { + "type": "string" + } + } + }, + "repo.MaintenanceFilterStatus": { + "type": "string", + "enum": [ + "scheduled", + "completed", + "both" + ], + "x-enum-varnames": [ + "MaintenanceFilterStatusScheduled", + "MaintenanceFilterStatusCompleted", + "MaintenanceFilterStatusBoth" + ] + }, + "repo.NotifierCreate": { + "type": "object", + "required": [ + "name", + "url" + ], + "properties": { + "isActive": { + "type": "boolean" + }, + "name": { + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + "url": { + "type": "string" + } + } + }, + "repo.NotifierOut": { + "type": "object", + "properties": { + "createdAt": { + "type": "string" + }, + "groupId": { + "type": "string" + }, + "id": { + "type": "string" + }, + "isActive": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string" + } + } + }, + "repo.NotifierUpdate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "isActive": { + "type": "boolean" + }, + "name": { + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + "url": { + "type": "string", + "x-nullable": true + } + } + }, + "repo.PaginationResult-repo_ItemSummary": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ItemSummary" + } + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "total": { + "type": "integer" + } + } + }, + "repo.TotalsByOrganizer": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "total": { + "type": "number" + } + } + }, + "repo.TreeItem": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.TreeItem" + } + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "repo.UserOut": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "groupId": { + "type": "string" + }, + "groupName": { + "type": "string" + }, + "id": { + "type": "string" + }, + "isOwner": { + "type": "boolean" + }, + "isSuperuser": { + "type": "boolean" + }, + "name": { + "type": "string" + } + } + }, + "repo.UserUpdate": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "repo.ValueOverTime": { + "type": "object", + "properties": { + "end": { + "type": "string" + }, + "entries": { + "type": "array", + "items": { + "$ref": "#/definitions/repo.ValueOverTimeEntry" + } + }, + "start": { + "type": "string" + }, + "valueAtEnd": { + "type": "number" + }, + "valueAtStart": { + "type": "number" + } + } + }, + "repo.ValueOverTimeEntry": { + "type": "object", + "properties": { + "date": { + "type": "string" + }, + "name": { + "type": "string" + }, + "value": { + "type": "number" + } + } + }, + "services.Latest": { + "type": "object", + "properties": { + "date": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "services.UserRegistration": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "name": { + "type": "string" + }, + "password": { + "type": "string" + }, + "token": { + "type": "string" + } + } + }, + "user.Role": { + "type": "string", + "enum": [ + "user", + "user", + "owner" + ], + "x-enum-varnames": [ + "DefaultRole", + "RoleUser", + "RoleOwner" + ] + }, + "v1.APISummary": { + "type": "object", + "properties": { + "allowRegistration": { + "type": "boolean" + }, + "build": { + "$ref": "#/definitions/v1.Build" + }, + "demo": { + "type": "boolean" + }, + "health": { + "type": "boolean" + }, + "labelPrinting": { + "type": "boolean" + }, + "latest": { + "$ref": "#/definitions/services.Latest" + }, + "message": { + "type": "string" + }, + "title": { + "type": "string" + }, + "versions": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "v1.ActionAmountResult": { + "type": "object", + "properties": { + "completed": { + "type": "integer" + } + } + }, + "v1.Build": { + "type": "object", + "properties": { + "buildTime": { + "type": "string" + }, + "commit": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "v1.ChangePassword": { + "type": "object", + "properties": { + "current": { + "type": "string" + }, + "new": { + "type": "string" + } + } + }, + "v1.GroupInvitation": { + "type": "object", + "properties": { + "expiresAt": { + "type": "string" + }, + "token": { + "type": "string" + }, + "uses": { + "type": "integer" + } + } + }, + "v1.GroupInvitationCreate": { + "type": "object", + "required": [ + "uses" + ], + "properties": { + "expiresAt": { + "type": "string" + }, + "uses": { + "type": "integer", + "maximum": 100, + "minimum": 1 + } + } + }, + "v1.ItemAttachmentToken": { + "type": "object", + "properties": { + "token": { + "type": "string" + } + } + }, + "v1.LoginForm": { + "type": "object", + "properties": { + "password": { + "type": "string", + "example": "admin" + }, + "stayLoggedIn": { + "type": "boolean" + }, + "username": { + "type": "string", + "example": "admin@admin.com" + } + } + }, + "v1.TokenResponse": { + "type": "object", + "properties": { + "attachmentToken": { + "type": "string" + }, + "expiresAt": { + "type": "string" + }, + "token": { + "type": "string" + } + } + }, + "v1.Wrapped": { + "type": "object", + "properties": { + "item": {} + } + }, + "validate.ErrorResponse": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "fields": { + "type": "string" + } + } + } + }, + "securityDefinitions": { + "Bearer": { + "description": "\"Type 'Bearer TOKEN' to correctly set the API Key\"", + "type": "apiKey", + "name": "Authorization", + "in": "header" + } + } +} \ No newline at end of file diff --git a/docs/en/api/openapi-2.0.yaml b/docs/en/api/openapi-2.0.yaml index b14734bc..cf1289d8 100644 --- a/docs/en/api/openapi-2.0.yaml +++ b/docs/en/api/openapi-2.0.yaml @@ -675,6 +675,17 @@ definitions: search_engine_name: type: string type: object + repo.DuplicateOptions: + properties: + copyAttachments: + type: boolean + copyCustomFields: + type: boolean + copyMaintenance: + type: boolean + copyPrefix: + type: string + type: object repo.Group: properties: createdAt: @@ -1020,7 +1031,7 @@ definitions: color: type: string description: - maxLength: 255 + maxLength: 1000 type: string name: maxLength: 255 @@ -2163,6 +2174,32 @@ paths: summary: Update Item Attachment tags: - Items Attachments + /v1/items/{id}/duplicate: + post: + parameters: + - description: Item ID + in: path + name: id + required: true + type: string + - description: Duplicate Options + in: body + name: payload + required: true + schema: + $ref: '#/definitions/repo.DuplicateOptions' + produces: + - application/json + responses: + "201": + description: Created + schema: + $ref: '#/definitions/repo.ItemOut' + security: + - Bearer: [] + summary: Duplicate Item + tags: + - Items /v1/items/{id}/maintenance: get: deprecated: true diff --git a/docs/en/configure/index.md b/docs/en/configure/index.md index b3147d6b..f1878b09 100644 --- a/docs/en/configure/index.md +++ b/docs/en/configure/index.md @@ -16,11 +16,11 @@ aside: false | HBOX_OPTIONS_AUTO_INCREMENT_ASSET_ID | true | auto-increments the asset_id field for new items | | HBOX_OPTIONS_CURRENCY_CONFIG | | json configuration file containing additional currencie | | HBOX_OPTIONS_ALLOW_ANALYTICS | false | Allows the homebox team to view extremely basic information about the system that your running on. This helps make decisions regarding builds and other general decisions. | -| HBOX_WEB_MAX_UPLOAD | 10 | maximum file upload size supported in MB | +| HBOX_WEB_MAX_UPLOAD_SIZE | 10 | maximum file upload size supported in MB | | HBOX_WEB_READ_TIMEOUT | 10s | Read timeout of HTTP sever | | HBOX_WEB_WRITE_TIMEOUT | 10s | Write timeout of HTTP server | | HBOX_WEB_IDLE_TIMEOUT | 30s | Idle timeout of HTTP server | -| HBOX_STORAGE_CONN_STRING | file://./ | path to the data directory, do not change this if you're using docker | +| HBOX_STORAGE_CONN_STRING | file:///./ | path to the data directory, do not change this if you're using docker | | HBOX_STORAGE_PREFIX_PATH | .data | prefix path for the storage, if not set the storage will be used as is | | HBOX_LOG_LEVEL | `info` | log level to use, can be one of `trace`, `debug`, `info`, `warn`, `error`, `critical` | | HBOX_LOG_FORMAT | `text` | log format to use, can be one of: `text`, `json` | @@ -29,20 +29,18 @@ aside: false | HBOX_MAILER_USERNAME | | email user to use | | HBOX_MAILER_PASSWORD | | email password to use | | HBOX_MAILER_FROM | | email from address to use | -| HBOX_SWAGGER_HOST | 7745 | swagger host to use, if not set swagger will be disabled | -| HBOX_SWAGGER_SCHEMA | `http` | swagger schema to use, can be one of: `http`, `https` | | HBOX_DATABASE_DRIVER | sqlite3 | sets the correct database type (`sqlite3` or `postgres`) | -| HBOX_DATABASE_SQLITE_PATH | ./.data/homebox.db?_pragma=busy_timeout=999&_pragma=journal_mode=WAL&_fk=1 | sets the directory path for Sqlite | +| HBOX_DATABASE_SQLITE_PATH | ./.data/homebox.db?_pragma=busy_timeout=999&_pragma=journal_mode=WAL&_fk=1&_time_format=sqlite | sets the directory path for Sqlite | | HBOX_DATABASE_HOST | | sets the hostname for a postgres database | | HBOX_DATABASE_PORT | | sets the port for a postgres database | | HBOX_DATABASE_USERNAME | | sets the username for a postgres connection (optional if using cert auth) | | HBOX_DATABASE_PASSWORD | | sets the password for a postgres connection (optional if using cert auth) | | HBOX_DATABASE_DATABASE | | sets the database for a postgres connection | -| HBOX_DATABASE_SSL_MODE | | sets the sslmode for a postgres connection | +| HBOX_DATABASE_SSL_MODE | prefer | sets the sslmode for a postgres connection | | HBOX_DATABASE_SSL_CERT | | sets the sslcert for a postgres connection (should be a path) | | HBOX_DATABASE_SSL_KEY | | sets the sslkey for a postgres connection (should be a path) | -| HBOX_DATABASE_SSL_ROOTCERT | | sets the sslrootcert for a postgres connection (should be a path) | -| HBOX_OPTIONS_CHECK_GITHUB_RELEASE | true | check for new github releases | +| HBOX_DATABASE_SSL_ROOT_CERT | | sets the sslrootcert for a postgres connection (should be a path) | +| HBOX_OPTIONS_GITHUB_RELEASE_CHECK | true | check for new github releases | | HBOX_LABEL_MAKER_WIDTH | 526 | width for generated labels in pixels | | HBOX_LABEL_MAKER_HEIGHT | 200 | height for generated labels in pixels | | HBOX_LABEL_MAKER_PADDING | 32 | space between elements on label | @@ -160,8 +158,8 @@ OPTIONS --mode/$HBOX_MODE (default: development) --web-port/$HBOX_WEB_PORT (default: 7745) --web-host/$HBOX_WEB_HOST ---web-max-file-upload/$HBOX_WEB_MAX_FILE_UPLOAD (default: 10) ---storage-conn-string/$HBOX_STORAGE_CONN_STRING (default: file://./) +--web-max-upload-size/$HBOX_WEB_MAX_UPLOAD_SIZE (default: 10) +--storage-conn-string/$HBOX_STORAGE_CONN_STRING (default: file:///./) --storage-prefix-path/$HBOX_STORAGE_PREFIX_PATH (default: .data) --log-level/$HBOX_LOG_LEVEL (default: info) --log-format/$HBOX_LOG_FORMAT (default: text) @@ -170,31 +168,29 @@ OPTIONS --mailer-username/$HBOX_MAILER_USERNAME --mailer-password/$HBOX_MAILER_PASSWORD --mailer-from/$HBOX_MAILER_FROM ---swagger-host/$HBOX_SWAGGER_HOST (default: localhost:7745) ---swagger-scheme/$HBOX_SWAGGER_SCHEME (default: http) --demo/$HBOX_DEMO --debug-enabled/$HBOX_DEBUG_ENABLED (default: false) --debug-port/$HBOX_DEBUG_PORT (default: 4000) --database-driver/$HBOX_DATABASE_DRIVER (default: sqlite3) ---database-sqlite-path/$HBOX_DATABASE_SQLITE_PATH (default: ./.data/homebox.db?_pragma=busy_timeout=999&_pragma=journal_mode=WAL&_fk=1) +--database-sqlite-path/$HBOX_DATABASE_SQLITE_PATH (default: ./.data/homebox.db?_pragma=busy_timeout=999&_pragma=journal_mode=WAL&_fk=1&_time_format=sqlite) --database-host/$HBOX_DATABASE_HOST --database-port/$HBOX_DATABASE_PORT --database-username/$HBOX_DATABASE_USERNAME --database-password/$HBOX_DATABASE_PASSWORD --database-database/$HBOX_DATABASE_DATABASE ---database-ssl-mode/$HBOX_DATABASE_SSL_MODE +--database-ssl-mode/$HBOX_DATABASE_SSL_MODE (default: prefer) --options-allow-registration/$HBOX_OPTIONS_ALLOW_REGISTRATION (default: true) --options-auto-increment-asset-id/$HBOX_OPTIONS_AUTO_INCREMENT_ASSET_ID (default: true) --options-currency-config/$HBOX_OPTIONS_CURRENCY_CONFIG ---options-check-github-release/$HBOX_OPTIONS_CHECK_GITHUB_RELEASE (default: true) +--options-github-release-check/$HBOX_OPTIONS_GITHUB_RELEASE_CHECK (default: true) --options-allow-analytics/$HBOX_OPTIONS_ALLOW_ANALYTICS (default: false) --label-maker-width/$HBOX_LABEL_MAKER_WIDTH (default: 526) --label-maker-height/$HBOX_LABEL_MAKER_HEIGHT (default: 200) --label-maker-padding/$HBOX_LABEL_MAKER_PADDING (default: 32) ---label-maker-margin/$HBOX_LABEL_MAKER_MARGIN (default: 32) +--label-maker-margin/$HBOX_LABEL_MAKER_MARGIN (default: 32) --label-maker-font-size/$HBOX_LABEL_MAKER_FONT_SIZE (default: 32.0) --label-maker-print-command/$HBOX_LABEL_MAKER_PRINT_COMMAND ---label-maker-additional-information/$HBOX_LABEL_MAKER_DYNAMIC_LENGTH (default: true) +--label-maker-dynamic-length/$HBOX_LABEL_MAKER_DYNAMIC_LENGTH (default: true) --label-maker-additional-information/$HBOX_LABEL_MAKER_ADDITIONAL_INFORMATION --thumbnail-enabled/$HBOX_THUMBNAIL_ENABLED (default: true) --thumbnail-width/$HBOX_THUMBNAIL_WIDTH (default: 500) diff --git a/frontend/components/App/QuickMenuModal.vue b/frontend/components/App/QuickMenuModal.vue index 8ce72f56..4d443033 100644 --- a/frontend/components/App/QuickMenuModal.vue +++ b/frontend/components/App/QuickMenuModal.vue @@ -1,6 +1,6 @@ + + + + diff --git a/frontend/components/Form/DatePicker.vue b/frontend/components/Form/DatePicker.vue index 8ef24a04..de14338d 100644 --- a/frontend/components/Form/DatePicker.vue +++ b/frontend/components/Form/DatePicker.vue @@ -15,6 +15,7 @@ import "@vuepic/vue-datepicker/dist/main.css"; import * as datelib from "~/lib/datelib/datelib"; import { Label } from "@/components/ui/label"; + import { darkThemes } from "~/lib/data/themes"; const emit = defineEmits(["update:modelValue", "update:text"]); @@ -34,7 +35,7 @@ }, }); - const isDark = useIsDark(); + const isDark = useIsThemeInList(darkThemes); const formatDate = (date: Date | string | number) => fmtDate(date, "human", "date"); diff --git a/frontend/components/Item/BarcodeModal.vue b/frontend/components/Item/BarcodeModal.vue index 006270f8..454d2626 100644 --- a/frontend/components/Item/BarcodeModal.vue +++ b/frontend/components/Item/BarcodeModal.vue @@ -149,7 +149,7 @@ const headers = defaultHeaders; onMounted(() => { - registerOpenDialogCallback(DialogID.ProductImport, params => { + const cleanup = registerOpenDialogCallback(DialogID.ProductImport, params => { selectedRow.value = -1; searching.value = false; errorMessage.value = null; @@ -168,6 +168,8 @@ products.value = null; } }); + + onUnmounted(cleanup); }); const api = useUserApi(); @@ -180,7 +182,9 @@ selectedRow.value < products.value.length ) { const p = products.value![selectedRow.value]; - openDialog(DialogID.CreateItem, { product: p }); + openDialog(DialogID.CreateItem, { + params: { product: p }, + }); } } diff --git a/frontend/components/Item/CreateModal.vue b/frontend/components/Item/CreateModal.vue index 132a1c60..ca29446b 100644 --- a/frontend/components/Item/CreateModal.vue +++ b/frontend/components/Item/CreateModal.vue @@ -300,7 +300,7 @@ } onMounted(() => { - registerOpenDialogCallback(DialogID.CreateItem, async params => { + const cleanup = registerOpenDialogCallback(DialogID.CreateItem, async params => { // needed since URL will be cleared in the next step => ParentId Selection should stay though subItemCreate.value = subItemCreateParam.value === "y"; let parentItemLocationId = null; @@ -359,6 +359,8 @@ form.labels = labels.value.filter(l => l.id === labelId.value).map(l => l.id); } }); + + onUnmounted(cleanup); }); async function create(close = true) { diff --git a/frontend/components/Item/DuplicateSettings.vue b/frontend/components/Item/DuplicateSettings.vue new file mode 100644 index 00000000..2f1505e0 --- /dev/null +++ b/frontend/components/Item/DuplicateSettings.vue @@ -0,0 +1,83 @@ + + + diff --git a/frontend/components/Item/ImageDialog.vue b/frontend/components/Item/ImageDialog.vue new file mode 100644 index 00000000..c99e3106 --- /dev/null +++ b/frontend/components/Item/ImageDialog.vue @@ -0,0 +1,99 @@ + + + diff --git a/frontend/components/Label/Chip.vue b/frontend/components/Label/Chip.vue index bcb5ebe3..c1b4a0f8 100644 --- a/frontend/components/Label/Chip.vue +++ b/frontend/components/Label/Chip.vue @@ -42,6 +42,6 @@