diff --git a/CHANGELOG.md b/CHANGELOG.md index a90c6c77b..1338fe425 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,7 +45,7 @@ - **!** Repurposed the Authentik integration as a more generic "OpenID Connect" provider (`oidc`) to support any OIDC provider (Okta, Keycloak, etc.). _If you've previously used Authentik, make sure to rename the provider key in your code to `oidc`._ - _For more than one OIDC provider you can use the additional `oidc2` and `oidc3` settings._ + _To enable more than one OIDC provider you can use the additional `oidc2` and `oidc3` provider keys._ - **!** Removed the previously deprecated `Dao.Block()` and `Dao.Continue()` helpers in favor of `Dao.NonconcurrentDB()`. diff --git a/daos/base_retry.go b/daos/base_retry.go index eca32fa22..05905c075 100644 --- a/daos/base_retry.go +++ b/daos/base_retry.go @@ -17,6 +17,7 @@ func execLockRetry(timeout time.Duration, maxRetries int) dbx.ExecHookFunc { cancelCtx, cancel := context.WithTimeout(context.Background(), timeout) defer func() { cancel() + //nolint:staticcheck q.WithContext(nil) // reset }() q.WithContext(cancelCtx) diff --git a/daos/external_auth.go b/daos/external_auth.go index 525c273c6..7e3708bad 100644 --- a/daos/external_auth.go +++ b/daos/external_auth.go @@ -12,8 +12,8 @@ func (dao *Dao) ExternalAuthQuery() *dbx.SelectQuery { return dao.ModelQuery(&models.ExternalAuth{}) } -/// FindAllExternalAuthsByRecord returns all ExternalAuth models -/// linked to the provided auth record. +// FindAllExternalAuthsByRecord returns all ExternalAuth models +// linked to the provided auth record. func (dao *Dao) FindAllExternalAuthsByRecord(authRecord *models.Record) ([]*models.ExternalAuth, error) { auths := []*models.ExternalAuth{} diff --git a/forms/record_upsert.go b/forms/record_upsert.go index a429b0475..c40967329 100644 --- a/forms/record_upsert.go +++ b/forms/record_upsert.go @@ -429,7 +429,6 @@ func (form *RecordUpsert) LoadData(requestData map[string]any) error { if len(submittedNames) == 0 && len(oldNames) > 0 { form.RemoveFiles(key) } else if len(oldNames) > 0 { - toDelete := []string{} for _, name := range oldNames { @@ -763,18 +762,6 @@ func (form *RecordUpsert) Submit(interceptors ...InterceptorFunc[*models.Record] }, interceptors...) } -func (form *RecordUpsert) getFilesToUploadNames() []string { - names := []string{} - - for fieldKey := range form.filesToUpload { - for _, file := range form.filesToUpload[fieldKey] { - names = append(names, file.Name) - } - } - - return names -} - func (form *RecordUpsert) processFilesToUpload() error { if len(form.filesToUpload) == 0 { return nil // no parsed file fields diff --git a/forms/validators/file.go b/forms/validators/file.go index d4976a11c..2177078e3 100644 --- a/forms/validators/file.go +++ b/forms/validators/file.go @@ -13,6 +13,7 @@ import ( // size is no more than the provided maxBytes. // // Example: +// // validation.Field(&form.File, validation.By(validators.UploadedFileSize(1000))) func UploadedFileSize(maxBytes int) validation.RuleFunc { return func(value any) error { @@ -36,7 +37,8 @@ func UploadedFileSize(maxBytes int) validation.RuleFunc { // mimetype is within the provided allowed mime types. // // Example: -// validMimeTypes := []string{"test/plain","image/jpeg"} +// +// validMimeTypes := []string{"test/plain","image/jpeg"} // validation.Field(&form.File, validation.By(validators.UploadedFileMimeType(validMimeTypes))) func UploadedFileMimeType(validTypes []string) validation.RuleFunc { return func(value any) error { diff --git a/forms/validators/model.go b/forms/validators/model.go index 337972a74..a4a126fbc 100644 --- a/forms/validators/model.go +++ b/forms/validators/model.go @@ -12,6 +12,7 @@ import ( // Compare checks whether the provided model id exists. // // Example: +// // validation.Field(&form.Id, validation.By(validators.UniqueId(form.dao, tableName))) func UniqueId(dao *daos.Dao, tableName string) validation.RuleFunc { return func(value any) error { diff --git a/forms/validators/string.go b/forms/validators/string.go index 10f5202a9..00eb997d7 100644 --- a/forms/validators/string.go +++ b/forms/validators/string.go @@ -7,6 +7,7 @@ import ( // Compare checks whether the validated value matches another string. // // Example: +// // validation.Field(&form.PasswordConfirm, validation.By(validators.Compare(form.Password))) func Compare(valueToCompare string) validation.RuleFunc { return func(value any) error { diff --git a/models/record.go b/models/record.go index 32ff26c53..276ba63f7 100644 --- a/models/record.go +++ b/models/record.go @@ -566,7 +566,7 @@ func (m *Record) ReplaceModifers(data map[string]any) map[string]any { } // ----------------------------------------------------------- - // legacy file field modifiers (kept for backward compatability) + // legacy file field modifiers (kept for backward compatibility) // ----------------------------------------------------------- var oldNames []string diff --git a/models/schema/schema_field.go b/models/schema/schema_field.go index b7bf82866..a24b8b311 100644 --- a/models/schema/schema_field.go +++ b/models/schema/schema_field.go @@ -386,8 +386,7 @@ func (f *SchemaField) PrepareValueWithModifier(baseValue any, modifier string, m } case FieldTypeFile: // note: file for now supports only the subtract modifier - switch modifier { - case FieldValueModifierSubtract: + if modifier == FieldValueModifierSubtract { resolvedValue = list.SubtractSlice( list.ToUniqueStringSlice(baseValue), list.ToUniqueStringSlice(modifierValue), diff --git a/plugins/jsvm/vm.go b/plugins/jsvm/vm.go index 8cd255472..5e99ed3fa 100644 --- a/plugins/jsvm/vm.go +++ b/plugins/jsvm/vm.go @@ -5,9 +5,9 @@ // // 1. JS Migrations loader: // -// jsvm.MustRegisterMigrations(app, &jsvm.MigrationsOptions{ -// Dir: "custom_js_migrations_dir_path", // default to "pb_data/../pb_migrations" -// }) +// jsvm.MustRegisterMigrations(app, &jsvm.MigrationsOptions{ +// Dir: "custom_js_migrations_dir_path", // default to "pb_data/../pb_migrations" +// }) package jsvm import ( diff --git a/plugins/migratecmd/migratecmd.go b/plugins/migratecmd/migratecmd.go index c335235f3..33df0b9ea 100644 --- a/plugins/migratecmd/migratecmd.go +++ b/plugins/migratecmd/migratecmd.go @@ -5,14 +5,14 @@ // // Example usage: // -// migratecmd.MustRegister(app, app.RootCmd, &migratecmd.Options{ -// TemplateLang: migratecmd.TemplateLangJS, // default to migratecmd.TemplateLangGo -// Automigrate: true, -// Dir: "migrations_dir_path", // optional template migrations path; default to "pb_migrations" (for JS) and "migrations" (for Go) -// }) +// migratecmd.MustRegister(app, app.RootCmd, &migratecmd.Options{ +// TemplateLang: migratecmd.TemplateLangJS, // default to migratecmd.TemplateLangGo +// Automigrate: true, +// Dir: "migrations_dir_path", // optional template migrations path; default to "pb_migrations" (for JS) and "migrations" (for Go) +// }) // -// Note: To allow running JS migrations you'll need to enable first -// [jsvm.MustRegisterMigrations]. +// Note: To allow running JS migrations you'll need to enable first +// [jsvm.MustRegisterMigrations]. package migratecmd import ( diff --git a/resolvers/record_field_resolver.go b/resolvers/record_field_resolver.go index 8e281e6f5..220abbfec 100644 --- a/resolvers/record_field_resolver.go +++ b/resolvers/record_field_resolver.go @@ -42,15 +42,17 @@ var _ search.FieldResolver = (*RecordFieldResolver)(nil) // RecordFieldResolver defines a custom search resolver struct for // managing Record model search fields. // -// Usually used together with `search.Provider`. Example: -// resolver := resolvers.NewRecordFieldResolver( -// app.Dao(), -// myCollection, -// &models.RequestData{...}, -// true, -// ) -// provider := search.NewProvider(resolver) -// ... +// Usually used together with `search.Provider`. +// Example: +// +// resolver := resolvers.NewRecordFieldResolver( +// app.Dao(), +// myCollection, +// &models.RequestData{...}, +// true, +// ) +// provider := search.NewProvider(resolver) +// ... type RecordFieldResolver struct { dao *daos.Dao baseCollection *models.Collection @@ -125,17 +127,17 @@ func (r *RecordFieldResolver) UpdateQuery(query *dbx.SelectQuery) error { // // Example of some resolvable fieldName formats: // -// id -// someSelect.each -// project.screen.status -// @request.status -// @request.query.filter -// @request.auth.someRelation.name -// @request.data.someRelation.name -// @request.data.someField -// @request.data.someSelect:each -// @request.data.someField:isset -// @collection.product.name +// id +// someSelect.each +// project.screen.status +// @request.status +// @request.query.filter +// @request.auth.someRelation.name +// @request.data.someRelation.name +// @request.data.someField +// @request.data.someSelect:each +// @request.data.someField:isset +// @collection.product.name func (r *RecordFieldResolver) Resolve(fieldName string) (*search.ResolverResult, error) { return parseAndRun(fieldName, r) } diff --git a/tests/request.go b/tests/request.go index cc694778c..55b16b600 100644 --- a/tests/request.go +++ b/tests/request.go @@ -10,6 +10,7 @@ import ( // MockMultipartData creates a mocked multipart/form-data payload. // // Example +// // data, mp, err := tests.MockMultipartData( // map[string]string{"title": "new"}, // "file1", diff --git a/tools/search/sort.go b/tools/search/sort.go index 5e7aba4e5..7dd288041 100644 --- a/tools/search/sort.go +++ b/tools/search/sort.go @@ -40,6 +40,7 @@ func (s *SortField) BuildExpr(fieldResolver FieldResolver) (string, error) { // into a slice of SortFields. // // Example: +// // fields := search.ParseSortFromString("-name,+created") func ParseSortFromString(str string) (fields []SortField) { data := strings.Split(str, ",")