blob: 1ba568fb09d6f26fac88b108cbd8f2139b819232 [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
Adrien Béraud4e287b92021-04-24 16:15:56 -040013 router.get(['/accounts'], async (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()))
Adrien Béraud4e287b92021-04-24 16:15:56 -040018 res.json(await Promise.all(accounts.map(async account => await 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
Adrien Béraud4e287b92021-04-24 16:15:56 -040032 accountRouter.get(['/'], async (req, res) => {
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éraud4e287b92021-04-24 16:15:56 -040035 if (account) {
36 account.defaultModerators = this.jami.getDefaultModerators(account.getId())
37 const obj = await account.getObject()
38 console.log(obj)
39 res.json(obj)
40 } else
Adrien Béraude74741b2021-04-19 13:22:54 -040041 res.status(404).end()
Adrien Béraud0cb76c92021-04-07 19:59:08 -040042 })
43
44 // Contacts
Adrien Béraud4e287b92021-04-24 16:15:56 -040045 accountRouter.get(['/contacts'], (req, res) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -040046 console.log(`Get account ${req.params.accountId}`)
47 const account = this.jami.getAccount(req.params.accountId)
48 if (account)
49 res.json(account.getContacts())
50 else
Adrien Béraude74741b2021-04-19 13:22:54 -040051 res.status(404).end()
Adrien Béraud0cb76c92021-04-07 19:59:08 -040052 })
Adrien Béraud6ecaa402021-04-06 17:37:25 -040053
Adrien Béraud4e287b92021-04-24 16:15:56 -040054 // Default modertors
55 accountRouter.put('/defaultModerators/:contactId', async (req, res) => {
56 console.log(`Adding default moderator ${req.params.contactId} to account ${req.params.accountId}`)
57 this.jami.addDefaultModerator(req.params.accountId, req.params.contactId)
58 res.status(200).end()
59 })
60 accountRouter.delete('/defaultModerators/:contactId', async (req, res) => {
61 console.log(`Removing default moderator to account ${req.params.accountId}`)
62 this.jami.removeDefaultModerator(req.params.accountId, req.params.contactId)
63 res.status(200).end()
64 })
65
Adrien Béraud6ecaa402021-04-06 17:37:25 -040066 // Conversations
Adrien Béraud150b4782021-04-21 19:40:59 -040067 accountRouter.get('/conversations', async (req, res, next) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -040068 console.log(`Get conversations for account ${req.params.accountId}`)
69 const account = this.jami.getAccount(req.params.accountId)
70 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -040071 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040072 const conversations = account.getConversations()
Adrien Béraud150b4782021-04-21 19:40:59 -040073 res.json(await Promise.all(Object.keys(conversations).map(async conversationId => await conversations[conversationId].getObject({
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040074 memberFilter: member => member.contact.getUri() !== account.getUri()
Adrien Béraud150b4782021-04-21 19:40:59 -040075 }))))
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040076 //res.json(account.getConversations())
Adrien Béraud6ecaa402021-04-06 17:37:25 -040077 })
78
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040079 accountRouter.post('/conversations', (req, res) => {
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040080 console.log(`Create conversations for account, contact ${req.params.accountId}`)
81 console.log(req.body)
82 const account = this.jami.getAccount(req.params.accountId)
83 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -040084 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040085 if (req.body.members.length === 1) {
86 const details = this.jami.addContact(req.params.accountId, req.body.members[0])
87 res.json(details)
88 } else
Adrien Béraude74741b2021-04-19 13:22:54 -040089 res.status(400).end()
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040090 })
91
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040092 accountRouter.post('/conversations/:conversationId', async (req, res) => {
93 console.log(`Sending message to ${req.params.conversationId} for account ${req.params.accountId}`)
94 this.jami.sendMessage(req.params.accountId, req.params.conversationId, req.body.message)
95 res.status(200).end()
96 })
97
98 accountRouter.get('/conversations/:conversationId', async (req, res) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -040099 console.log(`Get conversation ${req.params.conversationId} for account ${req.params.accountId}`)
100 const account = this.jami.getAccount(req.params.accountId)
101 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -0400102 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400103 const conversation = account.getConversation(req.params.conversationId)
104 if (!conversation)
Adrien Béraude74741b2021-04-19 13:22:54 -0400105 res.status(404).end()
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400106 else {
Adrien Béraud150b4782021-04-21 19:40:59 -0400107 res.json(await conversation.getObject({
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400108 memberFilter: member => member.contact.getUri() !== account.getUri()
109 }))
110 }
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400111 })
112
Adrien Béraud4e287b92021-04-24 16:15:56 -0400113 accountRouter.get('/conversations/:conversationId/messages', async (req, res) => {
114 console.log(`Get messages for conversation ${req.params.conversationId} for account ${req.params.accountId}`)
115 try {
116 const messages = await this.jami.loadMessages(req.params.accountId, req.params.conversationId)
117 res.json(messages).end()
118 } catch (e) {
119 res.status(400).json({ error: e.message })
120 }
121 })
122
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400123 // Nameserver
Adrien Béraude74741b2021-04-19 13:22:54 -0400124 const nsRouter = Router({mergeParams: true})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400125 accountRouter.use('/ns', nsRouter)
126
127 nsRouter.get(['/name/:nameQuery'], (req, res, next) => {
128 console.log(`Name lookup ${req.params.nameQuery}`)
129 this.jami.lookupName(req.params.accountId, req.params.nameQuery)
130 .then(result => {
131 if (result.state == 0)
132 res.json(result)
133 else if (result.state == 1)
134 res.sendStatus(400)
135 else
136 res.sendStatus(404)
137 }).catch(e => {
138 res.sendStatus(404)
139 })
140 })
141 nsRouter.get(['/addr/:addrQuery'], (req, res, next) => {
142 console.log(`Address lookup ${req.params.addrQuery}`)
143 this.jami.lookupAddress(req.params.accountId, req.params.addrQuery)
144 .then(result => {
145 if (result.state == 0)
146 res.json(result)
147 else if (result.state == 1)
148 res.sendStatus(400)
149 else
150 res.sendStatus(404)
151 }).catch(e => {
152 res.sendStatus(404)
153 })
154 })
155
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400156 return router
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400157 }
158}
159
Adrien Béraude74741b2021-04-19 13:22:54 -0400160export default JamiRestApi