blob: 156e6400d7df2ed6d0aeeff678c5363652115959 [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éraud86986032021-04-25 12:04:53 -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
Adrien Béraud86986032021-04-25 12:04:53 -040044 accountRouter.post('/', async (req, res) => {
45 console.log(`Set account details ${req.params.accountId}`)
46 const account = this.jami.getAccount(req.params.accountId)
47 if (account) {
48 console.log(req.body)
49 const newDetails = account.updateDetails(req.body)
50 this.jami.setAccountDetails(account.getId(), newDetails)
51 res.status(200).end()
52 } else
53 res.status(404).end()
54 })
55
Adrien Béraud0cb76c92021-04-07 19:59:08 -040056 // Contacts
Adrien Béraud86986032021-04-25 12:04:53 -040057 accountRouter.get('/contacts', (req, res) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -040058 console.log(`Get account ${req.params.accountId}`)
59 const account = this.jami.getAccount(req.params.accountId)
60 if (account)
61 res.json(account.getContacts())
62 else
Adrien Béraude74741b2021-04-19 13:22:54 -040063 res.status(404).end()
Adrien Béraud0cb76c92021-04-07 19:59:08 -040064 })
Adrien Béraud6ecaa402021-04-06 17:37:25 -040065
Adrien Béraud4e287b92021-04-24 16:15:56 -040066 // Default modertors
67 accountRouter.put('/defaultModerators/:contactId', async (req, res) => {
68 console.log(`Adding default moderator ${req.params.contactId} to account ${req.params.accountId}`)
69 this.jami.addDefaultModerator(req.params.accountId, req.params.contactId)
70 res.status(200).end()
71 })
72 accountRouter.delete('/defaultModerators/:contactId', async (req, res) => {
73 console.log(`Removing default moderator to account ${req.params.accountId}`)
74 this.jami.removeDefaultModerator(req.params.accountId, req.params.contactId)
75 res.status(200).end()
76 })
77
Adrien Béraud6ecaa402021-04-06 17:37:25 -040078 // Conversations
Adrien Béraud150b4782021-04-21 19:40:59 -040079 accountRouter.get('/conversations', async (req, res, next) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -040080 console.log(`Get conversations for account ${req.params.accountId}`)
81 const account = this.jami.getAccount(req.params.accountId)
82 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -040083 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040084 const conversations = account.getConversations()
Adrien Béraud150b4782021-04-21 19:40:59 -040085 res.json(await Promise.all(Object.keys(conversations).map(async conversationId => await conversations[conversationId].getObject({
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040086 memberFilter: member => member.contact.getUri() !== account.getUri()
Adrien Béraud150b4782021-04-21 19:40:59 -040087 }))))
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040088 //res.json(account.getConversations())
Adrien Béraud6ecaa402021-04-06 17:37:25 -040089 })
90
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040091 accountRouter.post('/conversations', (req, res) => {
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040092 console.log(`Create conversations for account, contact ${req.params.accountId}`)
93 console.log(req.body)
94 const account = this.jami.getAccount(req.params.accountId)
95 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -040096 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040097 if (req.body.members.length === 1) {
98 const details = this.jami.addContact(req.params.accountId, req.body.members[0])
99 res.json(details)
100 } else
Adrien Béraude74741b2021-04-19 13:22:54 -0400101 res.status(400).end()
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400102 })
103
Adrien Béraud5e9e19b2021-04-22 01:38:53 -0400104 accountRouter.post('/conversations/:conversationId', async (req, res) => {
105 console.log(`Sending message to ${req.params.conversationId} for account ${req.params.accountId}`)
106 this.jami.sendMessage(req.params.accountId, req.params.conversationId, req.body.message)
107 res.status(200).end()
108 })
109
110 accountRouter.get('/conversations/:conversationId', async (req, res) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400111 console.log(`Get conversation ${req.params.conversationId} for account ${req.params.accountId}`)
112 const account = this.jami.getAccount(req.params.accountId)
113 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -0400114 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400115 const conversation = account.getConversation(req.params.conversationId)
116 if (!conversation)
Adrien Béraude74741b2021-04-19 13:22:54 -0400117 res.status(404).end()
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400118 else {
Adrien Béraud150b4782021-04-21 19:40:59 -0400119 res.json(await conversation.getObject({
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400120 memberFilter: member => member.contact.getUri() !== account.getUri()
121 }))
122 }
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400123 })
124
Adrien Béraud4e287b92021-04-24 16:15:56 -0400125 accountRouter.get('/conversations/:conversationId/messages', async (req, res) => {
126 console.log(`Get messages for conversation ${req.params.conversationId} for account ${req.params.accountId}`)
127 try {
128 const messages = await this.jami.loadMessages(req.params.accountId, req.params.conversationId)
129 res.json(messages).end()
130 } catch (e) {
131 res.status(400).json({ error: e.message })
132 }
133 })
134
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400135 // Nameserver
Adrien Béraude74741b2021-04-19 13:22:54 -0400136 const nsRouter = Router({mergeParams: true})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400137 accountRouter.use('/ns', nsRouter)
138
139 nsRouter.get(['/name/:nameQuery'], (req, res, next) => {
140 console.log(`Name lookup ${req.params.nameQuery}`)
141 this.jami.lookupName(req.params.accountId, req.params.nameQuery)
142 .then(result => {
143 if (result.state == 0)
144 res.json(result)
145 else if (result.state == 1)
146 res.sendStatus(400)
147 else
148 res.sendStatus(404)
149 }).catch(e => {
150 res.sendStatus(404)
151 })
152 })
153 nsRouter.get(['/addr/:addrQuery'], (req, res, next) => {
154 console.log(`Address lookup ${req.params.addrQuery}`)
155 this.jami.lookupAddress(req.params.accountId, req.params.addrQuery)
156 .then(result => {
157 if (result.state == 0)
158 res.json(result)
159 else if (result.state == 1)
160 res.sendStatus(400)
161 else
162 res.sendStatus(404)
163 }).catch(e => {
164 res.sendStatus(404)
165 })
166 })
167
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400168 return router
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400169 }
170}
171
Adrien Béraude74741b2021-04-19 13:22:54 -0400172export default JamiRestApi