blob: 5c921803c6e2c8d5f1140ce98d757cf257fc7ae2 [file] [log] [blame]
Adrien Béraude74741b2021-04-19 13:22:54 -04001import { Router } from 'express'
Adrien Béraud6ecaa402021-04-06 17:37:25 -04002
3class JamiRestApi {
4 constructor(jami) {
5 this.jami = jami
6 }
7
8 getRouter() {
Adrien Béraude74741b2021-04-19 13:22:54 -04009 const router = Router({mergeParams: true})
10 //router.use(express.json());
Adrien Béraud6ecaa402021-04-06 17:37:25 -040011
12 // Accounts
13 router.get(['/accounts'], (req, res, next) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -040014 console.log("Get account list")
Adrien Béraude74741b2021-04-19 13:22:54 -040015 let accounts = this.jami.getAccountList()
16 if (req.user.accountFilter)
17 accounts = accounts.filter(account => req.user.accountFilter(account.getId()))
18 res.json(accounts.map(account => account.getSummary()))
Adrien Béraud0cb76c92021-04-07 19:59:08 -040019 })
Adrien Béraud6ecaa402021-04-06 17:37:25 -040020
Adrien Béraude74741b2021-04-19 13:22:54 -040021 const checkAccount = (req, res, next) => {
22 console.log(`checkAccount ${req.params.accountId} for ${req.user.id}`)
23 if (req.user && (!req.user.accountFilter || req.user.accountFilter(req.params.accountId))) {
24 return next();
25 }
26 res.status(403).end()
27 }
28
29 const accountRouter = Router({mergeParams: true})
30 router.use('/accounts/:accountId', checkAccount, accountRouter)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040031
32 accountRouter.get(['/'], (req, res, next) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -040033 console.log(`Get account ${req.params.accountId}`)
34 const account = this.jami.getAccount(req.params.accountId)
Adrien Béraud150b4782021-04-21 19:40:59 -040035 account.defaultModerators = this.jami.getDefaultModerators(account.getId())
Adrien Béraud6ecaa402021-04-06 17:37:25 -040036 if (account)
37 res.json(account.getObject())
38 else
Adrien Béraude74741b2021-04-19 13:22:54 -040039 res.status(404).end()
Adrien Béraud0cb76c92021-04-07 19:59:08 -040040 })
41
42 // Contacts
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040043 accountRouter.get(['/contacts'], (req, res, next) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -040044 console.log(`Get account ${req.params.accountId}`)
45 const account = this.jami.getAccount(req.params.accountId)
46 if (account)
47 res.json(account.getContacts())
48 else
Adrien Béraude74741b2021-04-19 13:22:54 -040049 res.status(404).end()
Adrien Béraud0cb76c92021-04-07 19:59:08 -040050 })
Adrien Béraud6ecaa402021-04-06 17:37:25 -040051
52 // Conversations
Adrien Béraud150b4782021-04-21 19:40:59 -040053 accountRouter.get('/conversations', async (req, res, next) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -040054 console.log(`Get conversations for account ${req.params.accountId}`)
55 const account = this.jami.getAccount(req.params.accountId)
56 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -040057 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040058 const conversations = account.getConversations()
Adrien Béraud150b4782021-04-21 19:40:59 -040059 res.json(await Promise.all(Object.keys(conversations).map(async conversationId => await conversations[conversationId].getObject({
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040060 memberFilter: member => member.contact.getUri() !== account.getUri()
Adrien Béraud150b4782021-04-21 19:40:59 -040061 }))))
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040062 //res.json(account.getConversations())
Adrien Béraud6ecaa402021-04-06 17:37:25 -040063 })
64
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040065 accountRouter.post('/conversations', (req, res) => {
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040066 console.log(`Create conversations for account, contact ${req.params.accountId}`)
67 console.log(req.body)
68 const account = this.jami.getAccount(req.params.accountId)
69 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -040070 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040071 if (req.body.members.length === 1) {
72 const details = this.jami.addContact(req.params.accountId, req.body.members[0])
73 res.json(details)
74 } else
Adrien Béraude74741b2021-04-19 13:22:54 -040075 res.status(400).end()
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040076 })
77
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040078 accountRouter.post('/conversations/:conversationId', async (req, res) => {
79 console.log(`Sending message to ${req.params.conversationId} for account ${req.params.accountId}`)
80 this.jami.sendMessage(req.params.accountId, req.params.conversationId, req.body.message)
81 res.status(200).end()
82 })
83
84 accountRouter.get('/conversations/:conversationId', async (req, res) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -040085 console.log(`Get conversation ${req.params.conversationId} for account ${req.params.accountId}`)
86 const account = this.jami.getAccount(req.params.accountId)
87 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -040088 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040089 const conversation = account.getConversation(req.params.conversationId)
90 if (!conversation)
Adrien Béraude74741b2021-04-19 13:22:54 -040091 res.status(404).end()
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040092 else {
Adrien Béraud150b4782021-04-21 19:40:59 -040093 res.json(await conversation.getObject({
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040094 memberFilter: member => member.contact.getUri() !== account.getUri()
95 }))
96 }
Adrien Béraud6ecaa402021-04-06 17:37:25 -040097 })
98
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040099 // Nameserver
Adrien Béraude74741b2021-04-19 13:22:54 -0400100 const nsRouter = Router({mergeParams: true})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400101 accountRouter.use('/ns', nsRouter)
102
103 nsRouter.get(['/name/:nameQuery'], (req, res, next) => {
104 console.log(`Name lookup ${req.params.nameQuery}`)
105 this.jami.lookupName(req.params.accountId, req.params.nameQuery)
106 .then(result => {
107 if (result.state == 0)
108 res.json(result)
109 else if (result.state == 1)
110 res.sendStatus(400)
111 else
112 res.sendStatus(404)
113 }).catch(e => {
114 res.sendStatus(404)
115 })
116 })
117 nsRouter.get(['/addr/:addrQuery'], (req, res, next) => {
118 console.log(`Address lookup ${req.params.addrQuery}`)
119 this.jami.lookupAddress(req.params.accountId, req.params.addrQuery)
120 .then(result => {
121 if (result.state == 0)
122 res.json(result)
123 else if (result.state == 1)
124 res.sendStatus(400)
125 else
126 res.sendStatus(404)
127 }).catch(e => {
128 res.sendStatus(404)
129 })
130 })
131
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400132 return router
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400133 }
134}
135
Adrien Béraude74741b2021-04-19 13:22:54 -0400136export default JamiRestApi