blob: d76462ec8c7408dc64fb5896f2270a109e6339dd [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éraud88a52442021-04-26 12:11:41 -040013 router.get('/accounts', async (req, res) => {
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éraud88a52442021-04-26 12:11:41 -040021 const checkCanCreateAccounts = (req, res, next) => {
22 console.log(`checkCanCreateAccounts ${req.params.accountId} for ${req.user.id}`)
23 if (req.user && !req.user.accountFilter) {
24 return next();
25 }
26 res.status(403).end()
27 }
28
29 router.post('/accounts', checkCanCreateAccounts, async (req, res) => {
30 console.log("Create new account")
31 console.log(req.body)
32 try {
33 res.json({ accountId: await this.jami.addAccount(req.body) })
34 } catch (e) {
35 res.status(400).json({ error: e })
36 }
37 })
38
Adrien Béraude74741b2021-04-19 13:22:54 -040039 const checkAccount = (req, res, next) => {
40 console.log(`checkAccount ${req.params.accountId} for ${req.user.id}`)
41 if (req.user && (!req.user.accountFilter || req.user.accountFilter(req.params.accountId))) {
42 return next();
43 }
44 res.status(403).end()
45 }
46
47 const accountRouter = Router({mergeParams: true})
48 router.use('/accounts/:accountId', checkAccount, accountRouter)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040049
Adrien Béraud86986032021-04-25 12:04:53 -040050 accountRouter.get('/', async (req, res) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -040051 console.log(`Get account ${req.params.accountId}`)
52 const account = this.jami.getAccount(req.params.accountId)
Adrien Béraud4e287b92021-04-24 16:15:56 -040053 if (account) {
54 account.defaultModerators = this.jami.getDefaultModerators(account.getId())
55 const obj = await account.getObject()
56 console.log(obj)
57 res.json(obj)
58 } else
Adrien Béraude74741b2021-04-19 13:22:54 -040059 res.status(404).end()
Adrien Béraud0cb76c92021-04-07 19:59:08 -040060 })
61
Adrien Béraud86986032021-04-25 12:04:53 -040062 accountRouter.post('/', async (req, res) => {
63 console.log(`Set account details ${req.params.accountId}`)
64 const account = this.jami.getAccount(req.params.accountId)
65 if (account) {
66 console.log(req.body)
67 const newDetails = account.updateDetails(req.body)
68 this.jami.setAccountDetails(account.getId(), newDetails)
69 res.status(200).end()
70 } else
71 res.status(404).end()
72 })
73
Adrien Béraud0cb76c92021-04-07 19:59:08 -040074 // Contacts
Adrien Béraud86986032021-04-25 12:04:53 -040075 accountRouter.get('/contacts', (req, res) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -040076 console.log(`Get account ${req.params.accountId}`)
77 const account = this.jami.getAccount(req.params.accountId)
78 if (account)
79 res.json(account.getContacts())
80 else
Adrien Béraude74741b2021-04-19 13:22:54 -040081 res.status(404).end()
Adrien Béraud0cb76c92021-04-07 19:59:08 -040082 })
Adrien Béraud6ecaa402021-04-06 17:37:25 -040083
Adrien Béraud4e287b92021-04-24 16:15:56 -040084 // Default modertors
85 accountRouter.put('/defaultModerators/:contactId', async (req, res) => {
86 console.log(`Adding default moderator ${req.params.contactId} to account ${req.params.accountId}`)
87 this.jami.addDefaultModerator(req.params.accountId, req.params.contactId)
88 res.status(200).end()
89 })
90 accountRouter.delete('/defaultModerators/:contactId', async (req, res) => {
91 console.log(`Removing default moderator to account ${req.params.accountId}`)
92 this.jami.removeDefaultModerator(req.params.accountId, req.params.contactId)
93 res.status(200).end()
94 })
95
Adrien Béraud6ecaa402021-04-06 17:37:25 -040096 // Conversations
Adrien Béraud150b4782021-04-21 19:40:59 -040097 accountRouter.get('/conversations', async (req, res, next) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -040098 console.log(`Get conversations for account ${req.params.accountId}`)
99 const account = this.jami.getAccount(req.params.accountId)
100 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -0400101 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400102 const conversations = account.getConversations()
Adrien Béraud150b4782021-04-21 19:40:59 -0400103 res.json(await Promise.all(Object.keys(conversations).map(async conversationId => await conversations[conversationId].getObject({
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400104 memberFilter: member => member.contact.getUri() !== account.getUri()
Adrien Béraud150b4782021-04-21 19:40:59 -0400105 }))))
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400106 //res.json(account.getConversations())
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400107 })
108
Adrien Béraud5e9e19b2021-04-22 01:38:53 -0400109 accountRouter.post('/conversations', (req, res) => {
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400110 console.log(`Create conversations for account, contact ${req.params.accountId}`)
111 console.log(req.body)
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 if (req.body.members.length === 1) {
116 const details = this.jami.addContact(req.params.accountId, req.body.members[0])
117 res.json(details)
118 } else
Adrien Béraude74741b2021-04-19 13:22:54 -0400119 res.status(400).end()
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400120 })
121
Adrien Béraud5e9e19b2021-04-22 01:38:53 -0400122 accountRouter.post('/conversations/:conversationId', async (req, res) => {
123 console.log(`Sending message to ${req.params.conversationId} for account ${req.params.accountId}`)
124 this.jami.sendMessage(req.params.accountId, req.params.conversationId, req.body.message)
125 res.status(200).end()
126 })
127
128 accountRouter.get('/conversations/:conversationId', async (req, res) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400129 console.log(`Get conversation ${req.params.conversationId} for account ${req.params.accountId}`)
130 const account = this.jami.getAccount(req.params.accountId)
131 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -0400132 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400133 const conversation = account.getConversation(req.params.conversationId)
134 if (!conversation)
Adrien Béraude74741b2021-04-19 13:22:54 -0400135 res.status(404).end()
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400136 else {
Adrien Béraud150b4782021-04-21 19:40:59 -0400137 res.json(await conversation.getObject({
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400138 memberFilter: member => member.contact.getUri() !== account.getUri()
139 }))
140 }
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400141 })
142
Adrien Béraud4e287b92021-04-24 16:15:56 -0400143 accountRouter.get('/conversations/:conversationId/messages', async (req, res) => {
144 console.log(`Get messages for conversation ${req.params.conversationId} for account ${req.params.accountId}`)
145 try {
146 const messages = await this.jami.loadMessages(req.params.accountId, req.params.conversationId)
147 res.json(messages).end()
148 } catch (e) {
149 res.status(400).json({ error: e.message })
150 }
151 })
152
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400153 // Nameserver
Adrien Béraude74741b2021-04-19 13:22:54 -0400154 const nsRouter = Router({mergeParams: true})
Adrien Béraud88a52442021-04-26 12:11:41 -0400155 accountRouter.use('/ns', nsRouter) // use account nameserver
156 router.use('/ns', nsRouter) // use default nameserver
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400157
158 nsRouter.get(['/name/:nameQuery'], (req, res, next) => {
159 console.log(`Name lookup ${req.params.nameQuery}`)
Adrien Béraud88a52442021-04-26 12:11:41 -0400160 this.jami.lookupName(req.params.accountId || '', req.params.nameQuery)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400161 .then(result => {
162 if (result.state == 0)
163 res.json(result)
164 else if (result.state == 1)
Adrien Béraud88a52442021-04-26 12:11:41 -0400165 res.status(400).json({})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400166 else
Adrien Béraud88a52442021-04-26 12:11:41 -0400167 res.status(404).json({})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400168 }).catch(e => {
Adrien Béraud88a52442021-04-26 12:11:41 -0400169 res.status(404).json({})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400170 })
171 })
172 nsRouter.get(['/addr/:addrQuery'], (req, res, next) => {
173 console.log(`Address lookup ${req.params.addrQuery}`)
Adrien Béraud88a52442021-04-26 12:11:41 -0400174 this.jami.lookupAddress(req.params.accountId || '', req.params.addrQuery)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400175 .then(result => {
176 if (result.state == 0)
177 res.json(result)
178 else if (result.state == 1)
Adrien Béraud88a52442021-04-26 12:11:41 -0400179 res.status(400).json({})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400180 else
Adrien Béraud88a52442021-04-26 12:11:41 -0400181 res.status(404).json({})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400182 }).catch(e => {
Adrien Béraud88a52442021-04-26 12:11:41 -0400183 res.status(404).json({})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400184 })
185 })
186
Adrien Béraud88a52442021-04-26 12:11:41 -0400187
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400188 return router
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400189 }
190}
191
Adrien Béraude74741b2021-04-19 13:22:54 -0400192export default JamiRestApi