feat(gateway): confirmEmailLink RPC + language on the email request + profile event
Add the confirm-link edge method (auth.email.confirm_link): a new EmailConfirmLinkRequest/Result fbs table, the transcode const + handler + encoder, and the backend-client call to the existing /sessions/email/confirm-link endpoint — it rides Execute under the existing service prefix, so no proto/Caddy change. Add a language field to EmailRequestRequest and forward it (the backend already seeds it). Add the NotifyProfile sub-kind + notify.ProfileChanged, published by the confirm-link handler on a successful link so an in-app session re-fetches its profile when the email was confirmed in another browser. Regenerated fbs bindings (Go + TS).
This commit is contained in:
@@ -9,6 +9,7 @@ import (
|
||||
"go.uber.org/zap"
|
||||
|
||||
"scrabble/backend/internal/account"
|
||||
"scrabble/backend/internal/notify"
|
||||
)
|
||||
|
||||
// The /api/v1/internal/sessions/* endpoints are gateway-only: the gateway has
|
||||
@@ -252,11 +253,14 @@ func (s *Server) handleEmailConfirmLink(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, confirmLinkResponse{Purpose: "login", Status: "confirmed", Session: &sess})
|
||||
return
|
||||
}
|
||||
status := "confirmed"
|
||||
if res.NeedsMerge {
|
||||
status = "merge_required"
|
||||
c.JSON(http.StatusOK, confirmLinkResponse{Purpose: "link", Status: "merge_required"})
|
||||
return
|
||||
}
|
||||
c.JSON(http.StatusOK, confirmLinkResponse{Purpose: "link", Status: status})
|
||||
// A free link attached the email; nudge the account's in-app session(s) to re-fetch
|
||||
// the profile, so a link confirmed in another browser reflects at once.
|
||||
s.notifier.Publish(notify.ProfileChanged(res.Account))
|
||||
c.JSON(http.StatusOK, confirmLinkResponse{Purpose: "link", Status: "confirmed"})
|
||||
}
|
||||
|
||||
// tokenRequest carries an opaque session token.
|
||||
|
||||
Reference in New Issue
Block a user