Skip to content
This repository has been archived by the owner on Jul 12, 2023. It is now read-only.

Commit

Permalink
Redirect to show page after user-create (#598)
Browse files Browse the repository at this point in the history
* User to index  page

* this is an admin page

* keep returns

* user create
  • Loading branch information
whaught authored Sep 19, 2020
1 parent d23186b commit 7f89d44
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 63 deletions.
23 changes: 0 additions & 23 deletions cmd/server/assets/users/new.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@
<head>
{{template "head" .}}
{{template "floatingform" .}}
{{if .created}}
{{template "firebase" .}}
{{end}}
</head>

<body class="bg-light">
Expand All @@ -34,26 +31,6 @@ <h1>New user</h1>
</main>

{{template "scripts" .}}
{{if .created}}
<script type="text/javascript">
$(function() {
let $allUsers = $('#all-users');
let $submit = $('#submit-user');

let email = {{.user.Email}};

firebase.auth().sendPasswordResetEmail(email)
.then(function() {
flash.alert(`Successfully created user '{{.user.Name}}'.`);
}).catch(function(error) {
flash.error(error.message);
}).then(function() {
$submit.prop('disabled', false);
$allUsers.removeClass('disabled');
});
});
</script>
{{end}}
</body>

</html>
Expand Down
41 changes: 40 additions & 1 deletion cmd/server/assets/users/show.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
<html lang="en">
<head>
{{template "head" .}}
{{template "firebase" .}}
</head>

<body class="bg-light">
Expand Down Expand Up @@ -38,9 +39,13 @@ <h1>{{$user.Name}}</h1>
</div>

<strong>Admin</strong>
<div>
<div class="mb-3">
{{$user.CanAdminRealm $currentRealm.ID}}
</div>

<button id="password-reset" class="btn btn-primary btn-block disabled">
Send password reset
</button>
</div>
</div>

Expand Down Expand Up @@ -106,6 +111,40 @@ <h1>{{$user.Name}}</h1>
}
</script>
{{end}}

<script type="text/javascript">
$(function() {
$resetPassword = $('#password-reset');

{{if .created}}
sendReset(function() {
flash.alert(`Successfully created user '{{.user.Name}}'.`);
});
{{else}}
$resetPassword.removeClass('disabled');
{{end}}

$resetPassword.on('click', function(event) {
event.preventDefault();
sendReset(function() {
flash.alert(`Password reset email sent.`);
});
});

function sendReset(successFn) {
$resetPassword.addClass('disabled');
let email = {{$user.Email}};
return firebase.auth().sendPasswordResetEmail(email)
.then(function() {
setTimeout($resetPassword.addClass('disabled'), 10000);
successFn();
}).catch(function(error) {
$resetPassword.removeClass('disabled');
flash.error(error.message);
});
}
});
</script>
</body>
</html>
{{end}}
42 changes: 23 additions & 19 deletions pkg/controller/user/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ func (c *Controller) HandleCreate() http.Handler {
// Requested form, stop processing.
if r.Method == http.MethodGet {
var user database.User
c.renderNew(ctx, w, &user, false)
c.renderNew(ctx, w, &user)
return
}

Expand All @@ -61,57 +61,61 @@ func (c *Controller) HandleCreate() http.Handler {
}

flash.Error("Failed to process form: %v", err)
c.renderNew(ctx, w, user, false)
c.renderNew(ctx, w, user)
return
}

// See if the user already exists by email - they may be a member of another
// realm.
user, err := c.db.FindUserByEmail(form.Email)
alreadyExists := true
if err != nil {
if !database.IsNotFound(err) {
controller.InternalError(w, r, c.h, err)
return
}

user = new(database.User)
alreadyExists = false
}

// Build the user struct - keeping email and name if user already exists in another realm.
if !alreadyExists {
user.Email = form.Email
user.Name = form.Name
}
user.Realms = append(user.Realms, realm)

// Create firebase user first, if this fails we don't want a db.User entry
created, err := user.CreateFirebaseUser(ctx, c.client)
if err != nil {
flash.Alert("Failed to create user: %v", err)
c.renderNew(ctx, w, user)
return
}

// Build the user struct - keeping email and name if user already exists in another realm.
user.Realms = append(user.Realms, realm)
if form.Admin {
user.AdminRealms = append(user.AdminRealms, realm)
}

if err := c.db.SaveUser(user); err != nil {
flash.Error("Failed to create user: %v", err)
c.renderNew(ctx, w, user, false)
c.renderNew(ctx, w, user)
return
}

