blob: 7ed056ee37f2b46512ea32aed95c8d0f7b1b4e07 [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 {
Adrien Béraud0561d3c2021-05-02 11:23:54 -040033 const accountId = await this.jami.addAccount(req.body)
34 if (req.body.registerName) {
35 this.jami.registerName(accountId, "", req.body.registerName)
36 .then(result => console.log("Name registrtion result: " + result))
37 }
38 res.json({ accountId })
Adrien Béraud88a52442021-04-26 12:11:41 -040039 } catch (e) {
40 res.status(400).json({ error: e })
41 }
42 })
43
Adrien Béraude74741b2021-04-19 13:22:54 -040044 const checkAccount = (req, res, next) => {
45 console.log(`checkAccount ${req.params.accountId} for ${req.user.id}`)
46 if (req.user && (!req.user.accountFilter || req.user.accountFilter(req.params.accountId))) {
47 return next();
48 }
49 res.status(403).end()
50 }
51
52 const accountRouter = Router({mergeParams: true})
53 router.use('/accounts/:accountId', checkAccount, accountRouter)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040054
Adrien Béraud86986032021-04-25 12:04:53 -040055 accountRouter.get('/', async (req, res) => {
idillon531b6f22022-09-16 14:02:00 -040056 console.log(`BBBBBBB Get account ${req.params.accountId}`)
Adrien Béraud0cb76c92021-04-07 19:59:08 -040057 const account = this.jami.getAccount(req.params.accountId)
Adrien Béraud4e287b92021-04-24 16:15:56 -040058 if (account) {
59 account.defaultModerators = this.jami.getDefaultModerators(account.getId())
ervinanohf1758a42022-09-14 14:52:51 -040060 const obj = await account.getObject();
61 obj.devices = this.jami.getDevices(req.params.accountId);
Adrien Béraud4e287b92021-04-24 16:15:56 -040062 res.json(obj)
63 } else
Adrien Béraude74741b2021-04-19 13:22:54 -040064 res.status(404).end()
Adrien Béraud0cb76c92021-04-07 19:59:08 -040065 })
66
idillon531b6f22022-09-16 14:02:00 -040067 accountRouter.post("/", async (req, res) => {
68 console.log(`Set account details ${req.params.accountId}`);
69 const account = this.jami.getAccount(req.params.accountId);
70 if (account) {
71 console.log(req.body);
72 const newDetails = account.updateDetails(req.body);
73 this.jami.setAccountDetails(account.getId(), newDetails);
74 res.status(200).end();
75 } else res.status(404).end();
76 });
Adrien Béraud86986032021-04-25 12:04:53 -040077
Adrien Béraud0cb76c92021-04-07 19:59:08 -040078 // Contacts
idillon531b6f22022-09-16 14:02:00 -040079 accountRouter.get("/contacts", (req, res) => {
80 console.log(`AAAAAAAA Get account ${req.params.accountId}`);
81 const account = this.jami.getAccount(req.params.accountId);
82 if (account) {
83 let rep = account.getContacts();
84 console.log(rep);
85 res.json(rep);
86 } else res.status(404).end();
87 });
88
89 accountRouter.get("/contacts/:contactId", (req, res) => {
90 console.log("CCCCCCC JAMI.JS: ", req.params);
91 console.log(`Get account details fot ${req.params.accountId}`);
92 const account = this.jami.getAccount(req.params.accountId);
93 const uri = req.params.uri;
94 if (account) {
95 let rep = account.getContactDetails(uri);
96 res.json(rep);
97 } else res.status(404).end();
98 });
Adrien Béraud6ecaa402021-04-06 17:37:25 -040099
Adrien Béraud4e287b92021-04-24 16:15:56 -0400100 // Default modertors
idillon531b6f22022-09-16 14:02:00 -0400101 accountRouter.put("/defaultModerators/:contactId", async (req, res) => {
102 console.log(
103 `Adding default moderator ${req.params.contactId} to account ${req.params.accountId}`
104 );
105 this.jami.addDefaultModerator(
106 req.params.accountId,
107 req.params.contactId
108 );
109 res.status(200).end();
110 });
111
Adrien Béraud4e287b92021-04-24 16:15:56 -0400112 accountRouter.delete('/defaultModerators/:contactId', async (req, res) => {
113 console.log(`Removing default moderator to account ${req.params.accountId}`)
114 this.jami.removeDefaultModerator(req.params.accountId, req.params.contactId)
115 res.status(200).end()
116 })
117
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400118 // Conversations
Adrien Béraud150b4782021-04-21 19:40:59 -0400119 accountRouter.get('/conversations', async (req, res, next) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400120 console.log(`Get conversations for account ${req.params.accountId}`)
121 const account = this.jami.getAccount(req.params.accountId)
122 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -0400123 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400124 const conversations = account.getConversations()
Adrien Béraud150b4782021-04-21 19:40:59 -0400125 res.json(await Promise.all(Object.keys(conversations).map(async conversationId => await conversations[conversationId].getObject({
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400126 memberFilter: member => member.contact.getUri() !== account.getUri()
Adrien Béraud150b4782021-04-21 19:40:59 -0400127 }))))
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400128 //res.json(account.getConversations())
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400129 })
130
Adrien Béraud5e9e19b2021-04-22 01:38:53 -0400131 accountRouter.post('/conversations', (req, res) => {
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400132 console.log(`Create conversations for account, contact ${req.params.accountId}`)
133 console.log(req.body)
134 const account = this.jami.getAccount(req.params.accountId)
135 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -0400136 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400137 if (req.body.members.length === 1) {
138 const details = this.jami.addContact(req.params.accountId, req.body.members[0])
139 res.json(details)
140 } else
Adrien Béraude74741b2021-04-19 13:22:54 -0400141 res.status(400).end()
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400142 })
143
Adrien Béraud5e9e19b2021-04-22 01:38:53 -0400144 accountRouter.post('/conversations/:conversationId', async (req, res) => {
145 console.log(`Sending message to ${req.params.conversationId} for account ${req.params.accountId}`)
146 this.jami.sendMessage(req.params.accountId, req.params.conversationId, req.body.message)
147 res.status(200).end()
148 })
149
150 accountRouter.get('/conversations/:conversationId', async (req, res) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400151 console.log(`Get conversation ${req.params.conversationId} for account ${req.params.accountId}`)
152 const account = this.jami.getAccount(req.params.accountId)
153 if (!account)
Adrien Béraude74741b2021-04-19 13:22:54 -0400154 return res.sendStatus(404)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400155 const conversation = account.getConversation(req.params.conversationId)
156 if (!conversation)
Adrien Béraude74741b2021-04-19 13:22:54 -0400157 res.status(404).end()
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400158 else {
Adrien Béraud150b4782021-04-21 19:40:59 -0400159 res.json(await conversation.getObject({
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400160 memberFilter: member => member.contact.getUri() !== account.getUri()
161 }))
162 }
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400163 })
164
Adrien Béraud4e287b92021-04-24 16:15:56 -0400165 accountRouter.get('/conversations/:conversationId/messages', async (req, res) => {
166 console.log(`Get messages for conversation ${req.params.conversationId} for account ${req.params.accountId}`)
167 try {
168 const messages = await this.jami.loadMessages(req.params.accountId, req.params.conversationId)
169 res.json(messages).end()
170 } catch (e) {
171 res.status(400).json({ error: e.message })
172 }
173 })
174
Adrien Béraudc25be582021-05-06 12:38:15 -0400175 // Calls
176
177 accountRouter.get('/calls', async (req, res) => {
178 console.log(`Get calls for account ${req.params.accountId}`)
179 try {
180 const calls = await this.jami.getCalls(req.params.accountId)
181 res.json(calls).end()
182 } catch (e) {
183 res.status(400).json({ error: e.message })
184 }
185 })
186
187 accountRouter.get('/calls/:callId', async (req, res) => {
188 console.log(`Get call ${callId} for account ${req.params.accountId}`)
189 try {
190 const messages = await this.jami.getCall(req.params.accountId, req.params.callId)
191 res.json(messages).end()
192 } catch (e) {
193 res.status(400).json({ error: e.message })
194 }
195 })
196
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400197 // Nameserver
Adrien Béraude74741b2021-04-19 13:22:54 -0400198 const nsRouter = Router({mergeParams: true})
Adrien Béraud88a52442021-04-26 12:11:41 -0400199 accountRouter.use('/ns', nsRouter) // use account nameserver
200 router.use('/ns', nsRouter) // use default nameserver
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400201
202 nsRouter.get(['/name/:nameQuery'], (req, res, next) => {
203 console.log(`Name lookup ${req.params.nameQuery}`)
Adrien Béraud88a52442021-04-26 12:11:41 -0400204 this.jami.lookupName(req.params.accountId || '', req.params.nameQuery)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400205 .then(result => {
206 if (result.state == 0)
207 res.json(result)
208 else if (result.state == 1)
Adrien Béraud88a52442021-04-26 12:11:41 -0400209 res.status(400).json({})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400210 else
Adrien Béraud88a52442021-04-26 12:11:41 -0400211 res.status(404).json({})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400212 }).catch(e => {
Adrien Béraud88a52442021-04-26 12:11:41 -0400213 res.status(404).json({})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400214 })
215 })
idillon531b6f22022-09-16 14:02:00 -0400216
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400217 nsRouter.get(['/addr/:addrQuery'], (req, res, next) => {
218 console.log(`Address lookup ${req.params.addrQuery}`)
Adrien Béraud88a52442021-04-26 12:11:41 -0400219 this.jami.lookupAddress(req.params.accountId || '', req.params.addrQuery)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400220 .then(result => {
221 if (result.state == 0)
222 res.json(result)
223 else if (result.state == 1)
Adrien Béraud88a52442021-04-26 12:11:41 -0400224 res.status(400).json({})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400225 else
Adrien Béraud88a52442021-04-26 12:11:41 -0400226 res.status(404).json({})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400227 }).catch(e => {
Adrien Béraud88a52442021-04-26 12:11:41 -0400228 res.status(404).json({})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400229 })
230 })
231
Adrien Béraud88a52442021-04-26 12:11:41 -0400232
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400233 return router
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400234 }
235}
236
Adrien Béraude74741b2021-04-19 13:22:54 -0400237export default JamiRestApi