blob: 77d8139b1cc4e23622402eb67220ab13c5dbfd5f [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éraud35e7d7c2021-04-13 03:28:39 -040065 accountRouter.post('/conversations', (req, res, next) => {
66 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éraud150b4782021-04-21 19:40:59 -040078 accountRouter.get('/conversations/:conversationId', async (req, res, next) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -040079 console.log(`Get conversation ${req.params.conversationId} for account ${req.params.accountId}`)
80 const account = this.jami.getAccount(req.params.accountId)
81 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -040082 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040083 const conversation = account.getConversation(req.params.conversationId)
84 if (!conversation)
Adrien Béraude74741b2021-04-19 13:22:54 -040085 res.status(404).end()
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040086 else {
Adrien Béraud150b4782021-04-21 19:40:59 -040087 res.json(await conversation.getObject({
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040088 memberFilter: member => member.contact.getUri() !== account.getUri()
89 }))
90 }
Adrien Béraud6ecaa402021-04-06 17:37:25 -040091 })
92
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040093 // Nameserver
Adrien Béraude74741b2021-04-19 13:22:54 -040094 const nsRouter = Router({mergeParams: true})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040095 accountRouter.use('/ns', nsRouter)
96
97 nsRouter.get(['/name/:nameQuery'], (req, res, next) => {
98 console.log(`Name lookup ${req.params.nameQuery}`)
99 this.jami.lookupName(req.params.accountId, req.params.nameQuery)
100 .then(result => {
101 if (result.state == 0)
102 res.json(result)
103 else if (result.state == 1)
104 res.sendStatus(400)
105 else
106 res.sendStatus(404)
107 }).catch(e => {
108 res.sendStatus(404)
109 })
110 })
111 nsRouter.get(['/addr/:addrQuery'], (req, res, next) => {
112 console.log(`Address lookup ${req.params.addrQuery}`)
113 this.jami.lookupAddress(req.params.accountId, req.params.addrQuery)
114 .then(result => {
115 if (result.state == 0)
116 res.json(result)
117 else if (result.state == 1)
118 res.sendStatus(400)
119 else
120 res.sendStatus(404)
121 }).catch(e => {
122 res.sendStatus(404)
123 })
124 })
125
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400126 return router
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400127 }
128}
129
Adrien Béraude74741b2021-04-19 13:22:54 -0400130export default JamiRestApi