/
users.go
69 lines (57 loc) · 1.92 KB
/
users.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package db
import (
"context"
"time"
"github.com/gosimple/slug"
"github.com/rotationalio/ensign/pkg/quarterdeck/tokens"
)
// CreateUserResources creates all the necessary database objects for a new user given
// a partially constructed member model. This method should be called after a new user
// has been successfully registered with Quarterdeck in order to allow the user to
// access default resources such as the tenant and user profile info when they login.
func CreateUserResources(ctx context.Context, member *Member) (err error) {
// Ensure the user data is valid before creating anything
if err = member.Validate(); err != nil {
return err
}
// New user should have a tenant
tenant := &Tenant{
OrgID: member.OrgID,
EnvironmentType: "development",
}
if member.Workspace == "" {
tenant.Name = slug.Make("dev-" + member.Workspace)
} else {
tenant.Name = "dev-tenant"
}
if err = CreateTenant(ctx, tenant); err != nil {
return err
}
// Create the member record for the user
if err = CreateMember(ctx, member); err != nil {
return err
}
return nil
}
// UpdateLastLogin is a helper method that updates the last login time for a member
// given an access token. This should normally be called in a background task to
// prevent blocking the user from logging in.
func UpdateLastLogin(ctx context.Context, accessToken string, login time.Time) (err error) {
// Parse the claims from the access token
var claims *tokens.Claims
if claims, err = tokens.ParseUnverifiedTokenClaims(accessToken); err != nil {
return err
}
// Retrieve the member record to update
// TODO: This should be in a trtl transaction to prevent updates being stomped
var member *Member
if member, err = RetrieveMember(ctx, claims.ParseOrgID(), claims.ParseUserID()); err != nil {
return err
}
// Update the last login time
member.LastActivity = login
if err = UpdateMember(ctx, member); err != nil {
return err
}
return nil
}