[mirotalksfu] - add API join endpoint + swagger doc
هذا الالتزام موجود في:
@@ -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
|
||||
|
||||
28
app/api/join/join.js
Normal file
28
app/api/join/join.js
Normal file
@@ -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);
|
||||
});
|
||||
34
app/api/join/join.php
Normal file
34
app/api/join/join.php
Normal file
@@ -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";
|
||||
27
app/api/join/join.py
Normal file
27
app/api/join/join.py
Normal file
@@ -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"])
|
||||
10
app/api/join/join.sh
Executable file
10
app/api/join/join.sh
Executable file
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
المرجع في مشكلة جديدة
حظر مستخدم