This is the code that runs https://bandolier.learnjsthehardway.com/ for you to review. It uses the https://git.learnjsthehardway.com/learn-javascript-the-hard-way/bandolier-template to create the documentation for the project.
https://bandolier.learnjsthehardway.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.3 KiB
88 lines
2.3 KiB
2 years ago
|
import { Livestream } from "../lib/models.js";
|
||
|
import logging from '../lib/logging.js';
|
||
|
import { API } from '../lib/api.js';
|
||
|
import { knex } from "../lib/ormish.js";
|
||
|
import { discord, socket } from "../lib/config.js";
|
||
|
import { send_update_viewers, add_view_count } from "../lib/queues.js";
|
||
|
|
||
|
const log = logging.create(import.meta.url);
|
||
|
|
||
|
const next_state = (stream) => {
|
||
|
if(stream.state === "pending") {
|
||
|
return "ready";
|
||
|
} else if(stream.state === "ready") {
|
||
|
return "live";
|
||
|
} else {
|
||
|
return "finished";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export const get = async (req, res) => {
|
||
|
const api = new API(req, res);
|
||
|
const { livestream_id } = req.query;
|
||
|
|
||
|
|
||
|
try {
|
||
|
if(livestream_id) {
|
||
|
const stream = await Livestream.first({id: livestream_id});
|
||
|
|
||
|
if(stream) {
|
||
|
stream.media = await stream.media();
|
||
|
add_view_count(livestream_id);
|
||
|
api.reply(200, stream);
|
||
|
} else {
|
||
|
api.error(404, "not found");
|
||
|
}
|
||
|
} else {
|
||
|
const streams = await knex(Livestream.table_name).
|
||
|
orderBy("episode", "desc");
|
||
|
|
||
|
api.reply(200, streams);
|
||
|
}
|
||
|
} catch (error) {
|
||
|
log.error(error);
|
||
|
api.error(500, error.message || "Internal Server Error");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export const post = async (req, res) => {
|
||
|
const api = new API(req, res);
|
||
|
const { livestream_id } = req.body;
|
||
|
|
||
|
|
||
|
try {
|
||
|
if(!api.admin_authenticated) {
|
||
|
return api.error(401, "Admin rights required.");
|
||
|
} else if(livestream_id) {
|
||
|
const stream = await Livestream.first({id: livestream_id});
|
||
|
|
||
|
if(stream) {
|
||
|
const live = next_state(stream);
|
||
|
|
||
|
// change state to live, then the live client
|
||
|
// should listen on the chat and then update the
|
||
|
// UI or reload or something
|
||
|
await Livestream.update({id: livestream_id}, {state: live});
|
||
|
|
||
|
// notify connected clients that the stream has changed
|
||
|
if(socket && socket.api_key) {
|
||
|
send_update_viewers(socket.api_key);
|
||
|
} else {
|
||
|
log.error("Socket not connected or no api_key.");
|
||
|
}
|
||
|
|
||
|
return api.reply(200, {"message": "OK"});
|
||
|
} else {
|
||
|
return api.error(404, "not found");
|
||
|
}
|
||
|
} else {
|
||
|
return api.error(404, "not found");
|
||
|
}
|
||
|
} catch (error) {
|
||
|
log.error(error);
|
||
|
return api.error(500, error.message || "Internal Server Error");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
post.authenticated = true;
|