Compare commits

...

21 Commits

Author SHA1 Message Date
Piotr Rogowski dc49a56784
Don't throw errors on users migration 2023-11-20 12:26:06 +01:00
Piotr Rogowski d8a04f8f5f
Fix auto migrations 2023-11-20 12:22:55 +01:00
Piotr Rogowski 7225c76f05
Exclude migrations from lint 2023-11-20 12:03:07 +01:00
Piotr Rogowski 5d838d49d4
Exclude migrations from lint 2023-11-20 11:59:13 +01:00
Piotr Rogowski 362738f03a
Switch to automigrations 2023-11-20 11:54:35 +01:00
Piotr Rogowski 56acd63055
Bump pocketbase, dependencies and go version (#18) 2023-11-20 11:43:32 +01:00
Piotr Rogowski 889aab11ce
Bump pocketbase, dependencies and go version, add lints (#17) 2023-10-21 15:49:21 +02:00
dependabot[bot] 6581bca361
Bump goreleaser/goreleaser-action from 4 to 5 (#11)
Bumps [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action) from 4 to 5.
- [Release notes](https://github.com/goreleaser/goreleaser-action/releases)
- [Commits](https://github.com/goreleaser/goreleaser-action/compare/v4...v5)

---
updated-dependencies:
- dependency-name: goreleaser/goreleaser-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-21 13:29:29 +02:00
dependabot[bot] 9cc1b45813
Bump docker/setup-buildx-action from 2 to 3 (#12)
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-21 13:29:20 +02:00
dependabot[bot] 70475b4569
Bump docker/build-push-action from 4 to 5 (#13)
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4 to 5.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v4...v5)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-21 13:29:12 +02:00
dependabot[bot] bde77e655f
Bump docker/login-action from 2 to 3 (#14)
Bumps [docker/login-action](https://github.com/docker/login-action) from 2 to 3.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-21 13:29:02 +02:00
dependabot[bot] ad0cf9a960
Bump docker/setup-qemu-action from 2 to 3 (#15)
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2 to 3.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-21 13:28:46 +02:00
Piotr Rogowski 6649c2ed9c
Bump go 2023-09-11 12:54:49 +02:00
Piotr Rogowski 91f01834f3
Bump PocketBase 2023-09-11 11:35:50 +02:00
dependabot[bot] cc895af08a
Bump actions/checkout from 3 to 4 (#10)
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-09-11 11:25:28 +02:00
Piotr Rogowski 7ec1f90264
Add debug vscode settings 2023-08-22 13:04:11 +02:00
Piotr Rogowski d6bc6240d8
Update PocketBase, downgrade gocloud 2023-08-20 18:37:10 +02:00
Piotr Rogowski e20f8e7503
Update PocketBase and Go 2023-08-13 18:21:25 +02:00
dependabot[bot] 44bd4ce4d0
Bump docker/build-push-action from 3 to 4 (#6)
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 3 to 4.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-08-06 13:46:05 +02:00
dependabot[bot] 45c5918b8c
Bump actions/setup-go from 3 to 4 (#9)
Bumps [actions/setup-go](https://github.com/actions/setup-go) from 3 to 4.
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](https://github.com/actions/setup-go/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-08-06 13:45:21 +02:00
Piotr Rogowski 37a5a3daf1
Update PocketBase and go 2023-08-06 12:53:40 +02:00
20 changed files with 1263 additions and 2845 deletions

View File

@ -11,19 +11,19 @@ jobs:
steps:
-
name: Set up QEMU
uses: docker/setup-qemu-action@v2
uses: docker/setup-qemu-action@v3
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
uses: docker/setup-buildx-action@v3
-
name: Login to Docker Hub
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build and push
uses: docker/build-push-action@v3
uses: docker/build-push-action@v5
with:
push: true
tags: karniv001/hypertuner-cloud-backend

View File

@ -14,23 +14,23 @@ jobs:
uses: olegtarasov/get-tag@v2.1.2
id: tagName
with:
tagRegex: 'v(.*)'
tagRegex: v(.*)
tagRegexGroup: 1
-
name: Set up QEMU
uses: docker/setup-qemu-action@v2
uses: docker/setup-qemu-action@v3
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
uses: docker/setup-buildx-action@v3
-
name: Login to Docker Hub
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build and push
uses: docker/build-push-action@v3
uses: docker/build-push-action@v5
with:
push: true
tags: karniv001/hypertuner-cloud-backend:${{ steps.tagName.outputs.tag }}

37
.github/workflows/lint.yml vendored Normal file
View File

@ -0,0 +1,37 @@
name: Lint
concurrency:
group: ${{ github.ref }}-lint
cancel-in-progress: true
on:
push:
branches: [master]
pull_request:
branches: [master]
permissions:
contents: read
# Optional: allow read access to pull request. Use with `only-new-issues` option.
# pull-requests: read
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: '>=1.21.4'
cache: true
- name: Install dependencies
run: go get
- name: Lint
uses: golangci/golangci-lint-action@v3
with:
version: latest

View File

@ -11,16 +11,16 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v3
uses: actions/setup-go@v4
with:
go-version: '>=1.20.3'
go-version: '>=1.21.4'
cache: true
- name: Go release
uses: goreleaser/goreleaser-action@v4
uses: goreleaser/goreleaser-action@v5
with:
distribution: goreleaser
version: latest

4
.gitignore vendored
View File

@ -26,6 +26,7 @@ go.work
# pb_data and backups
/backup
/pb_data
/pb_data_backup
/pb_data.zip
/pb_data.tar.gz
@ -36,3 +37,6 @@ main
# docker overrides
docker-compose.override.yml
# debug artifacts
__debug_bin*

10
.golangci.yml Normal file
View File

@ -0,0 +1,10 @@
run:
# Default: 1m
timeout: 5m
skip-dirs:
- migrations
issues:
exclude:
- Error return value of `e.Router.AddRoute` is not checked

View File

@ -3,6 +3,7 @@
"golang.go",
"editorconfig.editorconfig",
"davidanson.vscode-markdownlint",
"streetsidesoftware.code-spell-checker"
"streetsidesoftware.code-spell-checker",
"trunk.io"
]
}

16
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,16 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Debug",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}",
"args": ["serve", "--debug"],
}
]
}

View File

@ -1,12 +1,17 @@
{
"cSpell.words": [
"Automigrate",
"Buildx",
"daos",
"DOCKERHUB",
"FOME",
"golangci",
"hypertuner",
"labstack",
"Middlewares",
"migratecmd",
"pocketbase",
"runtimes",
"unstar"
]
}

View File

@ -1,4 +1,4 @@
FROM golang:1.20.3 AS builder
FROM golang:1.21.3 AS builder
RUN mkdir /app
COPY . /app

View File

@ -38,7 +38,7 @@ Now you can access the admin UI at: [https://your-instance.com/_/](https://your-
[https://hub.docker.com/r/karniv001/hypertuner-cloud-backend](https://hub.docker.com/r/karniv001/hypertuner-cloud-backend)
```bash
docker pull karniv001/hypertuner-cloud-backend:1.3.1
docker pull karniv001/hypertuner-cloud-backend:1.3.6
```
## Upgrading

112
go.mod
View File

@ -1,88 +1,90 @@
module main
go 1.19
go 1.21
require (
github.com/labstack/echo/v5 v5.0.0-20220201181537-ed2888cfa198
github.com/pocketbase/dbx v1.10.0
github.com/pocketbase/pocketbase v0.15.2
github.com/labstack/echo/v5 v5.0.0-20230722203903-ec5b858dab61
github.com/pocketbase/dbx v1.10.1
github.com/pocketbase/pocketbase v0.19.4
)
require (
github.com/AlecAivazis/survey/v2 v2.3.6 // indirect
github.com/AlecAivazis/survey/v2 v2.3.7 // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/aws/aws-sdk-go v1.44.249 // indirect
github.com/aws/aws-sdk-go-v2 v1.18.0 // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 // indirect
github.com/aws/aws-sdk-go-v2/config v1.18.22 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.13.21 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 // indirect
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.64 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34 // indirect
github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.25 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.28 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.2 // indirect
github.com/aws/aws-sdk-go-v2/service/s3 v1.33.0 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.12.9 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.9 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.18.10 // indirect
github.com/aws/smithy-go v1.13.5 // indirect
github.com/aws/aws-sdk-go v1.46.6 // indirect
github.com/aws/aws-sdk-go-v2 v1.21.2 // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.14 // indirect
github.com/aws/aws-sdk-go-v2/config v1.19.1 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.13.43 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 // indirect
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.92 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 // indirect
github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.6 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.38 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.6 // indirect
github.com/aws/aws-sdk-go-v2/service/s3 v1.40.2 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 // indirect
github.com/aws/smithy-go v1.15.0 // indirect
github.com/disintegration/imaging v1.6.2 // indirect
github.com/domodwyer/mailyak/v3 v3.6.0 // indirect
github.com/domodwyer/mailyak/v3 v3.6.2 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/fatih/color v1.15.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/ganigeorgiev/fexpr v0.3.0 // indirect
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/google/uuid v1.4.0 // indirect
github.com/google/wire v0.5.0 // indirect
github.com/googleapis/gax-go/v2 v2.8.0 // indirect
github.com/googleapis/gax-go/v2 v2.12.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.18 // indirect
github.com/mattn/go-sqlite3 v1.14.16 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-sqlite3 v1.14.17 // indirect
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/spf13/cast v1.5.0 // indirect
github.com/spf13/cast v1.5.1 // indirect
github.com/spf13/cobra v1.7.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.2 // indirect
go.opencensus.io v0.24.0 // indirect
gocloud.dev v0.29.0 // indirect
golang.org/x/crypto v0.8.0 // indirect
golang.org/x/image v0.7.0 // indirect
golang.org/x/mod v0.10.0 // indirect
golang.org/x/net v0.9.0 // indirect
golang.org/x/oauth2 v0.7.0 // indirect
golang.org/x/sys v0.7.0 // indirect
golang.org/x/term v0.7.0 // indirect
golang.org/x/text v0.9.0 // indirect
gocloud.dev v0.34.0 // indirect
golang.org/x/crypto v0.15.0 // indirect
golang.org/x/image v0.13.0 // indirect
golang.org/x/mod v0.14.0 // indirect
golang.org/x/net v0.18.0 // indirect
golang.org/x/oauth2 v0.13.0 // indirect
golang.org/x/sync v0.5.0 // indirect
golang.org/x/sys v0.14.0 // indirect
golang.org/x/term v0.14.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/time v0.3.0 // indirect
golang.org/x/tools v0.8.0 // indirect
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
google.golang.org/api v0.119.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
google.golang.org/grpc v1.54.0 // indirect
google.golang.org/protobuf v1.30.0 // indirect
golang.org/x/tools v0.15.0 // indirect
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
google.golang.org/api v0.148.0 // indirect
google.golang.org/appengine v1.6.8 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect
google.golang.org/grpc v1.59.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
lukechampine.com/uint128 v1.3.0 // indirect
modernc.org/cc/v3 v3.40.0 // indirect
modernc.org/ccgo/v3 v3.16.13 // indirect
modernc.org/libc v1.22.5 // indirect
modernc.org/mathutil v1.5.0 // indirect
modernc.org/memory v1.5.0 // indirect
modernc.org/cc/v3 v3.41.0 // indirect
modernc.org/ccgo/v3 v3.16.15 // indirect
modernc.org/libc v1.28.0 // indirect
modernc.org/mathutil v1.6.0 // indirect
modernc.org/memory v1.7.2 // indirect
modernc.org/opt v0.1.3 // indirect
modernc.org/sqlite v1.22.0 // indirect
modernc.org/strutil v1.1.3 // indirect
modernc.org/sqlite v1.26.0 // indirect
modernc.org/strutil v1.2.0 // indirect
modernc.org/token v1.1.0 // indirect
)

2859
go.sum

File diff suppressed because it is too large Load Diff

21
main.go
View File

@ -3,6 +3,8 @@ package main
import (
"log"
"net/http"
"os"
"strings"
_ "main/migrations"
@ -13,6 +15,7 @@ import (
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/daos"
"github.com/pocketbase/pocketbase/models"
"github.com/pocketbase/pocketbase/plugins/migratecmd"
)
func main() {
@ -22,6 +25,15 @@ func main() {
app := pocketbase.New()
// loosely check if it was executed using "go run"
isGoRun := strings.HasPrefix(os.Args[0], os.TempDir())
migratecmd.MustRegister(app, app.RootCmd, migratecmd.Config{
// enable auto creation of migration files when making collection changes in the Admin UI
// (the isGoRun check is to enable it only during development)
Automigrate: isGoRun,
})
app.OnBeforeServe().Add(func(e *core.ServeEvent) error {
e.Router.AddRoute(echo.Route{
Method: http.MethodGet,
@ -33,10 +45,13 @@ func main() {
return apis.NewNotFoundError("Tune not found", nil)
}
apis.EnrichRecord(c, app.Dao(), record, "author")
if err := apis.EnrichRecord(c, app.Dao(), record, "author"); err != nil {
return err
}
return c.JSON(http.StatusOK, record)
},
Middlewares: []echo.MiddlewareFunc{
apis.ActivityLogger(app),
},
@ -135,6 +150,10 @@ func main() {
// fetch again and return current state
tune, _err := app.Dao().FindFirstRecordByData(tunesCollectionName, "id", stargazer.Tune)
if _err != nil {
return apis.NewNotFoundError("Tune not found", nil)
}
return c.JSON(http.StatusOK, map[string]any{
"stars": tune.Get("stars").(float64),
"isStarred": isStarred,

View File

@ -1,20 +0,0 @@
package migrations
import (
"github.com/pocketbase/dbx"
m "github.com/pocketbase/pocketbase/migrations"
)
func init() {
m.Register(func(db dbx.Builder) error {
// add up queries...
db.CreateUniqueIndex("stargazers", "unique_stargazers_on_user_tune", "user", "tune").Execute()
return nil
}, func(db dbx.Builder) error {
// add down queries...
db.DropIndex("stargazers", "unique_stargazers_on_user_tune").Execute()
return nil
})
}

View File

@ -0,0 +1,110 @@
package migrations
import (
"encoding/json"
"fmt"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/daos"
m "github.com/pocketbase/pocketbase/migrations"
"github.com/pocketbase/pocketbase/models"
)
func init() {
m.Register(func(db dbx.Builder) error {
dao := daos.New(db);
_, err := dao.FindCollectionByNameOrId("9eif9v40b0uw9l8")
if err == nil {
fmt.Println("collection iniFiles already exists")
return nil
}
jsonData := `{
"id": "9eif9v40b0uw9l8",
"created": "2023-11-20 10:50:08.919Z",
"updated": "2023-11-20 10:50:08.919Z",
"name": "iniFiles",
"type": "base",
"system": false,
"schema": [
{
"system": false,
"id": "h9yfwmvx",
"name": "signature",
"type": "text",
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 3,
"max": 255,
"pattern": ""
}
},
{
"system": false,
"id": "z3e1a5cl",
"name": "file",
"type": "file",
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"maxSize": 5242880,
"mimeTypes": [
"application/gzip",
"application/octet-stream"
],
"thumbs": [],
"protected": false
}
},
{
"system": false,
"id": "t5uayom3",
"name": "ecosystem",
"type": "select",
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"values": [
"speeduino",
"rusefi",
"fome"
]
}
}
],
"indexes": [
"CREATE INDEX ` + "`" + `officialIniFiles_created_idx` + "`" + ` ON ` + "`" + `iniFiles` + "`" + ` (` + "`" + `created` + "`" + `)",
"CREATE UNIQUE INDEX ` + "`" + `idx_unique_h9yfwmvx` + "`" + ` ON ` + "`" + `iniFiles` + "`" + ` (` + "`" + `signature` + "`" + `)"
],
"listRule": "",
"viewRule": "",
"createRule": null,
"updateRule": null,
"deleteRule": null,
"options": {}
}`
collection := &models.Collection{}
if err := json.Unmarshal([]byte(jsonData), &collection); err != nil {
return err
}
return daos.New(db).SaveCollection(collection)
}, func(db dbx.Builder) error {
dao := daos.New(db);
collection, err := dao.FindCollectionByNameOrId("9eif9v40b0uw9l8")
if err != nil {
return err
}
return dao.DeleteCollection(collection)
})
}

View File

@ -0,0 +1,92 @@
package migrations
import (
"encoding/json"
"fmt"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/daos"
m "github.com/pocketbase/pocketbase/migrations"
"github.com/pocketbase/pocketbase/models"
)
func init() {
m.Register(func(db dbx.Builder) error {
dao := daos.New(db);
_, err := dao.FindCollectionByNameOrId("9eif9v40b0uw9l8")
if err == nil {
fmt.Println("collection stargazers already exists")
return nil
}
jsonData := `{
"id": "z8cojwcvlyxxyll",
"created": "2023-11-20 10:50:08.921Z",
"updated": "2023-11-20 10:50:08.921Z",
"name": "stargazers",
"type": "base",
"system": false,
"schema": [
{
"system": false,
"id": "him7pbq2",
"name": "user",
"type": "relation",
"required": true,
"presentable": false,
"unique": false,
"options": {
"collectionId": "_pb_users_auth_",
"cascadeDelete": false,
"minSelect": null,
"maxSelect": 1,
"displayFields": null
}
},
{
"system": false,
"id": "ny7akrmn",
"name": "tune",
"type": "relation",
"required": true,
"presentable": false,
"unique": false,
"options": {
"collectionId": "5djmpehuiigg06b",
"cascadeDelete": false,
"minSelect": null,
"maxSelect": 1,
"displayFields": null
}
}
],
"indexes": [
"CREATE INDEX ` + "`" + `_z8cojwcvlyxxyll_created_idx` + "`" + ` ON ` + "`" + `stargazers` + "`" + ` (` + "`" + `created` + "`" + `)",
"CREATE UNIQUE INDEX ` + "`" + `unique_stargazers_on_user_tune` + "`" + ` ON ` + "`" + `stargazers` + "`" + ` (` + "`" + `user` + "`" + `, ` + "`" + `tune` + "`" + `)"
],
"listRule": null,
"viewRule": null,
"createRule": null,
"updateRule": null,
"deleteRule": null,
"options": {}
}`
collection := &models.Collection{}
if err := json.Unmarshal([]byte(jsonData), &collection); err != nil {
return err
}
return daos.New(db).SaveCollection(collection)
}, func(db dbx.Builder) error {
dao := daos.New(db);
collection, err := dao.FindCollectionByNameOrId("z8cojwcvlyxxyll")
if err != nil {
return err
}
return dao.DeleteCollection(collection)
})
}

View File

@ -0,0 +1,455 @@
package migrations
import (
"encoding/json"
"fmt"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/daos"
m "github.com/pocketbase/pocketbase/migrations"
"github.com/pocketbase/pocketbase/models"
)
func init() {
m.Register(func(db dbx.Builder) error {
dao := daos.New(db);
_, err := dao.FindCollectionByNameOrId("9eif9v40b0uw9l8")
if err == nil {
fmt.Println("collection tunes already exists")
return nil
}
jsonData := `{
"id": "5djmpehuiigg06b",
"created": "2023-11-20 10:50:08.921Z",
"updated": "2023-11-20 10:50:08.921Z",
"name": "tunes",
"type": "base",
"system": false,
"schema": [
{
"system": false,
"id": "io2qgnvc",
"name": "author",
"type": "relation",
"required": true,
"presentable": false,
"unique": false,
"options": {
"collectionId": "_pb_users_auth_",
"cascadeDelete": false,
"minSelect": null,
"maxSelect": 1,
"displayFields": null
}
},
{
"system": false,
"id": "pkq4wfcj",
"name": "tuneId",
"type": "text",
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 5,
"max": 255,
"pattern": ""
}
},
{
"system": false,
"id": "6gd6tzwx",
"name": "source",
"type": "select",
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"values": [
"web",
"app"
]
}
},
{
"system": false,
"id": "jcjunqhl",
"name": "signature",
"type": "text",
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 3,
"max": 255,
"pattern": ""
}
},
{
"system": false,
"id": "lwbwtgmx",
"name": "stars",
"type": "number",
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": 0,
"max": null,
"noDecimal": false
}
},
{
"system": false,
"id": "g9b17t9y",
"name": "vehicleName",
"type": "text",
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 2,
"max": 255,
"pattern": ""
}
},
{
"system": false,
"id": "w7qssd4t",
"name": "engineMake",
"type": "text",
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 2,
"max": 255,
"pattern": ""
}
},
{
"system": false,
"id": "h47ir1bi",
"name": "engineCode",
"type": "text",
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 2,
"max": 255,
"pattern": ""
}
},
{
"system": false,
"id": "frqzy24e",
"name": "displacement",
"type": "number",
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 0,
"max": 100,
"noDecimal": false
}
},
{
"system": false,
"id": "j1asw8n1",
"name": "cylindersCount",
"type": "number",
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 0,
"max": 16,
"noDecimal": false
}
},
{
"system": false,
"id": "0x8poyze",
"name": "aspiration",
"type": "select",
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"values": [
"na",
"turbocharged",
"supercharged"
]
}
},
{
"system": false,
"id": "ssd9iccu",
"name": "compression",
"type": "number",
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": 0,
"max": 100,
"noDecimal": false
}
},
{
"system": false,
"id": "whk0u6fg",
"name": "fuel",
"type": "text",
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": null,
"max": 255,
"pattern": ""
}
},
{
"system": false,
"id": "4ydhmn21",
"name": "ignition",
"type": "text",
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": null,
"max": 255,
"pattern": ""
}
},
{
"system": false,
"id": "lti2l0im",
"name": "injectorsSize",
"type": "number",
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": 0,
"max": 100000,
"noDecimal": false
}
},
{
"system": false,
"id": "pmt4jrhm",
"name": "year",
"type": "number",
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": null,
"max": 2222,
"noDecimal": false
}
},
{
"system": false,
"id": "s9fjthhs",
"name": "hp",
"type": "number",
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": 0,
"max": 100000,
"noDecimal": false
}
},
{
"system": false,
"id": "s4csjkpt",
"name": "stockHp",
"type": "number",
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": 0,
"max": 100000,
"noDecimal": false
}
},
{
"system": false,
"id": "hfpkctpl",
"name": "readme",
"type": "text",
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 5,
"max": 3000,
"pattern": ""
}
},
{
"system": false,
"id": "dk22rxkw",
"name": "tags",
"type": "select",
"required": false,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"values": [
"base map",
"help needed"
]
}
},
{
"system": false,
"id": "d5vpizsr",
"name": "textSearch",
"type": "text",
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 1,
"max": 2048,
"pattern": ""
}
},
{
"system": false,
"id": "1bjweixt",
"name": "visibility",
"type": "select",
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"values": [
"public",
"unlisted"
]
}
},
{
"system": false,
"id": "roqbws6u",
"name": "tuneFile",
"type": "file",
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"maxSize": 5242880,
"mimeTypes": [
"application/gzip",
"application/octet-stream"
],
"thumbs": [],
"protected": false
}
},
{
"system": false,
"id": "59syvgnj",
"name": "customIniFile",
"type": "file",
"required": false,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"maxSize": 5242880,
"mimeTypes": [
"application/gzip",
"application/octet-stream"
],
"thumbs": [],
"protected": false
}
},
{
"system": false,
"id": "gzccot0l",
"name": "logFiles",
"type": "file",
"required": false,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 5,
"maxSize": 5242880,
"mimeTypes": [
"application/gzip",
"application/octet-stream"
],
"thumbs": [],
"protected": false
}
},
{
"system": false,
"id": "2z0i9ttc",
"name": "toothLogFiles",
"type": "file",
"required": false,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 5,
"maxSize": 5242880,
"mimeTypes": [
"application/gzip",
"application/octet-stream"
],
"thumbs": [],
"protected": false
}
}
],
"indexes": [
"CREATE INDEX ` + "`" + `tunes_created_idx` + "`" + ` ON ` + "`" + `tunes` + "`" + ` (` + "`" + `created` + "`" + `)",
"CREATE UNIQUE INDEX ` + "`" + `idx_unique_pkq4wfcj` + "`" + ` ON ` + "`" + `tunes` + "`" + ` (` + "`" + `tuneId` + "`" + `)"
],
"listRule": "visibility = \"public\" || (visibility = \"unlisted\" && author = @request.auth.id)",
"viewRule": null,
"createRule": "@request.auth.verified = true",
"updateRule": "@request.auth.id = author",
"deleteRule": null,
"options": {}
}`
collection := &models.Collection{}
if err := json.Unmarshal([]byte(jsonData), &collection); err != nil {
return err
}
return daos.New(db).SaveCollection(collection)
}, func(db dbx.Builder) error {
dao := daos.New(db);
collection, err := dao.FindCollectionByNameOrId("5djmpehuiigg06b")
if err != nil {
return err
}
return dao.DeleteCollection(collection)
})
}

View File

@ -0,0 +1,178 @@
package migrations
import (
"encoding/json"
"fmt"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/daos"
m "github.com/pocketbase/pocketbase/migrations"
"github.com/pocketbase/pocketbase/models/schema"
"github.com/pocketbase/pocketbase/tools/types"
)
func init() {
m.Register(func(db dbx.Builder) error {
dao := daos.New(db);
collection, err := dao.FindCollectionByNameOrId("users")
if err != nil {
fmt.Println("collection users not found")
return nil
}
collection.ListRule = nil
collection.ViewRule = types.Pointer("")
collection.UpdateRule = types.Pointer("id = @request.auth.id && @request.data.verifiedAuthor = null")
collection.DeleteRule = nil
options := map[string]any{}
json.Unmarshal([]byte(`{
"allowEmailAuth": true,
"allowOAuth2Auth": true,
"allowUsernameAuth": false,
"exceptEmailDomains": null,
"manageRule": null,
"minPasswordLength": 8,
"onlyEmailDomains": null,
"requireEmail": true
}`), &options)
collection.SetOptions(options)
json.Unmarshal([]byte(`[
"CREATE INDEX ` + "`" + `_systemprofiles0_created_idx` + "`" + ` ON ` + "`" + `users` + "`" + ` (` + "`" + `created` + "`" + `)"
]`), &collection.Indexes)
// remove
collection.Schema.RemoveField("users_name")
// add
new_verifiedAuthor := &schema.SchemaField{}
json.Unmarshal([]byte(`{
"system": false,
"id": "fqmcoapu",
"name": "verifiedAuthor",
"type": "bool",
"required": false,
"presentable": false,
"unique": false,
"options": {}
}`), new_verifiedAuthor)
collection.Schema.AddField(new_verifiedAuthor)
// update
edit_avatar := &schema.SchemaField{}
json.Unmarshal([]byte(`{
"system": false,
"id": "users_avatar",
"name": "avatar",
"type": "file",
"required": false,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"maxSize": 5242880,
"mimeTypes": [
"image/jpg",
"image/jpeg",
"image/png",
"image/svg+xml",
"image/gif"
],
"thumbs": null,
"protected": false
}
}`), edit_avatar)
collection.Schema.AddField(edit_avatar)
error := dao.SaveCollection(collection)
if error != nil {
fmt.Println(error)
}
return nil
}, func(db dbx.Builder) error {
dao := daos.New(db);
collection, err := dao.FindCollectionByNameOrId("_pb_users_auth_")
if err != nil {
return err
}
collection.ListRule = types.Pointer("id = @request.auth.id")
collection.ViewRule = types.Pointer("id = @request.auth.id")
collection.UpdateRule = types.Pointer("id = @request.auth.id")
collection.DeleteRule = types.Pointer("id = @request.auth.id")
options := map[string]any{}
json.Unmarshal([]byte(`{
"allowEmailAuth": true,
"allowOAuth2Auth": true,
"allowUsernameAuth": true,
"exceptEmailDomains": null,
"manageRule": null,
"minPasswordLength": 8,
"onlyEmailDomains": null,
"requireEmail": false
}`), &options)
collection.SetOptions(options)
json.Unmarshal([]byte(`[]`), &collection.Indexes)
// add
del_name := &schema.SchemaField{}
json.Unmarshal([]byte(`{
"system": false,
"id": "users_name",
"name": "name",
"type": "text",
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": null,
"max": null,
"pattern": ""
}
}`), del_name)
collection.Schema.AddField(del_name)
// remove
collection.Schema.RemoveField("fqmcoapu")
// update
edit_avatar := &schema.SchemaField{}
json.Unmarshal([]byte(`{
"system": false,
"id": "users_avatar",
"name": "avatar",
"type": "file",
"required": false,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"maxSize": 5242880,
"mimeTypes": [
"image/jpeg",
"image/png",
"image/svg+xml",
"image/gif",
"image/webp"
],
"thumbs": null,
"protected": false
}
}`), edit_avatar)
collection.Schema.AddField(edit_avatar)
return dao.SaveCollection(collection)
})
}

View File

@ -6,11 +6,13 @@
"system": false,
"schema": [
{
"system": false,
"id": "h9yfwmvx",
"name": "signature",
"type": "text",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 3,
"max": 255,
@ -18,11 +20,13 @@
}
},
{
"system": false,
"id": "z3e1a5cl",
"name": "file",
"type": "file",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"maxSize": 5242880,
@ -35,11 +39,13 @@
}
},
{
"system": false,
"id": "t5uayom3",
"name": "ecosystem",
"type": "select",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"values": [
@ -68,11 +74,13 @@
"system": false,
"schema": [
{
"system": false,
"id": "pbfieldavatar",
"name": "avatar",
"type": "file",
"system": false,
"required": false,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"maxSize": 5242880,
@ -88,11 +96,13 @@
}
},
{
"system": false,
"id": "fqmcoapu",
"name": "verifiedAuthor",
"type": "bool",
"system": false,
"required": false,
"presentable": false,
"unique": false,
"options": {}
}
],
@ -122,11 +132,13 @@
"system": false,
"schema": [
{
"system": false,
"id": "him7pbq2",
"name": "user",
"type": "relation",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"collectionId": "systemprofiles0",
"cascadeDelete": false,
@ -136,11 +148,13 @@
}
},
{
"system": false,
"id": "ny7akrmn",
"name": "tune",
"type": "relation",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"collectionId": "5djmpehuiigg06b",
"cascadeDelete": false,
@ -168,11 +182,13 @@
"system": false,
"schema": [
{
"system": false,
"id": "io2qgnvc",
"name": "author",
"type": "relation",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"collectionId": "systemprofiles0",
"cascadeDelete": false,
@ -182,11 +198,13 @@
}
},
{
"system": false,
"id": "pkq4wfcj",
"name": "tuneId",
"type": "text",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 5,
"max": 255,
@ -194,11 +212,13 @@
}
},
{
"system": false,
"id": "6gd6tzwx",
"name": "source",
"type": "select",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"values": [
@ -208,11 +228,13 @@
}
},
{
"system": false,
"id": "jcjunqhl",
"name": "signature",
"type": "text",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 3,
"max": 255,
@ -220,22 +242,27 @@
}
},
{
"system": false,
"id": "lwbwtgmx",
"name": "stars",
"type": "number",
"system": false,
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": 0,
"max": null
"max": null,
"noDecimal": false
}
},
{
"system": false,
"id": "g9b17t9y",
"name": "vehicleName",
"type": "text",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 2,
"max": 255,
@ -243,11 +270,13 @@
}
},
{
"system": false,
"id": "w7qssd4t",
"name": "engineMake",
"type": "text",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 2,
"max": 255,
@ -255,11 +284,13 @@
}
},
{
"system": false,
"id": "h47ir1bi",
"name": "engineCode",
"type": "text",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 2,
"max": 255,
@ -267,33 +298,41 @@
}
},
{
"system": false,
"id": "frqzy24e",
"name": "displacement",
"type": "number",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 0,
"max": 100
"max": 100,
"noDecimal": false
}
},
{
"system": false,
"id": "j1asw8n1",
"name": "cylindersCount",
"type": "number",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 0,
"max": 16
"max": 16,
"noDecimal": false
}
},
{
"system": false,
"id": "0x8poyze",
"name": "aspiration",
"type": "select",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"values": [
@ -304,22 +343,27 @@
}
},
{
"system": false,
"id": "ssd9iccu",
"name": "compression",
"type": "number",
"system": false,
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": 0,
"max": 100
"max": 100,
"noDecimal": false
}
},
{
"system": false,
"id": "whk0u6fg",
"name": "fuel",
"type": "text",
"system": false,
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": null,
"max": 255,
@ -327,11 +371,13 @@
}
},
{
"system": false,
"id": "4ydhmn21",
"name": "ignition",
"type": "text",
"system": false,
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": null,
"max": 255,
@ -339,55 +385,69 @@
}
},
{
"system": false,
"id": "lti2l0im",
"name": "injectorsSize",
"type": "number",
"system": false,
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": 0,
"max": 100000
"max": 100000,
"noDecimal": false
}
},
{
"system": false,
"id": "pmt4jrhm",
"name": "year",
"type": "number",
"system": false,
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": null,
"max": 2222
"max": 2222,
"noDecimal": false
}
},
{
"system": false,
"id": "s9fjthhs",
"name": "hp",
"type": "number",
"system": false,
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": 0,
"max": 100000
"max": 100000,
"noDecimal": false
}
},
{
"system": false,
"id": "s4csjkpt",
"name": "stockHp",
"type": "number",
"system": false,
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": 0,
"max": 100000
"max": 100000,
"noDecimal": false
}
},
{
"system": false,
"id": "hfpkctpl",
"name": "readme",
"type": "text",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 5,
"max": 3000,
@ -395,11 +455,13 @@
}
},
{
"system": false,
"id": "dk22rxkw",
"name": "tags",
"type": "select",
"system": false,
"required": false,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"values": [
@ -409,11 +471,13 @@
}
},
{
"system": false,
"id": "d5vpizsr",
"name": "textSearch",
"type": "text",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 1,
"max": 2048,
@ -421,11 +485,13 @@
}
},
{
"system": false,
"id": "1bjweixt",
"name": "visibility",
"type": "select",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"values": [
@ -435,11 +501,13 @@
}
},
{
"system": false,
"id": "roqbws6u",
"name": "tuneFile",
"type": "file",
"system": false,
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"maxSize": 5242880,
@ -452,11 +520,13 @@
}
},
{
"system": false,
"id": "59syvgnj",
"name": "customIniFile",
"type": "file",
"system": false,
"required": false,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"maxSize": 5242880,
@ -469,11 +539,13 @@
}
},
{
"system": false,
"id": "gzccot0l",
"name": "logFiles",
"type": "file",
"system": false,
"required": false,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 5,
"maxSize": 5242880,
@ -486,11 +558,13 @@
}
},
{
"system": false,
"id": "2z0i9ttc",
"name": "toothLogFiles",
"type": "file",
"system": false,
"required": false,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 5,
"maxSize": 5242880,