From c0a6a21b9eaafc54f8b6c83968f57fe635b021f0 Mon Sep 17 00:00:00 2001 From: Gani Georgiev Date: Mon, 19 Jun 2023 21:45:45 +0300 Subject: [PATCH] updated code comments and added some notes --- apis/base.go | 14 +++-- core/app.go | 145 ++++++++++++++++++++----------------------- go.mod | 15 ++--- go.sum | 28 +++++---- pocketbase.go | 1 + tools/hook/hook.go | 2 + tools/hook/tagged.go | 8 +-- 7 files changed, 110 insertions(+), 103 deletions(-) diff --git a/apis/base.go b/apis/base.go index cbf97c5d..bad9e9f7 100644 --- a/apis/base.go +++ b/apis/base.go @@ -95,6 +95,10 @@ func InitApi(app core.App) (*echo.Echo, error) { // send error response hookErr := app.OnBeforeApiError().Trigger(event, func(e *core.ApiErrorEvent) error { + if c.Response().Committed { + return nil + } + // @see https://github.com/labstack/echo/issues/608 if e.HttpContext.Request().Method == http.MethodHead { return e.HttpContext.NoContent(apiErr.Code) @@ -103,12 +107,14 @@ func InitApi(app core.App) (*echo.Echo, error) { return e.HttpContext.JSON(apiErr.Code, apiErr) }) - // truly rare case; eg. client already disconnected - if hookErr != nil && app.IsDebug() { + if hookErr == nil { + if err := app.OnAfterApiError().Trigger(event); err != nil && app.IsDebug() { + log.Println(hookErr) + } + } else if app.IsDebug() { + // truly rare case; eg. client already disconnected log.Println(hookErr) } - - app.OnAfterApiError().Trigger(event) } // admin ui routes diff --git a/core/app.go b/core/app.go index c333fa73..4963a1ec 100644 --- a/core/app.go +++ b/core/app.go @@ -131,21 +131,21 @@ type App interface { // App event hooks // --------------------------------------------------------------- - // OnBeforeBootstrap hook is triggered before initializing the base + // OnBeforeBootstrap hook is triggered before initializing the main // application resources (eg. before db open and initial settings load). OnBeforeBootstrap() *hook.Hook[*BootstrapEvent] - // OnAfterBootstrap hook is triggered after initializing the base + // OnAfterBootstrap hook is triggered after initializing the main // application resources (eg. after db open and initial settings load). OnAfterBootstrap() *hook.Hook[*BootstrapEvent] // OnBeforeServe hook is triggered before serving the internal router (echo), - // allowing you to adjust its options and attach new routes. + // allowing you to adjust its options and attach new routes or middlewares. OnBeforeServe() *hook.Hook[*ServeEvent] // OnBeforeApiError hook is triggered right before sending an error API // response to the client, allowing you to further modify the error data - // or to return a completely different API response (using [hook.StopPropagation]). + // or to return a completely different API response. OnBeforeApiError() *hook.Hook[*ApiErrorEvent] // OnAfterApiError hook is triggered right after sending an error API @@ -201,7 +201,7 @@ type App interface { // will be triggered and called only if their event data origin matches the tags. OnModelBeforeDelete(tags ...string) *hook.TaggedHook[*ModelEvent] - // OnModelAfterDelete is triggered after successfully deleting an + // OnModelAfterDelete hook is triggered after successfully deleting an // existing entry from the DB. // // If the optional "tags" list (table names and/or the Collection id for Record models) @@ -213,22 +213,18 @@ type App interface { // Mailer event hooks // --------------------------------------------------------------- - // OnMailerBeforeAdminResetPasswordSend hook is triggered right before - // sending a password reset email to an admin. - // - // Could be used to send your own custom email template if - // [hook.StopPropagation] is returned in one of its listeners. + // OnMailerBeforeAdminResetPasswordSend hook is triggered right + // before sending a password reset email to an admin, allowing you + // to inspect and customize the email message that is being sent. OnMailerBeforeAdminResetPasswordSend() *hook.Hook[*MailerAdminEvent] // OnMailerAfterAdminResetPasswordSend hook is triggered after // admin password reset email was successfully sent. OnMailerAfterAdminResetPasswordSend() *hook.Hook[*MailerAdminEvent] - // OnMailerBeforeRecordResetPasswordSend hook is triggered right before - // sending a password reset email to an auth record. - // - // Could be used to send your own custom email template if - // [hook.StopPropagation] is returned in one of its listeners. + // OnMailerBeforeRecordResetPasswordSend hook is triggered right + // before sending a password reset email to an auth record, allowing + // you to inspect and customize the email message that is being sent. // // If the optional "tags" list (Collection ids or names) is specified, // then all event handlers registered via the created hook will be @@ -243,11 +239,9 @@ type App interface { // triggered and called only if their event data origin matches the tags. OnMailerAfterRecordResetPasswordSend(tags ...string) *hook.TaggedHook[*MailerRecordEvent] - // OnMailerBeforeRecordVerificationSend hook is triggered right before - // sending a verification email to an auth record. - // - // Could be used to send your own custom email template if - // [hook.StopPropagation] is returned in one of its listeners. + // OnMailerBeforeRecordVerificationSend hook is triggered right + // before sending a verification email to an auth record, allowing + // you to inspect and customize the email message that is being sent. // // If the optional "tags" list (Collection ids or names) is specified, // then all event handlers registered via the created hook will be @@ -263,10 +257,8 @@ type App interface { OnMailerAfterRecordVerificationSend(tags ...string) *hook.TaggedHook[*MailerRecordEvent] // OnMailerBeforeRecordChangeEmailSend hook is triggered right before - // sending a confirmation new address email to an auth record. - // - // Could be used to send your own custom email template if - // [hook.StopPropagation] is returned in one of its listeners. + // sending a confirmation new address email to an auth record, allowing + // you to inspect and customize the email message that is being sent. // // If the optional "tags" list (Collection ids or names) is specified, // then all event handlers registered via the created hook will be @@ -328,8 +320,7 @@ type App interface { // Settings update request (after request data load and before settings persistence). // // Could be used to additionally validate the request data or - // implement completely different persistence behavior - // (returning [hook.StopPropagation]). + // implement completely different persistence behavior. OnSettingsBeforeUpdateRequest() *hook.Hook[*SettingsUpdateEvent] // OnSettingsAfterUpdateRequest hook is triggered after each @@ -383,7 +374,7 @@ type App interface { // Admin create request (after request data load and before model persistence). // // Could be used to additionally validate the request data or implement - // completely different persistence behavior (returning [hook.StopPropagation]). + // completely different persistence behavior. OnAdminBeforeCreateRequest() *hook.Hook[*AdminCreateEvent] // OnAdminAfterCreateRequest hook is triggered after each @@ -394,7 +385,7 @@ type App interface { // Admin update request (after request data load and before model persistence). // // Could be used to additionally validate the request data or implement - // completely different persistence behavior (returning [hook.StopPropagation]). + // completely different persistence behavior. OnAdminBeforeUpdateRequest() *hook.Hook[*AdminUpdateEvent] // OnAdminAfterUpdateRequest hook is triggered after each @@ -405,7 +396,7 @@ type App interface { // Admin delete request (after model load and before actual deletion). // // Could be used to additionally validate the request data or implement - // completely different delete behavior (returning [hook.StopPropagation]). + // completely different delete behavior. OnAdminBeforeDeleteRequest() *hook.Hook[*AdminDeleteEvent] // OnAdminAfterDeleteRequest hook is triggered after each @@ -434,7 +425,7 @@ type App interface { // auth refresh API request (right before generating a new auth token). // // Could be used to additionally validate the request data or implement - // completely different auth refresh behavior (returning [hook.StopPropagation]). + // completely different auth refresh behavior. OnAdminBeforeAuthRefreshRequest() *hook.Hook[*AdminAuthRefreshEvent] // OnAdminAfterAuthRefreshRequest hook is triggered after each @@ -445,7 +436,7 @@ type App interface { // request password reset API request (after request data load and before sending the reset email). // // Could be used to additionally validate the request data or implement - // completely different password reset behavior (returning [hook.StopPropagation]). + // completely different password reset behavior. OnAdminBeforeRequestPasswordResetRequest() *hook.Hook[*AdminRequestPasswordResetEvent] // OnAdminAfterRequestPasswordResetRequest hook is triggered after each @@ -456,7 +447,7 @@ type App interface { // confirm password reset API request (after request data load and before persistence). // // Could be used to additionally validate the request data or implement - // completely different persistence behavior (returning [hook.StopPropagation]). + // completely different persistence behavior. OnAdminBeforeConfirmPasswordResetRequest() *hook.Hook[*AdminConfirmPasswordResetEvent] // OnAdminAfterConfirmPasswordResetRequest hook is triggered after each @@ -482,7 +473,7 @@ type App interface { // auth with password API request (after request data load and before password validation). // // Could be used to implement for example a custom password validation - // or to locate a different Record identity (by assigning [RecordAuthWithPasswordEvent.Record]). + // or to locate a different Record model (by reassigning [RecordAuthWithPasswordEvent.Record]). // // If the optional "tags" list (Collection ids or names) is specified, // then all event handlers registered via the created hook will be @@ -500,11 +491,11 @@ type App interface { // OnRecordBeforeAuthWithOAuth2Request hook is triggered before each Record // OAuth2 sign-in/sign-up API request (after token exchange and before external provider linking). // - // If the [RecordAuthWithOAuth2Event.Record] is nil, then the OAuth2 + // If the [RecordAuthWithOAuth2Event.Record] is not set, then the OAuth2 // request will try to create a new auth Record. // // To assign or link a different existing record model you can - // overwrite/modify the [RecordAuthWithOAuth2Event.Record] field. + // change the [RecordAuthWithOAuth2Event.Record] field. // // If the optional "tags" list (Collection ids or names) is specified, // then all event handlers registered via the created hook will be @@ -523,7 +514,7 @@ type App interface { // auth refresh API request (right before generating a new auth token). // // Could be used to additionally validate the request data or implement - // completely different auth refresh behavior (returning [hook.StopPropagation]). + // completely different auth refresh behavior. // // If the optional "tags" list (Collection ids or names) is specified, // then all event handlers registered via the created hook will be @@ -538,11 +529,39 @@ type App interface { // triggered and called only if their event data origin matches the tags. OnRecordAfterAuthRefreshRequest(tags ...string) *hook.TaggedHook[*RecordAuthRefreshEvent] + // OnRecordListExternalAuthsRequest hook is triggered on each API record external auths list request. + // + // Could be used to validate or modify the response before returning it to the client. + // + // If the optional "tags" list (Collection ids or names) is specified, + // then all event handlers registered via the created hook will be + // triggered and called only if their event data origin matches the tags. + OnRecordListExternalAuthsRequest(tags ...string) *hook.TaggedHook[*RecordListExternalAuthsEvent] + + // OnRecordBeforeUnlinkExternalAuthRequest hook is triggered before each API record + // external auth unlink request (after models load and before the actual relation deletion). + // + // Could be used to additionally validate the request data or implement + // completely different delete behavior. + // + // If the optional "tags" list (Collection ids or names) is specified, + // then all event handlers registered via the created hook will be + // triggered and called only if their event data origin matches the tags. + OnRecordBeforeUnlinkExternalAuthRequest(tags ...string) *hook.TaggedHook[*RecordUnlinkExternalAuthEvent] + + // OnRecordAfterUnlinkExternalAuthRequest hook is triggered after each + // successful API record external auth unlink request. + // + // If the optional "tags" list (Collection ids or names) is specified, + // then all event handlers registered via the created hook will be + // triggered and called only if their event data origin matches the tags. + OnRecordAfterUnlinkExternalAuthRequest(tags ...string) *hook.TaggedHook[*RecordUnlinkExternalAuthEvent] + // OnRecordBeforeRequestPasswordResetRequest hook is triggered before each Record // request password reset API request (after request data load and before sending the reset email). // // Could be used to additionally validate the request data or implement - // completely different password reset behavior (returning [hook.StopPropagation]). + // completely different password reset behavior. // // If the optional "tags" list (Collection ids or names) is specified, // then all event handlers registered via the created hook will be @@ -561,7 +580,7 @@ type App interface { // confirm password reset API request (after request data load and before persistence). // // Could be used to additionally validate the request data or implement - // completely different persistence behavior (returning [hook.StopPropagation]). + // completely different persistence behavior. // // If the optional "tags" list (Collection ids or names) is specified, // then all event handlers registered via the created hook will be @@ -580,7 +599,7 @@ type App interface { // request verification API request (after request data load and before sending the verification email). // // Could be used to additionally validate the loaded request data or implement - // completely different verification behavior (returning [hook.StopPropagation]). + // completely different verification behavior. // // If the optional "tags" list (Collection ids or names) is specified, // then all event handlers registered via the created hook will be @@ -599,7 +618,7 @@ type App interface { // confirm verification API request (after request data load and before persistence). // // Could be used to additionally validate the request data or implement - // completely different persistence behavior (returning [hook.StopPropagation]). + // completely different persistence behavior. // // If the optional "tags" list (Collection ids or names) is specified, // then all event handlers registered via the created hook will be @@ -618,7 +637,7 @@ type App interface { // (after request data load and before sending the email link to confirm the change). // // Could be used to additionally validate the request data or implement - // completely different request email change behavior (returning [hook.StopPropagation]). + // completely different request email change behavior. // // If the optional "tags" list (Collection ids or names) is specified, // then all event handlers registered via the created hook will be @@ -637,7 +656,7 @@ type App interface { // confirm email change API request (after request data load and before persistence). // // Could be used to additionally validate the request data or implement - // completely different persistence behavior (returning [hook.StopPropagation]). + // completely different persistence behavior. // // If the optional "tags" list (Collection ids or names) is specified, // then all event handlers registered via the created hook will be @@ -652,34 +671,6 @@ type App interface { // triggered and called only if their event data origin matches the tags. OnRecordAfterConfirmEmailChangeRequest(tags ...string) *hook.TaggedHook[*RecordConfirmEmailChangeEvent] - // OnRecordListExternalAuthsRequest hook is triggered on each API record external auths list request. - // - // Could be used to validate or modify the response before returning it to the client. - // - // If the optional "tags" list (Collection ids or names) is specified, - // then all event handlers registered via the created hook will be - // triggered and called only if their event data origin matches the tags. - OnRecordListExternalAuthsRequest(tags ...string) *hook.TaggedHook[*RecordListExternalAuthsEvent] - - // OnRecordBeforeUnlinkExternalAuthRequest hook is triggered before each API record - // external auth unlink request (after models load and before the actual relation deletion). - // - // Could be used to additionally validate the request data or implement - // completely different delete behavior (returning [hook.StopPropagation]). - // - // If the optional "tags" list (Collection ids or names) is specified, - // then all event handlers registered via the created hook will be - // triggered and called only if their event data origin matches the tags. - OnRecordBeforeUnlinkExternalAuthRequest(tags ...string) *hook.TaggedHook[*RecordUnlinkExternalAuthEvent] - - // OnRecordAfterUnlinkExternalAuthRequest hook is triggered after each - // successful API record external auth unlink request. - // - // If the optional "tags" list (Collection ids or names) is specified, - // then all event handlers registered via the created hook will be - // triggered and called only if their event data origin matches the tags. - OnRecordAfterUnlinkExternalAuthRequest(tags ...string) *hook.TaggedHook[*RecordUnlinkExternalAuthEvent] - // --------------------------------------------------------------- // Record CRUD API event hooks // --------------------------------------------------------------- @@ -706,7 +697,7 @@ type App interface { // create request (after request data load and before model persistence). // // Could be used to additionally validate the request data or implement - // completely different persistence behavior (returning [hook.StopPropagation]). + // completely different persistence behavior. // // If the optional "tags" list (Collection ids or names) is specified, // then all event handlers registered via the created hook will be @@ -725,7 +716,7 @@ type App interface { // update request (after request data load and before model persistence). // // Could be used to additionally validate the request data or implement - // completely different persistence behavior (returning [hook.StopPropagation]). + // completely different persistence behavior. // // If the optional "tags" list (Collection ids or names) is specified, // then all event handlers registered via the created hook will be @@ -744,7 +735,7 @@ type App interface { // delete request (after model load and before actual deletion). // // Could be used to additionally validate the request data or implement - // completely different delete behavior (returning [hook.StopPropagation]). + // completely different delete behavior. // // If the optional "tags" list (Collection ids or names) is specified, // then all event handlers registered via the created hook will be @@ -777,7 +768,7 @@ type App interface { // create request (after request data load and before model persistence). // // Could be used to additionally validate the request data or implement - // completely different persistence behavior (returning [hook.StopPropagation]). + // completely different persistence behavior. OnCollectionBeforeCreateRequest() *hook.Hook[*CollectionCreateEvent] // OnCollectionAfterCreateRequest hook is triggered after each @@ -788,7 +779,7 @@ type App interface { // update request (after request data load and before model persistence). // // Could be used to additionally validate the request data or implement - // completely different persistence behavior (returning [hook.StopPropagation]). + // completely different persistence behavior. OnCollectionBeforeUpdateRequest() *hook.Hook[*CollectionUpdateEvent] // OnCollectionAfterUpdateRequest hook is triggered after each @@ -799,7 +790,7 @@ type App interface { // Collection delete request (after model load and before actual deletion). // // Could be used to additionally validate the request data or implement - // completely different delete behavior (returning [hook.StopPropagation]). + // completely different delete behavior. OnCollectionBeforeDeleteRequest() *hook.Hook[*CollectionDeleteEvent] // OnCollectionAfterDeleteRequest hook is triggered after each @@ -810,7 +801,7 @@ type App interface { // collections import request (after request data load and before the actual import). // // Could be used to additionally validate the imported collections or - // to implement completely different import behavior (returning [hook.StopPropagation]). + // to implement completely different import behavior. OnCollectionsBeforeImportRequest() *hook.Hook[*CollectionsImportEvent] // OnCollectionsAfterImportRequest hook is triggered after each diff --git a/go.mod b/go.mod index 9c781977..027b8b33 100644 --- a/go.mod +++ b/go.mod @@ -18,11 +18,12 @@ require ( github.com/labstack/echo/v5 v5.0.0-20220201181537-ed2888cfa198 github.com/mattn/go-sqlite3 v1.14.17 github.com/pocketbase/dbx v1.10.0 + github.com/pocketbase/tygoja v0.0.0-20230618203136-2f8d57768be1 github.com/spf13/cast v1.5.1 github.com/spf13/cobra v1.7.0 gocloud.dev v0.29.0 - golang.org/x/crypto v0.9.0 - golang.org/x/net v0.10.0 + golang.org/x/crypto v0.10.0 + golang.org/x/net v0.11.0 golang.org/x/oauth2 v0.8.0 modernc.org/sqlite v1.23.0 ) @@ -71,12 +72,12 @@ require ( github.com/valyala/fasttemplate v1.2.2 // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/image v0.7.0 // indirect - golang.org/x/mod v0.10.0 // indirect - golang.org/x/sys v0.8.0 // indirect - golang.org/x/term v0.8.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/sys v0.9.0 // indirect + golang.org/x/term v0.9.0 // indirect + golang.org/x/text v0.10.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.9.3 // indirect + golang.org/x/tools v0.10.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.125.0 // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/go.sum b/go.sum index e065771d..2e9a2886 100644 --- a/go.sum +++ b/go.sum @@ -1639,6 +1639,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pocketbase/dbx v1.10.0 h1:58VIT7r6T+BnVbYVosvGBsPjQEic3/VFRYGT823vWSQ= github.com/pocketbase/dbx v1.10.0/go.mod h1:xXRCIAKTHMgUCyCKZm55pUOdvFziJjQfXaWKhu2vhMs= +github.com/pocketbase/tygoja v0.0.0-20230618203136-2f8d57768be1 h1:0FQXnhUhBeF/z6UDj9Zm8GQHFHJSUtqLr1h4/YXf3vc= +github.com/pocketbase/tygoja v0.0.0-20230618203136-2f8d57768be1/go.mod h1:dOJ+pCyqm/jRn5kO/TX598J0e5xGDcJAZerK5atCrKI= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= @@ -2011,8 +2013,8 @@ golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20221012134737-56aed061732a/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2064,8 +2066,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= 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.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2155,8 +2157,9 @@ golang.org/x/net v0.3.1-0.20221206200815-1e63c2f08a10/go.mod h1:MBQ8lrhLObU/6UmL golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU= +golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2207,7 +2210,7 @@ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2360,8 +2363,9 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.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 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -2373,8 +2377,9 @@ golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= +golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2389,8 +2394,9 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.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 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= +golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2494,8 +2500,8 @@ golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.10.0 h1:tvDr/iQoUqNdohiYm0LmmKcBk+q86lb9EprIUFhHHGg= +golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/pocketbase.go b/pocketbase.go index 99f3d32e..dcfae07c 100644 --- a/pocketbase.go +++ b/pocketbase.go @@ -163,6 +163,7 @@ func (pb *PocketBase) Execute() error { go func() { if err := pb.RootCmd.Execute(); err != nil { // @todo replace with db log once generalized logs are added + // and maybe consider reorganizing the code to return os.Exit(1) // (note may need to update the existing commands to not silence errors) color.Red(err.Error()) } diff --git a/tools/hook/hook.go b/tools/hook/hook.go index eb6780ee..c1acc033 100644 --- a/tools/hook/hook.go +++ b/tools/hook/hook.go @@ -57,6 +57,7 @@ func (h *Hook[T]) Add(fn Handler[T]) string { return id } +// @todo add also to TaggedHook // Remove removes a single hook handler by its id. func (h *Hook[T]) Remove(id string) { h.mux.Lock() @@ -70,6 +71,7 @@ func (h *Hook[T]) Remove(id string) { } } +// @todo add also to TaggedHook // RemoveAll removes all registered handlers. func (h *Hook[T]) RemoveAll() { h.mux.Lock() diff --git a/tools/hook/tagged.go b/tools/hook/tagged.go index 47beb73e..f0906f3f 100644 --- a/tools/hook/tagged.go +++ b/tools/hook/tagged.go @@ -50,8 +50,8 @@ func (h *TaggedHook[T]) CanTriggerOn(tags []string) bool { // PreAdd registers a new handler to the hook by prepending it to the existing queue. // // The fn handler will be called only if the event data tags satisfy h.CanTriggerOn. -func (h *TaggedHook[T]) PreAdd(fn Handler[T]) { - h.mainHook.PreAdd(func(e T) error { +func (h *TaggedHook[T]) PreAdd(fn Handler[T]) string { + return h.mainHook.PreAdd(func(e T) error { if h.CanTriggerOn(e.Tags()) { return fn(e) } @@ -63,8 +63,8 @@ func (h *TaggedHook[T]) PreAdd(fn Handler[T]) { // Add registers a new handler to the hook by appending it to the existing queue. // // The fn handler will be called only if the event data tags satisfy h.CanTriggerOn. -func (h *TaggedHook[T]) Add(fn Handler[T]) { - h.mainHook.Add(func(e T) error { +func (h *TaggedHook[T]) Add(fn Handler[T]) string { + return h.mainHook.Add(func(e T) error { if h.CanTriggerOn(e.Tags()) { return fn(e) }