Skip to content

Commit a49f146

Browse files
committed
feat(useraccount): implement login event
1 parent 6a28f9b commit a49f146

File tree

6 files changed

+261
-28
lines changed

6 files changed

+261
-28
lines changed

internal/useraccount/delete_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
"github.com/database-playground/backend-v2/ent"
88
"github.com/database-playground/backend-v2/ent/group"
9+
"github.com/database-playground/backend-v2/internal/events"
910
"github.com/database-playground/backend-v2/internal/useraccount"
1011
"github.com/stretchr/testify/require"
1112
)
@@ -35,7 +36,8 @@ func TestDeleteUser(t *testing.T) {
3536
t.Run(tt.name, func(t *testing.T) {
3637
client := setupTestDatabase(t)
3738
authStorage := newMockAuthStorage()
38-
ctx := useraccount.NewContext(client, authStorage)
39+
eventService := events.NewEventService(client)
40+
ctx := useraccount.NewContext(client, authStorage, eventService)
3941

4042
var userID int
4143
if tt.setupUser {
@@ -76,7 +78,8 @@ func TestDeleteUser(t *testing.T) {
7678
func TestDeleteUser_Integration(t *testing.T) {
7779
client := setupTestDatabase(t)
7880
authStorage := newMockAuthStorage()
79-
ctx := useraccount.NewContext(client, authStorage)
81+
eventService := events.NewEventService(client)
82+
ctx := useraccount.NewContext(client, authStorage, eventService)
8083

8184
// Get the unverified group
8285
unverifiedGroup, err := client.Group.Query().Where(group.NameEQ(useraccount.UnverifiedGroupSlug)).Only(context.Background())

internal/useraccount/register_flow_test.go

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"testing"
66

77
"github.com/database-playground/backend-v2/ent/group"
8+
"github.com/database-playground/backend-v2/internal/events"
89
"github.com/database-playground/backend-v2/internal/testhelper"
910
"github.com/database-playground/backend-v2/internal/useraccount"
1011
"github.com/stretchr/testify/assert"
@@ -14,7 +15,8 @@ import (
1415
func TestGetOrRegister_NewUser(t *testing.T) {
1516
client := setupTestDatabase(t)
1617
authStorage := newMockAuthStorage()
17-
ctx := useraccount.NewContext(client, authStorage)
18+
eventService := events.NewEventService(client)
19+
ctx := useraccount.NewContext(client, authStorage, eventService)
1820
context := context.Background()
1921

2022
req := useraccount.UserRegisterRequest{
@@ -45,7 +47,8 @@ func TestGetOrRegister_NewUser(t *testing.T) {
4547
func TestGetOrRegister_ExistingUser(t *testing.T) {
4648
client := setupTestDatabase(t)
4749
authStorage := newMockAuthStorage()
48-
ctx := useraccount.NewContext(client, authStorage)
50+
eventService := events.NewEventService(client)
51+
ctx := useraccount.NewContext(client, authStorage, eventService)
4952
context := context.Background()
5053

5154
// Create an existing user
@@ -78,7 +81,8 @@ func TestGetOrRegister_MissingUnverifiedGroup(t *testing.T) {
7881
// Create a fresh database without setup
7982
client := testhelper.NewEntSqliteClient(t)
8083
authStorage := newMockAuthStorage()
81-
ctx := useraccount.NewContext(client, authStorage)
84+
eventService := events.NewEventService(client)
85+
ctx := useraccount.NewContext(client, authStorage, eventService)
8286
context := context.Background()
8387

8488
req := useraccount.UserRegisterRequest{
@@ -94,7 +98,8 @@ func TestGetOrRegister_MissingUnverifiedGroup(t *testing.T) {
9498
func TestVerify_Success(t *testing.T) {
9599
client := setupTestDatabase(t)
96100
authStorage := newMockAuthStorage()
97-
ctx := useraccount.NewContext(client, authStorage)
101+
eventService := events.NewEventService(client)
102+
ctx := useraccount.NewContext(client, authStorage, eventService)
98103
context := context.Background()
99104

100105
// Create an unverified user
@@ -130,7 +135,8 @@ func TestVerify_Success(t *testing.T) {
130135
func TestVerify_UserNotFound(t *testing.T) {
131136
client := setupTestDatabase(t)
132137
authStorage := newMockAuthStorage()
133-
ctx := useraccount.NewContext(client, authStorage)
138+
eventService := events.NewEventService(client)
139+
ctx := useraccount.NewContext(client, authStorage, eventService)
134140
context := context.Background()
135141

136142
err := ctx.Verify(context, 99999) // Non-existent user ID
@@ -141,7 +147,8 @@ func TestVerify_UserNotFound(t *testing.T) {
141147
func TestVerify_UserAlreadyVerified(t *testing.T) {
142148
client := setupTestDatabase(t)
143149
authStorage := newMockAuthStorage()
144-
ctx := useraccount.NewContext(client, authStorage)
150+
eventService := events.NewEventService(client)
151+
ctx := useraccount.NewContext(client, authStorage, eventService)
145152
context := context.Background()
146153

147154
// Create a user in new-user group (already verified)
@@ -165,7 +172,8 @@ func TestVerify_MissingNewUserGroup(t *testing.T) {
165172
// Create a fresh database without setup
166173
client := testhelper.NewEntSqliteClient(t)
167174
authStorage := newMockAuthStorage()
168-
ctx := useraccount.NewContext(client, authStorage)
175+
eventService := events.NewEventService(client)
176+
ctx := useraccount.NewContext(client, authStorage, eventService)
169177
context := context.Background()
170178

171179
// Create only unverified group
@@ -191,7 +199,8 @@ func TestVerify_MissingNewUserGroup(t *testing.T) {
191199
func TestRegistrationFlow_Complete(t *testing.T) {
192200
client := setupTestDatabase(t)
193201
authStorage := newMockAuthStorage()
194-
ctx := useraccount.NewContext(client, authStorage)
202+
eventService := events.NewEventService(client)
203+
ctx := useraccount.NewContext(client, authStorage, eventService)
195204
context := context.Background()
196205

197206
// Step 1: Register new user (should be unverified)
@@ -240,7 +249,8 @@ func TestRegistrationFlow_Complete(t *testing.T) {
240249
func TestRegistrationFlow_ExistingUser(t *testing.T) {
241250
client := setupTestDatabase(t)
242251
authStorage := newMockAuthStorage()
243-
ctx := useraccount.NewContext(client, authStorage)
252+
eventService := events.NewEventService(client)
253+
ctx := useraccount.NewContext(client, authStorage, eventService)
244254
context := context.Background()
245255

246256
// Create an existing verified user
@@ -281,7 +291,8 @@ func TestRegistrationFlow_ErrorCases(t *testing.T) {
281291
// Create a fresh database without setup
282292
client := testhelper.NewEntSqliteClient(t)
283293
authStorage := newMockAuthStorage()
284-
ctx := useraccount.NewContext(client, authStorage)
294+
eventService := events.NewEventService(client)
295+
ctx := useraccount.NewContext(client, authStorage, eventService)
285296
context := context.Background()
286297

287298
req := useraccount.UserRegisterRequest{
@@ -297,7 +308,8 @@ func TestRegistrationFlow_ErrorCases(t *testing.T) {
297308
t.Run("verify already verified user", func(t *testing.T) {
298309
client := setupTestDatabase(t)
299310
authStorage := newMockAuthStorage()
300-
ctx := useraccount.NewContext(client, authStorage)
311+
eventService := events.NewEventService(client)
312+
ctx := useraccount.NewContext(client, authStorage, eventService)
301313
context := context.Background()
302314

303315
// Create verified user
@@ -320,7 +332,8 @@ func TestRegistrationFlow_ErrorCases(t *testing.T) {
320332
t.Run("verify non-existent user", func(t *testing.T) {
321333
client := setupTestDatabase(t)
322334
authStorage := newMockAuthStorage()
323-
ctx := useraccount.NewContext(client, authStorage)
335+
eventService := events.NewEventService(client)
336+
ctx := useraccount.NewContext(client, authStorage, eventService)
324337
context := context.Background()
325338

326339
err := ctx.Verify(context, 99999)

internal/useraccount/token.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
"github.com/database-playground/backend-v2/ent"
88
"github.com/database-playground/backend-v2/internal/auth"
9+
"github.com/database-playground/backend-v2/internal/events"
910
)
1011

1112
const (
@@ -57,7 +58,22 @@ func (c *Context) GrantToken(ctx context.Context, user *ent.User, machine string
5758
MetaInitiateFromFlow: options.flow,
5859
}
5960
if options.impersonatorID != 0 {
61+
c.eventService.TriggerEvent(ctx, events.Event{
62+
Type: events.EventTypeImpersonated,
63+
UserID: user.ID,
64+
Payload: map[string]any{
65+
"impersonator_id": options.impersonatorID,
66+
},
67+
})
6068
meta[MetaImpersonation] = strconv.Itoa(options.impersonatorID)
69+
} else {
70+
c.eventService.TriggerEvent(ctx, events.Event{
71+
Type: events.EventTypeLogin,
72+
UserID: user.ID,
73+
Payload: map[string]any{
74+
"machine": machine,
75+
},
76+
})
6177
}
6278

6379
token, err := c.auth.Create(ctx, auth.TokenInfo{

0 commit comments

Comments
 (0)