Skip to content

Commit

Permalink
feat: api v3 route to add email to user, optionally bypassing validat…
Browse files Browse the repository at this point in the history
…ion email, closes #11009
  • Loading branch information
julianlam committed Jan 21, 2023
1 parent aa873e8 commit fdc4164
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 0 deletions.
51 changes: 51 additions & 0 deletions public/openapi/write/users/uid/emails.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,57 @@ get:
responses:
'200':
description: user emails successfully listed
content:
application/json:
schema:
type: object
properties:
status:
$ref: ../../../components/schemas/Status.yaml#/Status
response:
type: object
properties:
emails:
type: array
items:
type: string
description: An email address
post:
tags:
- users
summary: add email to user
description: |
This operation adds an email to the user account, optionally bypassing the confirmation step if requested.
**Note**: The confirmation bypass can only be called by super administrators or users with the `admin:users` privilege.
parameters:
- in: path
name: uid
schema:
type: integer
required: true
description: uid of the account to add the email
example: 1
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
email:
type: string
description: A single email address
example: test@example.org
skipConfirmation:
type: boolean
description: If truthy, will automatically confirm the user's email.
example: 1
required:
- email
responses:
'200':
description: email successfully added to user account
content:
application/json:
schema:
Expand Down
18 changes: 18 additions & 0 deletions src/controllers/write/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,24 @@ Users.getInviteGroups = async function (req, res) {
return helpers.formatApiResponse(200, res, userInviteGroups.map(group => group.displayName));
};

Users.addEmail = async (req, res) => {
const canManageUsers = await privileges.admin.can('admin:users', req.uid);
const skipConfirmation = canManageUsers && req.body.skipConfirmation;

if (skipConfirmation) {
await user.setUserField(req.params.uid, 'email', req.body.email);
await user.email.confirmByUid(req.params.uid);
} else {
await api.users.update(req, {
uid: req.params.uid,
email: req.body.email,
});
}

const emails = await db.getSortedSetRangeByScore('email:uid', 0, 500, req.params.uid, req.params.uid);
helpers.formatApiResponse(200, res, { emails });
};

Users.listEmails = async (req, res) => {
const [isPrivileged, { showemail }] = await Promise.all([
user.isPrivileged(req.uid),
Expand Down
1 change: 1 addition & 0 deletions src/routes/write/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ function authenticatedRoutes() {
setupApiRoute(router, 'get', '/:uid/invites/groups', [...middlewares, middleware.assert.user], controllers.write.users.getInviteGroups);

setupApiRoute(router, 'get', '/:uid/emails', [...middlewares, middleware.assert.user], controllers.write.users.listEmails);
setupApiRoute(router, 'post', '/:uid/emails', [...middlewares, middleware.assert.user], controllers.write.users.addEmail);
setupApiRoute(router, 'get', '/:uid/emails/:email', [...middlewares, middleware.assert.user], controllers.write.users.getEmail);
setupApiRoute(router, 'post', '/:uid/emails/:email/confirm', [...middlewares, middleware.assert.user], controllers.write.users.confirmEmail);

Expand Down

0 comments on commit fdc4164

Please sign in to comment.