@qelos/auth
Version:
Express Passport authentication service
118 lines (117 loc) • 4.72 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.respondToInvite = exports.getInvites = void 0;
const logger_1 = __importDefault(require("../services/logger"));
const workspace_1 = __importDefault(require("../models/workspace"));
const api_kit_1 = require("@qelos/api-kit");
function getInvites(req, res) {
return __awaiter(this, void 0, void 0, function* () {
const { username } = req.userPayload;
const { tenant } = req.headers;
const query = {
tenant,
};
let email = req.userPayload.email;
let phone;
if (!req.userPayload.email) {
if (req.authConfig.treatUsernameAs === 'email') {
email = username;
}
else if (req.authConfig.treatUsernameAs === 'phone') {
phone = username;
}
}
if (email) {
query['invites.email'] = email;
}
else if (phone) {
query['invites.phone'] = phone;
}
else {
return res.status(500).json({ message: 'missing email or phone' });
}
try {
const invites = yield workspace_1.default.find(query)
.select('_id name logo')
.lean()
.exec();
res.send(invites);
}
catch (error) {
logger_1.default.log('failed to get invites', error);
res.status(500).json({ message: 'failed to retrieve invites list' }).end();
}
});
}
exports.getInvites = getInvites;
function respondToInvite(req, res) {
return __awaiter(this, void 0, void 0, function* () {
const { workspace: workspaceId, kind = 'decline' } = req.body;
const { email } = req.userPayload;
const { tenant } = req.headers;
if (!workspaceId) {
return res.status(400).json({ message: 'missing workspaceId' });
}
if (!['accept', 'decline'].includes(kind)) {
return res
.status(400)
.json({ message: 'respond kind should be either "accept" or "decline"' });
}
try {
const workspace = yield workspace_1.default.findOne({
tenant,
_id: workspaceId,
'invites.email': email,
});
if (!workspace) {
return res
.status(404)
.json({ message: 'workspace not found', email, workspaceId, from: 'invite-respond' });
}
const filteredInvites = workspace.invites.filter((invite) => invite.email != email);
workspace.invites = filteredInvites;
if (kind === 'accept') {
const member = {
user: req.userPayload.sub,
created: new Date(),
roles: ['member', 'user'],
};
workspace.members.push(member);
}
yield workspace.save();
(0, api_kit_1.emitPlatformEvent)({
tenant: tenant,
source: 'auth',
kind: 'invites',
eventName: 'invite responded',
description: 'invitation was responded by the user',
metadata: {
workspace: { _id: workspaceId, name: workspace.name },
respond: {
userId: req.userPayload.sub,
kind,
},
},
created: new Date(),
});
}
catch (error) {
logger_1.default.log('failed to respond to invite', error);
res.status(500).json({ message: 'failed to respond to invite' }).end();
}
res.status(200).json({ success: true });
});
}
exports.respondToInvite = respondToInvite;