fix(invites): bogus validation errors

This commit is contained in:
Sabe Jones
2018-11-07 15:58:17 -06:00
parent 1ac4dd8171
commit b1dd79f75c
5 changed files with 9 additions and 164 deletions

View File

@@ -1,152 +0,0 @@
<template lang="pug">
b-modal#invite-modal(:title="$t('inviteFriends')", size='lg')
.modal-body
p.alert.alert-info(v-html="$t('inviteAlertInfo')")
.form-horizontal
table.table.table-striped
thead
tr
th {{ $t('userId') }}
tbody
tr(v-for='user in invitees')
td
input.form-control(type='text', v-model='user.uuid')
tr
td
button.btn.btn-primary.pull-right(@click='addUuid()')
i.glyphicon.glyphicon-plus
| +
tr
td
.col-6.col-offset-6
button.btn.btn-primary.btn-block(@click='inviteNewUsers("uuid")') {{sendInviteText}}
hr
p.alert.alert-info {{ $t('inviteByEmail') }}
.form-horizontal
table.table.table-striped
thead
tr
th {{ $t('name') }}
th {{ $t('email') }}
tbody
tr(v-for='email in emails')
td
input.form-control(type='text', v-model='email.name')
td
input.form-control(type='email', v-model='email.email')
tr
td(colspan=2)
button.btn.btn-primary.pull-right(@click='addEmail()')
i.glyphicon.glyphicon-plus
| +
tr
td.form-group(colspan=2)
label.col-sm-1.control-label {{ $t('byColon') }}
.col-sm-5
input.form-control(type='text', v-model='inviter')
.col-sm-6
button.btn.btn-primary.btn-block(@click='inviteNewUsers("email")') {{sendInviteText}}
</template>
<script>
import { mapState } from 'client/libs/store';
import filter from 'lodash/filter';
import map from 'lodash/map';
import notifications from 'client/mixins/notifications';
export default {
mixins: [notifications],
props: ['group'],
data () {
return {
invitees: [],
emails: [],
};
},
computed: {
...mapState({user: 'user.data'}),
inviter () {
return this.user.profile.name;
},
sendInviteText () {
return 'Send Invites';
// if (!this.group) return 'Send Invites';
// return this.group.sendInviteText;
},
},
methods: {
addUuid () {
this.invitees.push({uuid: ''});
},
addEmail () {
this.emails.push({name: '', email: ''});
},
inviteNewUsers (inviteMethod) {
if (!this.group._id) {
if (!this.group.name) this.group.name = this.$t('possessiveParty', {name: this.user.profile.name});
// @TODO: Add dispatch
// return Groups.Group.create(this.group)
// .then(function(response) {
// this.group = response.data.data;
// _inviteByMethod(inviteMethod);
// });
}
this.inviteByMethod(inviteMethod);
},
async inviteByMethod (inviteMethod) {
let invitationDetails;
if (inviteMethod === 'email') {
let emails = this.getEmails();
invitationDetails = { inviter: this.inviter, emails };
} else if (inviteMethod === 'uuid') {
let uuids = this.getOnlyUuids();
invitationDetails = { uuids };
} else {
return alert('Invalid invite method.');
}
await this.$store.dispatch('guilds:invite', {
invitationDetails,
groupId: this.group._id,
});
let invitesSent = invitationDetails.emails || invitationDetails.uuids;
let invitationString = invitesSent.length > 1 ? 'invitationsSent' : 'invitationSent';
this.text(this.$t(invitationString));
this.invitees = [];
this.emails = [];
// @TODO: This function didn't make it over this.resetInvitees();
// @TODO: Sync group invites?
// if (this.group.type === 'party') {
// this.$router.push('//party');
// } else {
// this.$router.push(`/groups/guilds/${this.group._id}`);
// }
this.$root.$emit('bv::hide::modal', 'invite-modal');
// @TODO: error?
// _resetInvitees();
},
getOnlyUuids () {
let uuids = map(this.invitees, 'uuid');
let filteredUuids = filter(uuids, (id) => {
return id !== '';
});
return filteredUuids;
},
getEmails () {
let emails = filter(this.emails, (obj) => {
return obj.email !== '';
});
return emails;
},
},
};
</script>

View File