created, err := user.CreateFirebaseUser(ctx, c.client)
if created {
m := controller.TemplateMapFromContext(ctx)
m["created"] = true
}

stats, err := c.getStats(ctx, user, realm)
if err != nil {
flash.Alert("Failed to create user: %v", err)
c.renderNew(ctx, w, user, false)
controller.InternalError(w, r, c.h, err)
return
}

c.renderNew(ctx, w, user, created)
c.renderShow(ctx, w, user, stats)
})
}

func (c *Controller) renderNew(ctx context.Context, w http.ResponseWriter, user *database.User, createdNewUser bool) {
func (c *Controller) renderNew(ctx context.Context, w http.ResponseWriter, user *database.User) {
m := controller.TemplateMapFromContext(ctx)
m["user"] = user
if createdNewUser {
m["firebase"] = c.config.Firebase
}
m["created"] = createdNewUser
c.h.RenderHTML(w, "users/new", m)
}
17 changes: 6 additions & 11 deletions pkg/controller/user/importbatch.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ func (c *Controller) HandleImportBatch() http.Handler {
// See if the user already exists by email - they may be a member of another
// realm.
user, err := c.db.FindUserByEmail(batchUser.Email)
alreadyExists := true
if err != nil {
if !database.IsNotFound(err) {
logger.Errorw("Error finding user", "error", err)
Expand All @@ -57,20 +56,10 @@ func (c *Controller) HandleImportBatch() http.Handler {
}

user = new(database.User)
alreadyExists = false
}

// Build the user struct - keeping email and name if user already exists in another realm.
if !alreadyExists {
user.Email = batchUser.Email
user.Name = batchUser.Name
}
user.Realms = append(user.Realms, realm)
if err := c.db.SaveUser(user); err != nil {
logger.Errorw("Error saving user", "error", err)
batchErr = multierror.Append(batchErr, err)
continue
}

if created, err := user.CreateFirebaseUser(ctx, c.client); err != nil {
logger.Errorw("Error creating firebase user", "error", err)
Expand All @@ -79,6 +68,12 @@ func (c *Controller) HandleImportBatch() http.Handler {
} else if created {
newUsers = append(newUsers, &batchUser)
}

if err := c.db.SaveUser(user); err != nil {
logger.Errorw("Error saving user", "error", err)
batchErr = multierror.Append(batchErr, err)
continue
}
}

response := &api.UserBatchResponse{
Expand Down
25 changes: 17 additions & 8 deletions pkg/controller/user/show.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,8 @@ func (c *Controller) HandleShow() http.Handler {
return
}

// Get and cache the stats for this user.
var stats []*database.UserStats
cacheKey := fmt.Sprintf("stats:user:%d:%d", realm.ID, user.ID)
if err := c.cacher.Fetch(ctx, cacheKey, &stats, 5*time.Minute, func() (interface{}, error) {
now := time.Now().UTC()
past := now.Add(-14 * 24 * time.Hour)
return user.Stats(c.db, realm.ID, past, now)
}); err != nil {
stats, err := c.getStats(ctx, user, realm)
if err != nil {
controller.InternalError(w, r, c.h, err)
return
}
Expand All @@ -70,9 +64,24 @@ func (c *Controller) HandleShow() http.Handler {
})
}

// Get and cache the stats for this user.
func (c *Controller) getStats(ctx context.Context, user *database.User, realm *database.Realm) ([]*database.UserStats, error) {
var stats []*database.UserStats
cacheKey := fmt.Sprintf("stats:user:%d:%d", realm.ID, user.ID)
if err := c.cacher.Fetch(ctx, cacheKey, &stats, 5*time.Minute, func() (interface{}, error) {
now := time.Now().UTC()
past := now.Add(-14 * 24 * time.Hour)
return user.Stats(c.db, realm.ID, past, now)
}); err != nil {
return nil, err
}
return stats, nil
}

func (c *Controller) renderShow(ctx context.Context, w http.ResponseWriter, user *database.User, stats []*database.UserStats) {
m := controller.TemplateMapFromContext(ctx)
m["user"] = user
m["stats"] = stats
m["firebase"] = c.config.Firebase
c.h.RenderHTML(w, "users/show", m)
}
2 changes: 1 addition & 1 deletion pkg/controller/user/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ func (c *Controller) HandleUpdate() http.Handler {

if err := c.db.SaveUser(user); err != nil {
flash.Error("Failed to update user: %v", err)
c.renderNew(ctx, w, user, false)
c.renderNew(ctx, w, user)
return
}

Expand Down

0 comments on commit 7f89d44

Please sign in to comment.