blob: 7ed056ee37f2b46512ea32aed95c8d0f7b1b4e07 [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(`BBBBBBB 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) {
console.log(req.body);
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(`AAAAAAAA Get account ${req.params.accountId}`);
const account = this.jami.getAccount(req.params.accountId);
if (account) {
let rep = account.getContacts();
console.log(rep);
res.json(rep);
} else res.status(404).end();
});
accountRouter.get("/contacts/:contactId", (req, res) => {
console.log("CCCCCCC JAMI.JS: ", req.params);
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();
});
// 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 ${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