[mirotalksfu] - add API join endpoint + swagger doc

main
Miroslav Pejic 4 years ago
parent e678180b43
commit 05ed18f543

@ -101,6 +101,10 @@ $ docker-compose down
# The response will give you a entrypoint / Room URL for your meeting.
$ curl -X POST "http://localhost:3010/api/v1/meeting" -H "authorization: mirotalksfu_default_secret" -H "Content-Type: application/json"
$ curl -X POST "https://sfu.mirotalk.org/api/v1/meeting" -H "authorization: mirotalksfu_default_secret" -H "Content-Type: application/json"
# The response will give you a entrypoint / URL for the direct join.
$ curl -X POST "http://localhost:3010/api/v1/join" -H "authorization: mirotalksfu_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"mirotalksfu","audio":"0","video":"0"}'
$ curl -X POST "https://sfu.mirotalk.org/api/v1/join" -H "authorization: mirotalksfu_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"mirotalksfu","audio":"0","video":"0"}'
```
## Direct Join

@ -7,12 +7,19 @@ Create a meeting with a `HTTP request` containing the `API_KEY` sent to MiroTalk
```bash
# js
node meeting.js
node join.js
# php
php meeting.php
php join.php
# python
python meeting.py
python3 meeting.py
python3 join.py
# bash
./meeting.sh
./join.sh
```
## Embed a meeting

@ -0,0 +1,28 @@
'use strict';
const fetch = require('node-fetch');
const API_KEY = 'mirotalksfu_default_secret';
const MIROTALK_URL = 'http://localhost:3010/api/v1/join';
function getResponse() {
return fetch(MIROTALK_URL, {
method: 'POST',
headers: {
authorization: API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
room: 'test',
name: 'mirotalksfu',
audio: true,
video: true,
}),
});
}
getResponse().then(async (res) => {
console.log('Status code:', res.status);
const data = await res.json();
console.log('join:', data.join);
});

@ -0,0 +1,34 @@
<?php
$API_KEY = "mirotalksfu_default_secret";
$MIROTALK_URL = "http://localhost:3010/api/v1/join";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $MIROTALK_URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
$headers = [
'authorization:' . $API_KEY,
'Content-Type: application/json'
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$data = array(
"room" => "test",
"name" => "mirotalksfu",
"audio" => true,
"video" => true,
);
$data_string = json_encode($data);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
$response = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo "Status code: $httpcode \n";
$data = json_decode($response);
echo "join: ", $data->{'join'}, "\n";

@ -0,0 +1,27 @@
import requests
import json
API_KEY = "mirotalksfu_default_secret"
MIROTALK_URL = "http://localhost:3010/api/v1/join"
headers = {
"authorization": API_KEY,
"Content-Type": "application/json",
}
data = {
"room": "test",
"name": "mirotalksfu",
"audio": "true",
"video": "true",
}
response = requests.post(
MIROTALK_URL,
headers=headers,
json=data,
)
print("Status code:", response.status_code)
data = json.loads(response.text)
print("join:", data["join"])

@ -0,0 +1,10 @@
#!/bin/bash
API_KEY="mirotalksfu_default_secret"
MIROTALK_URL="http://localhost:3010/api/v1/join"
curl $MIROTALK_URL \
--header "authorization: $API_KEY" \
--header "Content-Type: application/json" \
--data '{"room":"test","name":"mirotalksfu","audio":"1","video":"1"}' \
--request POST

@ -31,6 +31,45 @@ paths:
$ref: '#/definitions/MeetingResponse'
'403':
description: 'Unauthorized!'
/join:
post:
tags:
- 'join'
summary: 'Create direct join'
description: 'Create join'
parameters:
- in: body
name: Join
description: Custom Join URL.
schema:
type: object
required:
- room
- name
- audio
- video
properties:
room:
type: string
name:
type: string
audio:
type: boolean
video:
type: boolean
consumes:
- 'application/json'
produces:
- 'application/json'
security:
- secretApiKey: []
responses:
'200':
description: 'Direct join created'
schema:
$ref: '#/definitions/JoinResponse'
'403':
description: 'Unauthorized!'
securityDefinitions:
secretApiKey:
@ -45,3 +84,8 @@ definitions:
properties:
meeting:
type: 'string'
JoinResponse:
type: 'object'
properties:
join:
type: 'string'

@ -176,6 +176,31 @@ app.post(['/api/v1/meeting'], (req, res) => {
});
});
// request join room endpoint
app.post(['/api/v1/join'], (req, res) => {
// check if user was authorized for the api call
let host = req.headers.host;
let authorization = req.headers.authorization;
let api = new ServerApi(host, authorization);
if (!api.isAuthorized()) {
log.debug('MiroTalk get join - Unauthorized', {
header: req.headers,
body: req.body,
});
return res.status(403).json({ error: 'Unauthorized!' });
}
// setup Join URL
let joinURL = api.getJoinURL(req.body);
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ join: joinURL }));
// log.debug the output if all done
log.debug('MiroTalk get join - Authorized', {
header: req.headers,
body: req.body,
join: joinURL,
});
});
// not match any of page before, so 404 not found
app.get('*', function (req, res) {
res.sendFile(path.join(__dirname, '../../', 'public/view/404.html'));

@ -18,4 +18,19 @@ module.exports = class ServerApi {
getMeetingURL() {
return 'https://' + this._host + '/join/' + uuidV4();
}
getJoinURL(data) {
return (
'https://' +
this._host +
'/join?room=' +
data.room +
'&name=' +
data.name +
'&audio=' +
data.audio +
'&video=' +
data.video
);
}
};

@ -29,7 +29,7 @@
"yamljs": "0.3.0"
},
"devDependencies": {
"node-fetch": "3.1.0",
"node-fetch": "2.6.6",
"prettier": "2.5.1"
}
}

Loading…
Cancel
Save