blob: 49250c4aa3c8ffe9ff815a3038010f8e109d1fd9 [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