Skip to content

Commit 5221c72

Browse files
committed
feat: demo smallest possible hooks change
1 parent 88bb2c0 commit 5221c72

File tree

6 files changed

+98
-0
lines changed

6 files changed

+98
-0
lines changed

internal/api/anonymous.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,10 @@ func (a *API) SignupAnonymously(w http.ResponseWriter, r *http.Request) error {
5252
}
5353

5454
metering.RecordLogin("anonymous", newUser.ID)
55+
56+
if err := a.triggerAfterUserCreated(newUser.ID); err != nil {
57+
return err
58+
}
59+
5560
return sendJSON(w, http.StatusOK, token)
5661
}

internal/api/external.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ func (a *API) createAccountFromExternalIdentity(tx *storage.Connection, r *http.
334334
return nil, terr
335335
}
336336
user.Identities = append(user.Identities, *identity)
337+
337338
case models.AccountExists:
338339
user = decision.User
339340
identity = decision.Identities[0]
@@ -408,6 +409,12 @@ func (a *API) createAccountFromExternalIdentity(tx *storage.Connection, r *http.
408409
}
409410
}
410411

412+
if decision.Decision == models.CreateAccount {
413+
if err := a.triggerAfterUserCreated(user.ID); err != nil {
414+
return nil, err
415+
}
416+
}
417+
411418
return user, nil
412419
}
413420

internal/api/invite.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ func (a *API) Invite(w http.ResponseWriter, r *http.Request) error {
3838
return apierrors.NewInternalServerError("Database error finding user").WithInternalError(err)
3939
}
4040

