import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; const userSchema = schema({ username: { type: String, optional: true, }, emails: { type: Array, optional: true, }, "emails.$": { type: Object, }, "emails.$.address": { type: String, regEx: SimpleSchema.RegEx.Email, }, "emails.$.verified": { type: Boolean, }, registered_emails: { type: Array, optional: true, }, "registered_emails.$": { type: Object, blackbox: true, }, createdAt: { type: Date }, services: { type: Object, optional: true, blackbox: true, }, roles: { type: Array, optional: true, }, "roles.$": { type: String }, // In order to avoid an 'Exception in setInterval callback' from Meteor heartbeat: { type: Date, optional: true, }, apiKey: { type: String, index: 1, optional: true, }, darkMode: { type: Boolean, optional: true, }, }); Meteor.users.attachSchema(userSchema); Meteor.users.generateApiKey = new ValidatedMethod({ name: "Users.methods.generateApiKey", validate: null, run(){ if(Meteor.isClient) return; var user = Meteor.users.findOne(this.userId); if (!user) return; if (user && user.apiKey) return; var apiKey = Random.id(30); Meteor.users.update(this.userId, {$set: {apiKey}}); }, }); Meteor.users.setDarkMode = new ValidatedMethod({ name: "Users.methods.setDarkMode", validate: new SimpleSchema({ darkMode: { type: Boolean }, }).validator(), run({darkMode}){ if (!this.userId) return; Meteor.users.update(this.userId, {$set: {darkMode}}); }, }); Meteor.users.sendVerificationEmail = new ValidatedMethod({ name: "Users.methods.sendVerificationEmail", validate: schema({ userId:{ type: String, optional: true, }, address: { type: String, }, }).validator(), run(userId, address){ userId = this.userId || userId; let user = Meteor.users.findOne(); if (!user) { throw new Meteor.Error("User not found", "Can't send a validation email to a user that does not exist"); } if (!_.some(user.emails, email => email.address === address)) { throw new Meteor.Error("Email address not found", "The specified email address wasn't found on this user account"); } Accounts.sendVerificationEmail(this.userId, address); } });