blob: 0e41a8931404b2471b920237a90ee5553dd1b4f5 [file] [log] [blame]
import { Router } from 'express';
class JamiRestApi {
constructor(jami) {
this.jami = jami;
}
getRouter() {
const router = Router({ mergeParams: true });
//router.use(express.json())
// Accounts
router.get('/accounts', async (req, res) => {
console.log('Get account list');
let accounts = this.jami.getAccountList();
if (req.user.accountFilter) accounts = accounts.filter((account) => req.user.accountFilter(account.getId()));
res.json(await Promise.all(accounts.map(async (account) => await account.getSummary())));
});
const checkCanCreateAccounts = (req, res, next) => {
console.log(`checkCanCreateAccounts ${req.params.accountId} for ${req.user.id}`);
if (req.user && !req.user.accountFilter) {
return next();
}
res.status(403).end();
};
router.post('/accounts', checkCanCreateAccounts, async (req, res) => {
console.log('Create new account');
console.log(req.body);
try {
const accountId = await this.jami.addAccount(req.body);
if (req.body.registerName) {
this.jami
.registerName(accountId, '', req.body.registerName)
.then((result) => console.log('Name registrtion result: ' + result));
}
res.json({ accountId });
} catch (e) {
res.status(400).json({ error: e });
}
});
const checkAccount = (req, res, next) => {
console.log(`checkAccount ${req.params.accountId} for ${req.user.id}`);
if (req.user && (!req.user.accountFilter || req.user.accountFilter(req.params.accountId))) {
return next();
}
res.status(403).end();
};
const accountRouter = Router({ mergeParams: true });
router.use('/accounts/:accountId', checkAccount, accountRouter);
accountRouter.get('/', async (req, res) => {
console.log(`Get account ${req.params.accountId}`);
const account = this.jami.getAccount(req.params.accountId);
if (account) {
account.defaultModerators = this.jami.getDefaultModerators(account.getId());
const obj = await account.getObject();
obj.devices = this.jami.getDevices(req.params.accountId);
res.json(obj);
} else res.status(404).end();
});
accountRouter.post('/', async (req, res) => {
console.log(`Set account details ${req.params.accountId}`);
const account = this.jami.getAccount(req.params.accountId);
if (account) {
const newDetails = account.updateDetails(req.body);
this.jami.setAccountDetails(account.getId(), newDetails);
res.status(200).end();
} else res.status(404).end();
});
// Contacts
accountRouter.get('/contacts', (req, res) => {
console.log(`Get account ${req.params.accountId}`);
const account = this.jami.getAccount(req.params.accountId);
if (account) {
let rep = account.getContacts();
res.json(rep);
} else res.status(404).end();
});
accountRouter.get('/contacts/:contactId', (req, res) => {
console.log(`Get account details fot ${req.params.accountId}`);
const account = this.jami.getAccount(req.params.accountId);
const uri = req.params.uri;
if (account) {
let rep = account.getContactDetails(uri);
res.json(rep);
} else res.status(404).end();
});
accountRouter.get('/contacts/details/:contactId', (req, res) => {
console.log(`Get contact ${req.params.contactId} details for ${req.params.accountId}`);
const account = this.jami.getAccount(req.params.accountId);
if (account) {
let rep = this.jami.getContactDetails(req.params.accountId, req.params.contactId);
console.log(rep);
res.json(rep);
} else res.status(404).end();
});
accountRouter.delete('/contacts/remove/:contactId', async (req, res) => {
console.log('REMOVED CONTACT: ', req.params.contactId);
const account = this.jami.getAccount(req.params.accountId);
if (account) {
let rep = this.jami.removeContact(req.params.accountId, req.params.contactId);
res.json(rep);
} else res.status(404).end();
res.status(200).end();
});
accountRouter.delete('/contacts/block/:contactId/', async (req, res) => {
console.log('REMOVED AND BLOCKED CONTACT: ', req.params.contactId);
const account = this.jami.getAccount(req.params.accountId);
if (account) {
let rep = this.jami.blockContact(req.params.accountId, req.params.contactId);
res.json(rep);
} else res.status(404).end();
res.status(200).end();
});
// Default modertors
accountRouter.put('/defaultModerators/:contactId', async (req, res) => {
console.log(`Adding default moderator ${req.params.contactId} to account ${req.params.accountId}`);
this.jami.addDefaultModerator(req.params.accountId, req.params.contactId);
res.status(200).end();
});
accountRouter.delete('/defaultModerators/:contactId', async (req, res) => {
console.log(`Removing default moderator to account ${req.params.accountId}`);
this.jami.removeDefaultModerator(req.params.accountId, req.params.contactId);
res.status(200).end();
});
// Conversations
accountRouter.get('/conversations', async (req, res, next) => {
console.log(`Get conversations for account ${req.params.accountId}`);
const account = this.jami.getAccount(req.params.accountId);
if (!account) return res.sendStatus(404);
const conversations = account.getConversations();
res.json(
await Promise.all(
Object.keys(conversations).map(
async (conversationId) =>
await conversations[conversationId].getObject({
memberFilter: (member) => member.contact.getUri() !== account.getUri(),
})
)
)
);
//res.json(account.getConversations())
});
accountRouter.post('/conversations', (req, res) => {
console.log(`Create conversations for account, contact ${req.params.accountId}`);
// console.log(req.body)
const account = this.jami.getAccount(req.params.accountId);
if (!account) return res.sendStatus(404);
if (req.body.members.length === 1) {
const details = this.jami.addContact(req.params.accountId, req.body.members[0]);
res.json(details);
} else res.status(400).end();
});
accountRouter.post('/conversations/:conversationId', async (req, res) => {
console.log(`Sending message to ${req.params.conversationId} for account ${req.params.accountId}`);
this.jami.sendMessage(req.params.accountId, req.params.conversationId, req.body.message);
res.status(200).end();
});
accountRouter.get('/conversations/:conversationId', async (req, res) => {
console.log(`Get conversation ${req.params.conversationId} for account ${req.params.accountId}`);
const account = this.jami.getAccount(req.params.accountId);
if (!account) return res.sendStatus(404);
const conversation = account.getConversation(req.params.conversationId);
if (!conversation) res.status(404).end();
else {
res.json(
await conversation.getObject({
memberFilter: (member) => member.contact.getUri() !== account.getUri(),
})
);
}
});
accountRouter.get('/conversations/:conversationId/messages', async (req, res) => {
console.log(`Get messages for conversation ${req.params.conversationId} for account ${req.params.accountId}`);
try {
const messages = await this.jami.loadMessages(req.params.accountId, req.params.conversationId);
res.json(messages).end();
} catch (e) {
res.status(400).json({ error: e.message });
}
});
// Calls
accountRouter.get('/calls', async (req, res) => {
console.log(`Get calls for account ${req.params.accountId}`);
try {
const calls = await this.jami.getCalls(req.params.accountId);
res.json(calls).end();
} catch (e) {
res.status(400).json({ error: e.message });
}
});
accountRouter.get('/calls/:callId', async (req, res) => {
console.log(`Get call ${req.params.callId} for account ${req.params.accountId}`);
try {
const messages = await this.jami.getCall(req.params.accountId, req.params.callId);
res.json(messages).end();
} catch (e) {
res.status(400).json({ error: e.message });
}
});
// Nameserver
const nsRouter = Router({ mergeParams: true });
accountRouter.use('/ns', nsRouter); // use account nameserver
router.use('/ns', nsRouter); // use default nameserver
nsRouter.get(['/name/:nameQuery'], (req, res, next) => {
console.log(`Name lookup ${req.params.nameQuery}`);
this.jami
.lookupName(req.params.accountId || '', req.params.nameQuery)
.then((result) => {
if (result.state == 0) res.json(result);
else if (result.state == 1) res.status(400).json({});
else res.status(404).json({});
})
.catch((e) => {
res.status(404).json({});
});
});
nsRouter.get(['/addr/:addrQuery'], (req, res, next) => {
console.log(`Address lookup ${req.params.addrQuery}`);
this.jami
.lookupAddress(req.params.accountId || '', req.params.addrQuery)
.then((result) => {
if (result.state == 0) res.json(result);
else if (result.state == 1) res.status(400).json({});
else res.status(404).json({});
})
.catch((e) => {
res.status(404).json({});
});
});
return router;
}
}
export default JamiRestApi;