diff --git a/emails/templates/invited_to_org.html b/emails/templates/invited_to_org.html new file mode 100644 index 00000000000..5aac6e28de3 --- /dev/null +++ b/emails/templates/invited_to_org.html @@ -0,0 +1,38 @@ + + +[[Subject .Subject "[[.InvitedBy]] has added you to the Grafana organization [[.OrgName]]"]] + +
+
+
|
+
+
|
+
-
-
{{> body }}
-
diff --git a/pkg/api/org_invite.go b/pkg/api/org_invite.go
index 41215259769..d69eaabe584 100644
--- a/pkg/api/org_invite.go
+++ b/pkg/api/org_invite.go
@@ -39,16 +39,7 @@ func AddOrgInvite(c *middleware.Context, inviteDto dtos.AddInviteForm) Response
return ApiError(500, "Failed to query db for existing user check", err)
}
} else {
- // user exists, add org role
- createOrgUserCmd := m.AddOrgUserCommand{OrgId: c.OrgId, UserId: userQuery.Result.Id, Role: inviteDto.Role}
- if err := bus.Dispatch(&createOrgUserCmd); err != nil {
- if err == m.ErrOrgUserAlreadyAdded {
- return ApiError(412, fmt.Sprintf("User %s is already added to organization", inviteDto.LoginOrEmail), err)
- }
- return ApiError(500, "Error while trying to create org user", err)
- } else {
- return ApiSuccess(fmt.Sprintf("Existing Grafana user %s added to org %s", userQuery.Result.NameOrFallback(), c.OrgName))
- }
+ return inviteExistingUserToOrg(c, userQuery.Result, &inviteDto)
}
cmd := m.CreateTempUserCommand{}
@@ -71,11 +62,11 @@ func AddOrgInvite(c *middleware.Context, inviteDto dtos.AddInviteForm) Response
To: []string{inviteDto.LoginOrEmail},
Template: "new_user_invite.html",
Data: map[string]interface{}{
- "NameOrEmail": util.StringsFallback2(cmd.Name, cmd.Email),
- "OrgName": c.OrgName,
- "Email": c.Email,
- "LinkUrl": setting.ToAbsUrl("invite/" + cmd.Code),
- "InvitedBy": util.StringsFallback3(c.Name, c.Email, c.Login),
+ "Name": util.StringsFallback2(cmd.Name, cmd.Email),
+ "OrgName": c.OrgName,
+ "Email": c.Email,
+ "LinkUrl": setting.ToAbsUrl("invite/" + cmd.Code),
+ "InvitedBy": util.StringsFallback3(c.Name, c.Email, c.Login),
},
}
@@ -89,6 +80,36 @@ func AddOrgInvite(c *middleware.Context, inviteDto dtos.AddInviteForm) Response
return ApiSuccess(fmt.Sprintf("Created invite for %s", inviteDto.LoginOrEmail))
}
+func inviteExistingUserToOrg(c *middleware.Context, user *m.User, inviteDto *dtos.AddInviteForm) Response {
+ // user exists, add org role
+ createOrgUserCmd := m.AddOrgUserCommand{OrgId: c.OrgId, UserId: user.Id, Role: inviteDto.Role}
+ if err := bus.Dispatch(&createOrgUserCmd); err != nil {
+ if err == m.ErrOrgUserAlreadyAdded {
+ return ApiError(412, fmt.Sprintf("User %s is already added to organization", inviteDto.LoginOrEmail), err)
+ }
+ return ApiError(500, "Error while trying to create org user", err)
+ } else {
+
+ if !inviteDto.SkipEmails && util.IsEmail(user.Email) {
+ emailCmd := m.SendEmailCommand{
+ To: []string{user.Email},
+ Template: "invited_to_org.html",
+ Data: map[string]interface{}{
+ "Name": user.NameOrFallback(),
+ "OrgName": c.OrgName,
+ "InvitedBy": util.StringsFallback3(c.Name, c.Email, c.Login),
+ },
+ }
+
+ if err := bus.Dispatch(&emailCmd); err != nil {
+ return ApiError(500, "Failed to send email invited_to_org", err)
+ }
+ }
+
+ return ApiSuccess(fmt.Sprintf("Existing Grafana user %s added to org %s", user.NameOrFallback(), c.OrgName))
+ }
+}
+
func RevokeInvite(c *middleware.Context) Response {
cmd := m.UpdateTempUserStatusCommand{
Code: c.Params(":code"),
diff --git a/public/emails/invited_to_org.html b/public/emails/invited_to_org.html
new file mode 100644
index 00000000000..fb61438b441
--- /dev/null
+++ b/public/emails/invited_to_org.html
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+
+ |
|