blob: 674a688eace656315e8254be45a0824215d5aafe [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éraud6ecaa402021-04-06 17:37:25 -040035 if (account)
36 res.json(account.getObject())
37 else
Adrien Béraude74741b2021-04-19 13:22:54 -040038 res.status(404).end()
Adrien Béraud0cb76c92021-04-07 19:59:08 -040039 })
40
41 // Contacts
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040042 accountRouter.get(['/contacts'], (req, res, next) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -040043 console.log(`Get account ${req.params.accountId}`)
44 const account = this.jami.getAccount(req.params.accountId)
45 if (account)
46 res.json(account.getContacts())
47 else
Adrien Béraude74741b2021-04-19 13:22:54 -040048 res.status(404).end()
Adrien Béraud0cb76c92021-04-07 19:59:08 -040049 })
Adrien Béraud6ecaa402021-04-06 17:37:25 -040050
51 // Conversations
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040052 accountRouter.get('/conversations', (req, res, next) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -040053 console.log(`Get conversations for account ${req.params.accountId}`)
54 const account = this.jami.getAccount(req.params.accountId)
55 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -040056 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040057 const conversations = account.getConversations()
58 res.json(Object.keys(conversations).map(conversationId => conversations[conversationId].getObject({
59 memberFilter: member => member.contact.getUri() !== account.getUri()
60 })))
61 //res.json(account.getConversations())
Adrien Béraud6ecaa402021-04-06 17:37:25 -040062 })
63
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040064 accountRouter.post('/conversations', (req, res, next) => {
65 console.log(`Create conversations for account, contact ${req.params.accountId}`)
66 console.log(req.body)
67 const account = this.jami.getAccount(req.params.accountId)
68 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -040069 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040070 if (req.body.members.length === 1) {
71 const details = this.jami.addContact(req.params.accountId, req.body.members[0])
72 res.json(details)
73 } else
Adrien Béraude74741b2021-04-19 13:22:54 -040074 res.status(400).end()
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040075 })
76
77 accountRouter.get('/conversations/:conversationId', (req, res, next) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -040078 console.log(`Get conversation ${req.params.conversationId} for account ${req.params.accountId}`)
79 const account = this.jami.getAccount(req.params.accountId)
80 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -040081 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040082 const conversation = account.getConversation(req.params.conversationId)
83 if (!conversation)
Adrien Béraude74741b2021-04-19 13:22:54 -040084 res.status(404).end()
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040085 else {
86 res.json(conversation.getObject({
87 memberFilter: member => member.contact.getUri() !== account.getUri()
88 }))
89 }
Adrien Béraud6ecaa402021-04-06 17:37:25 -040090 })
91
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040092 // Nameserver
Adrien Béraude74741b2021-04-19 13:22:54 -040093 const nsRouter = Router({mergeParams: true})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040094 accountRouter.use('/ns', nsRouter)
95
96 nsRouter.get(['/name/:nameQuery'], (req, res, next) => {
97 console.log(`Name lookup ${req.params.nameQuery}`)
98 this.jami.lookupName(req.params.accountId, req.params.nameQuery)
99 .then(result => {
100 if (result.state == 0)
101 res.json(result)
102 else if (result.state == 1)
103 res.sendStatus(400)
104 else
105 res.sendStatus(404)
106 }).catch(e => {
107 res.sendStatus(404)
108 })
109 })
110 nsRouter.get(['/addr/:addrQuery'], (req, res, next) => {
111 console.log(`Address lookup ${req.params.addrQuery}`)
112 this.jami.lookupAddress(req.params.accountId, req.params.addrQuery)
113 .then(result => {
114 if (result.state == 0)
115 res.json(result)
116 else if (result.state == 1)
117 res.sendStatus(400)
118 else
119 res.sendStatus(404)
120 }).catch(e => {
121 res.sendStatus(404)
122 })
123 })
124
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400125 return router
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400126 }
127}
128
Adrien Béraude74741b2021-04-19 13:22:54 -0400129export default JamiRestApi