mirror of
https://github.com/pocketbase/pocketbase.git
synced 2025-03-19 14:17:48 +02:00
141 lines
3.9 KiB
Go
141 lines
3.9 KiB
Go
package core
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
validation "github.com/go-ozzo/ozzo-validation/v4"
|
|
"github.com/pocketbase/pocketbase/tools/auth"
|
|
"github.com/pocketbase/pocketbase/tools/hook"
|
|
"github.com/pocketbase/pocketbase/tools/types"
|
|
)
|
|
|
|
var (
|
|
_ Model = (*ExternalAuth)(nil)
|
|
_ PreValidator = (*ExternalAuth)(nil)
|
|
_ RecordProxy = (*ExternalAuth)(nil)
|
|
)
|
|
|
|
const CollectionNameExternalAuths = "_externalAuths"
|
|
|
|
// ExternalAuth defines a Record proxy for working with the externalAuths collection.
|
|
type ExternalAuth struct {
|
|
*Record
|
|
}
|
|
|
|
// NewExternalAuth instantiates and returns a new blank *ExternalAuth model.
|
|
//
|
|
// Example usage:
|
|
//
|
|
// ea := core.NewExternalAuth(app)
|
|
// ea.SetRecordRef(user.Id)
|
|
// ea.SetCollectionRef(user.Collection().Id)
|
|
// ea.SetProvider("google")
|
|
// ea.SetProviderId("...")
|
|
// app.Save(ea)
|
|
func NewExternalAuth(app App) *ExternalAuth {
|
|
m := &ExternalAuth{}
|
|
|
|
c, err := app.FindCachedCollectionByNameOrId(CollectionNameExternalAuths)
|
|
if err != nil {
|
|
// this is just to make tests easier since it is a system collection and it is expected to be always accessible
|
|
// (note: the loaded record is further checked on ExternalAuth.PreValidate())
|
|
c = NewBaseCollection("@__invalid__")
|
|
}
|
|
|
|
m.Record = NewRecord(c)
|
|
|
|
return m
|
|
}
|
|
|
|
// PreValidate implements the [PreValidator] interface and checks
|
|
// whether the proxy is properly loaded.
|
|
func (m *ExternalAuth) PreValidate(ctx context.Context, app App) error {
|
|
if m.Record == nil || m.Record.Collection().Name != CollectionNameExternalAuths {
|
|
return errors.New("missing or invalid ExternalAuth ProxyRecord")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// ProxyRecord returns the proxied Record model.
|
|
func (m *ExternalAuth) ProxyRecord() *Record {
|
|
return m.Record
|
|
}
|
|
|
|
// SetProxyRecord loads the specified record model into the current proxy.
|
|
func (m *ExternalAuth) SetProxyRecord(record *Record) {
|
|
m.Record = record
|
|
}
|
|
|
|
// CollectionRef returns the "collectionRef" field value.
|
|
func (m *ExternalAuth) CollectionRef() string {
|
|
return m.GetString("collectionRef")
|
|
}
|
|
|
|
// SetCollectionRef updates the "collectionRef" record field value.
|
|
func (m *ExternalAuth) SetCollectionRef(collectionId string) {
|
|
m.Set("collectionRef", collectionId)
|
|
}
|
|
|
|
// RecordRef returns the "recordRef" record field value.
|
|
func (m *ExternalAuth) RecordRef() string {
|
|
return m.GetString("recordRef")
|
|
}
|
|
|
|
// SetRecordRef updates the "recordRef" record field value.
|
|
func (m *ExternalAuth) SetRecordRef(recordId string) {
|
|
m.Set("recordRef", recordId)
|
|
}
|
|
|
|
// Provider returns the "provider" record field value.
|
|
func (m *ExternalAuth) Provider() string {
|
|
return m.GetString("provider")
|
|
}
|
|
|
|
// SetProvider updates the "provider" record field value.
|
|
func (m *ExternalAuth) SetProvider(provider string) {
|
|
m.Set("provider", provider)
|
|
}
|
|
|
|
// Provider returns the "providerId" record field value.
|
|
func (m *ExternalAuth) ProviderId() string {
|
|
return m.GetString("providerId")
|
|
}
|
|
|
|
// SetProvider updates the "providerId" record field value.
|
|
func (m *ExternalAuth) SetProviderId(providerId string) {
|
|
m.Set("providerId", providerId)
|
|
}
|
|
|
|
// Created returns the "created" record field value.
|
|
func (m *ExternalAuth) Created() types.DateTime {
|
|
return m.GetDateTime("created")
|
|
}
|
|
|
|
// Updated returns the "updated" record field value.
|
|
func (m *ExternalAuth) Updated() types.DateTime {
|
|
return m.GetDateTime("updated")
|
|
}
|
|
|
|
func (app *BaseApp) registerExternalAuthHooks() {
|
|
recordRefHooks[*ExternalAuth](app, CollectionNameExternalAuths, CollectionTypeAuth)
|
|
|
|
app.OnRecordValidate(CollectionNameExternalAuths).Bind(&hook.Handler[*RecordEvent]{
|
|
Func: func(e *RecordEvent) error {
|
|
providerNames := make([]any, 0, len(auth.Providers))
|
|
for name := range auth.Providers {
|
|
providerNames = append(providerNames, name)
|
|
}
|
|
|
|
provider := e.Record.GetString("provider")
|
|
if err := validation.Validate(provider, validation.Required, validation.In(providerNames...)); err != nil {
|
|
return validation.Errors{"provider": err}
|
|
}
|
|
|
|
return e.Next()
|
|
},
|
|
Priority: 99,
|
|
})
|
|
}
|