- golem15_user_backend_links (1:1, both sides unique) and one-shot hashed
golem15_user_backend_link_requests (golem15.user.backend_links.request_ttl, 10m)
- classes.BackendLinks: CreateLinkRequest, ConfirmLinkRequest (row lock,
JWT iat not before the request), SetLink, RemoveLink, LinkedBackendUser;
published as *classes.BackendLinks and pact.MCPLinkedBackendResolver
- GET /_user/api/v1/backend-link/{code} and POST /backend-link/confirm (jwt.auth)
- My account section frontend_account with link and unlink
- BackendLinkedEvent, BackendUnlinkedEvent and pact.MCPSubjectChanged after commit;
deleting or deactivating a frontend user removes its link
- golem15.user.frontend_url (falls back to app.url)
93 lines
3.2 KiB
Go
93 lines
3.2 KiB
Go
package classes
|
|
|
|
import (
|
|
"git.golem15.com/golem15/sm-user-plugin/models"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// CreatedEventName is the festival name of CreatedEvent (D-13 / RESEARCH A6).
|
|
const CreatedEventName = "user.Created"
|
|
|
|
// DeletingEventName is the festival name of DeletingEvent (D-13 / RESEARCH A6).
|
|
const DeletingEventName = "user.Deleting"
|
|
|
|
// DeactivatingEventName is the festival name of DeactivatingEvent.
|
|
const DeactivatingEventName = "user.Deactivating"
|
|
|
|
// BackendLinkedEventName is the festival name of BackendLinkedEvent.
|
|
const BackendLinkedEventName = "user.BackendLinked"
|
|
|
|
// BackendUnlinkedEventName is the festival name of BackendUnlinkedEvent.
|
|
const BackendUnlinkedEventName = "user.BackendUnlinked"
|
|
|
|
// GetApiArrayEvent is the fire-and-collect payload other plugins extend.
|
|
type GetApiArrayEvent struct {
|
|
User *models.User
|
|
data map[string]any
|
|
}
|
|
|
|
// Collected returns the map listeners merge into the user payload.
|
|
func (e *GetApiArrayEvent) Collected() map[string]any {
|
|
if e.data == nil {
|
|
e.data = map[string]any{}
|
|
}
|
|
return e.data
|
|
}
|
|
|
|
// RegisterEvent is fired after a user row is created (Winter's
|
|
// golem15.user.register).
|
|
type RegisterEvent struct {
|
|
User *models.User
|
|
// Payload is a copy of the register input, mirroring the data array
|
|
// Winter passes with golem15.user.register, so a listener can read
|
|
// extra keys a client sent (an invitation token, for example).
|
|
// password and password_confirmation are never included, in plaintext
|
|
// or hashed. Listeners must treat it as read-only input.
|
|
Payload map[string]any
|
|
}
|
|
|
|
// CreatedEvent fires from every user create path (API register and admin
|
|
// create) so listeners can run inside the same write, including handle
|
|
// generation (D-13, D-15). Tx is the create transaction when there is one.
|
|
type CreatedEvent struct {
|
|
User *models.User
|
|
Tx *gorm.DB
|
|
}
|
|
|
|
// DeletingEvent fires from FormAfterDelete before ForceDeleteCleanup /
|
|
// unscoped delete, inside the same transaction, so listeners (chatchannels
|
|
// GDPR) can sever rows before the user row is gone (D-13, T-19-07).
|
|
type DeletingEvent struct {
|
|
User *models.User
|
|
Tx *gorm.DB
|
|
}
|
|
|
|
// DeactivatingEvent fires after a user is soft-deleted (deactivated, the
|
|
// PHP $user->delete()) by the admin deactivate action, inside the same
|
|
// transaction, so listeners can revoke what a deactivated account must not
|
|
// keep (OAuth grants, for example) while leaving what a restore needs. The
|
|
// user's session JWTs and personal API tokens are already revoked when it
|
|
// fires (DeactivateUsers calls RevokeUserAccess). A listener error rolls the
|
|
// deactivation back.
|
|
type DeactivatingEvent struct {
|
|
User *models.User
|
|
Tx *gorm.DB
|
|
}
|
|
|
|
// BackendLinkedEvent fires inside the write transaction after a link was
|
|
// stored, by the frontend user's confirmation (Link.LinkedBy nil) or by an
|
|
// administrator (Link.LinkedBy set). A listener error rolls the link back.
|
|
type BackendLinkedEvent struct {
|
|
Link *models.BackendLink
|
|
Tx *gorm.DB
|
|
}
|
|
|
|
// BackendUnlinkedEvent fires inside the write transaction after a link was
|
|
// removed, from My account, the Administrators screen or because one of the
|
|
// accounts was deleted or deactivated. A listener error rolls the removal
|
|
// back.
|
|
type BackendUnlinkedEvent struct {
|
|
Link *models.BackendLink
|
|
Tx *gorm.DB
|
|
}
|