41+
userWasSignedUp := true
4142
err = db.Transaction(func(tx *storage.Connection) error {
4243
if user != nil {
4344
if user.IsConfirmed() {
@@ -71,6 +72,7 @@ func (a *API) Invite(w http.ResponseWriter, r *http.Request) error {
7172
return err
7273
}
7374
user.Identities = []models.Identity{*identity}
75+
userWasSignedUp = true
7476
}
7577

7678
if terr := models.NewAuditLogEntry(r, tx, adminUser, models.UserInvitedAction, "", map[string]interface{}{
@@ -89,5 +91,11 @@ func (a *API) Invite(w http.ResponseWriter, r *http.Request) error {
8991
return err
9092
}
9193

94+
if userWasSignedUp {
95+
if err := a.triggerAfterUserCreated(user.ID); err != nil {
96+
return err
97+
}
98+
}
99+
92100
return sendJSON(w, http.StatusOK, user)
93101
}

internal/api/mail.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ func (a *API) adminGenerateLink(w http.ResponseWriter, r *http.Request) error {
112112
}
113113
}
114114

115+
userWasSignedUp := false
115116
err = db.Transaction(func(tx *storage.Connection) error {
116117
var terr error
117118
switch params.Type {
@@ -165,6 +166,7 @@ func (a *API) adminGenerateLink(w http.ResponseWriter, r *http.Request) error {
165166
return terr
166167
}
167168
user.Identities = []models.Identity{*identity}
169+
userWasSignedUp = true
168170
}
169171
if terr = models.NewAuditLogEntry(r, tx, adminUser, models.UserInvitedAction, "", map[string]interface{}{
170172
"user_id": user.ID,
@@ -210,6 +212,7 @@ func (a *API) adminGenerateLink(w http.ResponseWriter, r *http.Request) error {
210212
return terr
211213
}
212214
user.Identities = []models.Identity{*identity}
215+
userWasSignedUp = true
213216
}
214217
user.ConfirmationToken = hashedToken
215218
user.ConfirmationSentAt = &now
@@ -284,6 +287,12 @@ func (a *API) adminGenerateLink(w http.ResponseWriter, r *http.Request) error {
284287
return err
285288
}
286289

290+
if userWasSignedUp && user != nil {
291+
if err := a.triggerAfterUserCreated(user.ID); err != nil {
292+
return err
293+
}
294+
}
295+
287296
resp := GenerateLinkResponse{
288297
User: *user,
289298
ActionLink: url,

internal/api/signup.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/supabase/auth/internal/api/apierrors"
1212
"github.com/supabase/auth/internal/api/provider"
1313
"github.com/supabase/auth/internal/api/sms_provider"
14+
"github.com/supabase/auth/internal/hooks/v0hooks"
1415
"github.com/supabase/auth/internal/metering"
1516
"github.com/supabase/auth/internal/models"
1617
"github.com/supabase/auth/internal/storage"
@@ -185,6 +186,7 @@ func (a *API) Signup(w http.ResponseWriter, r *http.Request) error {
185186
}
186187
}
187188

189+
userWasSignedUp := false
188190
err = db.Transaction(func(tx *storage.Connection) error {
189191
var terr error
190192
if user != nil {
@@ -197,6 +199,7 @@ func (a *API) Signup(w http.ResponseWriter, r *http.Request) error {
197199
if terr != nil {
198200
return terr
199201
}
202+
userWasSignedUp = true
200203
}
201204
identity, terr := models.FindIdentityByIdAndProvider(tx, user.ID.String(), params.Provider)
202205
if terr != nil {
@@ -327,6 +330,13 @@ func (a *API) Signup(w http.ResponseWriter, r *http.Request) error {
327330
user.UserMetaData = map[string]interface{}{}
328331
user.Identities = []models.Identity{}
329332
}
333+
334+
if userWasSignedUp {
335+
if err := a.triggerAfterUserCreated(user.ID); err != nil {
336+
return err
337+
}
338+
}
339+
330340
return sendJSON(w, http.StatusOK, user)
331341
}
332342

@@ -366,6 +376,10 @@ func sanitizeUser(u *models.User, params *SignupParams) (*models.User, error) {
366376
func (a *API) signupNewUser(conn *storage.Connection, user *models.User) (*models.User, error) {
367377
config := a.config
368378

379+
if err := a.triggerBeforeUserCreated(); err != nil {
380+
return user, err
381+
}
382+
369383
err := conn.Transaction(func(tx *storage.Connection) error {
370384
var terr error
371385
if terr = tx.Create(user); terr != nil {
@@ -389,3 +403,26 @@ func (a *API) signupNewUser(conn *storage.Connection, user *models.User) (*model
389403

390404
return user, nil
391405
}
406+
407+
func (a *API) triggerAfterUserCreated(userID uuid.UUID) error {
408+
// todo: fetch fresh user based on userID
409+
input := v0hooks.AfterUserCreatedOutput{}
410+
output := v0hooks.AfterUserCreatedOutput{}
411+
err := a.hooksMgr.InvokeHook(nil, nil, &input, &output)
412+
if err != nil {
413+
return err
414+
}
415+
416+
return nil
417+
}
418+
419+
func (a *API) triggerBeforeUserCreated( /* todo: params */ ) error {
420+
input := v0hooks.BeforeUserCreatedOutput{}
421+
output := v0hooks.BeforeUserCreatedOutput{}
422+
err := a.hooksMgr.InvokeHook(nil, nil, &input, &output)
423+
if err != nil {
424+
return err
425+
}
426+
427+
return nil
428+
}

internal/hooks/v0hooks/v0hooks.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,38 @@ type AccessTokenClaims struct {
107107
IsAnonymous bool `json:"is_anonymous"`
108108
}
109109

110+
type BeforeUserCreatedInput struct {
111+
User *models.User `json:"user"`
112+
}
113+
114+
type BeforeUserCreatedOutput struct {
115+
Something string `json:"something"`
116+
}
117+
118+
func (mf *BeforeUserCreatedOutput) IsError() bool {
119+
return false
120+
}
121+
122+
func (mf *BeforeUserCreatedOutput) Error() string {
123+
return ""
124+
}
125+
126+
type AfterUserCreatedInput struct {
127+
User *models.User `json:"user"`
128+
}
129+
130+
type AfterUserCreatedOutput struct {
131+
Something string `json:"something"`
132+
}
133+
134+
func (mf *AfterUserCreatedOutput) IsError() bool {
135+
return false
136+
}
137+
138+
func (mf *AfterUserCreatedOutput) Error() string {
139+
return ""
140+
}
141+
110142
type MFAVerificationAttemptInput struct {
111143
UserID uuid.UUID `json:"user_id"`
112144
FactorID uuid.UUID `json:"factor_id"`

0 commit comments

Comments
 (0)