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, | ||
|  | 	}) | ||
|  | } |