@@ -164,6 +164,7 @@ export async function invite (store, payload) {
let response = await axios.post(`/api/v4/groups/${payload.groupId}/invite`, { let response = await axios.post(`/api/v4/groups/${payload.groupId}/invite`, {
uuids: payload.invitationDetails.uuids, uuids: payload.invitationDetails.uuids,
emails: payload.invitationDetails.emails, emails: payload.invitationDetails.emails,
usernames: payload.invitationDetails.usernames,
}); });
// @TODO: find guild and add invites // @TODO: find guild and add invites

View File

@@ -229,7 +229,7 @@
"memberCannotRemoveYourself": "You cannot remove yourself!", "memberCannotRemoveYourself": "You cannot remove yourself!",
"groupMemberNotFound": "User not found among group's members", "groupMemberNotFound": "User not found among group's members",
"mustBeGroupMember": "Must be member of the group.", "mustBeGroupMember": "Must be member of the group.",
"canOnlyInviteEmailUuid": "Can only invite using uuids or emails.", "canOnlyInviteEmailUuid": "Can only invite using user IDs, emails, or usernames.",
"inviteMissingEmail": "Missing email address in invite.", "inviteMissingEmail": "Missing email address in invite.",
"inviteMissingUuid": "Missing user id in invite", "inviteMissingUuid": "Missing user id in invite",
"inviteMustNotBeEmpty": "Invite must not be empty.", "inviteMustNotBeEmpty": "Invite must not be empty.",
@@ -245,6 +245,7 @@
"userHasNoLocalRegistration": "User does not have a local registration (username, email, password).", "userHasNoLocalRegistration": "User does not have a local registration (username, email, password).",
"uuidsMustBeAnArray": "User ID invites must be an array.", "uuidsMustBeAnArray": "User ID invites must be an array.",
"emailsMustBeAnArray": "Email address invites must be an array.", "emailsMustBeAnArray": "Email address invites must be an array.",
"usernamesMustBeAnArray": "Username invites must be an array.",
"canOnlyInviteMaxInvites": "You can only invite \"<%= maxInvites %>\" at a time", "canOnlyInviteMaxInvites": "You can only invite \"<%= maxInvites %>\" at a time",
"partyExceedsMembersLimit": "Party size is limited to <%= maxMembersParty %> members", "partyExceedsMembersLimit": "Party size is limited to <%= maxMembersParty %> members",
"onlyCreatorOrAdminCanDeleteChat": "Not authorized to delete this message!", "onlyCreatorOrAdminCanDeleteChat": "Not authorized to delete this message!",

View File

@@ -16,7 +16,7 @@ module.exports = function errorHandler (err, req, res, next) { // eslint-disable
// Otherwise try to identify the type of error (mongoose validation, mongodb unique, ...) // Otherwise try to identify the type of error (mongoose validation, mongodb unique, ...)
// If we can't identify it, respond with a generic 500 error // If we can't identify it, respond with a generic 500 error
let responseErr = err instanceof CustomError ? err : null; let responseErr = err instanceof CustomError ? err : null;
console.log(err)
// Handle errors created with 'http-errors' or similar that have a status/statusCode property // Handle errors created with 'http-errors' or similar that have a status/statusCode property
if (err.statusCode && typeof err.statusCode === 'number') { if (err.statusCode && typeof err.statusCode === 'number') {
responseErr = new CustomError(); responseErr = new CustomError();

View File

@@ -350,7 +350,7 @@ schema.statics.toJSONCleanChat = async function groupToJSONCleanChat (group, use
return toJSON; return toJSON;
}; };
function getIniviteError (uuids, emails, usernames) { function getInviteError (uuids, emails, usernames) {
const uuidsIsArray = Array.isArray(uuids); const uuidsIsArray = Array.isArray(uuids);
const emailsIsArray = Array.isArray(emails); const emailsIsArray = Array.isArray(emails);
const usernamesIsArray = Array.isArray(usernames); const usernamesIsArray = Array.isArray(usernames);
@@ -366,16 +366,12 @@ function getIniviteError (uuids, emails, usernames) {
errorString = 'uuidsMustBeAnArray'; errorString = 'uuidsMustBeAnArray';
} else if (emails && !emailsIsArray) { } else if (emails && !emailsIsArray) {
errorString = 'emailsMustBeAnArray'; errorString = 'emailsMustBeAnArray';
} else if (!emails && emptyUuids) { } else if (usernames && !usernamesIsArray) {
errorString = 'inviteMissingUuid'; errorString = 'usernamesMustBeAnArray';
} else if (!uuids && emptyEmails) { } else if (emptyEmails && emptyUuids && emptyUsernames) {
errorString = 'inviteMissingEmail';
} else if (emptyEmails && emptyUuids) {
errorString = 'inviteMustNotBeEmpty'; errorString = 'inviteMustNotBeEmpty';
} }
if (usernames && emptyUsernames) errorString = 'usernamesMustNotBeEmpty';
return errorString; return errorString;
} }
@@ -407,8 +403,7 @@ schema.statics.validateInvitations = async function getInvitationError (invites,
emails, emails,
usernames, usernames,
} = invites; } = invites;
const errorString = getInviteError(uuids, emails, usernames);
const errorString = getIniviteError(uuids, emails, usernames);
if (errorString) throw new BadRequest(res.t(errorString)); if (errorString) throw new BadRequest(res.t(errorString));
const totalInvites = getInviteCount(uuids, emails); const totalInvites = getInviteCount(uuids, emails);