[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.
|
# 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 "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"
|
$ 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
|
## Direct Join
|
||||||
|
|||||||
@@ -7,12 +7,19 @@ Create a meeting with a `HTTP request` containing the `API_KEY` sent to MiroTalk
|
|||||||
```bash
|
```bash
|
||||||
# js
|
# js
|
||||||
node meeting.js
|
node meeting.js
|
||||||
|
node join.js
|
||||||
|
|
||||||
# php
|
# php
|
||||||
php meeting.php
|
php meeting.php
|
||||||
|
php join.php
|
||||||
|
|
||||||
# python
|
# python
|
||||||
python meeting.py
|
python3 meeting.py
|
||||||
|
python3 join.py
|
||||||
|
|
||||||
# bash
|
# bash
|
||||||
./meeting.sh
|
./meeting.sh
|
||||||
|
./join.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
## Embed a meeting
|
## 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'
|
$ref: '#/definitions/MeetingResponse'
|
||||||
'403':
|
'403':
|
||||||
description: 'Unauthorized!'
|
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:
|
securityDefinitions:
|
||||||
secretApiKey:
|
secretApiKey:
|
||||||
@@ -45,3 +84,8 @@ definitions:
|
|||||||
properties:
|
properties:
|
||||||
meeting:
|
meeting:
|
||||||
type: 'string'
|
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
|
// not match any of page before, so 404 not found
|
||||||
app.get('*', function (req, res) {
|
app.get('*', function (req, res) {
|
||||||
res.sendFile(path.join(__dirname, '../../', 'public/view/404.html'));
|
res.sendFile(path.join(__dirname, '../../', 'public/view/404.html'));
|
||||||
|
|||||||
@@ -18,4 +18,19 @@ module.exports = class ServerApi {
|
|||||||
getMeetingURL() {
|
getMeetingURL() {
|
||||||
return 'https://' + this._host + '/join/' + uuidV4();
|
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"
|
"yamljs": "0.3.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"node-fetch": "3.1.0",
|
"node-fetch": "2.6.6",
|
||||||
"prettier": "2.5.1"
|
"prettier": "2.5.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
المرجع في مشكلة جديدة
حظر مستخدم