mirror of https://git.sr.ht/~cadence/cloudtube
113 lines
3.1 KiB
JavaScript
113 lines
3.1 KiB
JavaScript
const {redirect} = require("pinski/plugins")
|
|
const db = require("../utils/db")
|
|
const constants = require("../utils/constants")
|
|
const {getUser, setToken} = require("../utils/getuser")
|
|
const validate = require("../utils/validate")
|
|
const V = validate.V
|
|
const {fetchChannel} = require("../utils/youtube")
|
|
|
|
module.exports = [
|
|
{
|
|
route: `/formapi/(un|)subscribe/(${constants.regex.ucid})`, methods: ["POST"], upload: true, code: async ({req, fill, body}) => {
|
|
const add = !fill[0]
|
|
const ucid = fill[1]
|
|
|
|
return new V()
|
|
.with(validate.presetLoad({body}))
|
|
.with(validate.presetURLParamsBody())
|
|
.last(async state => {
|
|
const {params} = state
|
|
const responseHeaders = {}
|
|
const user = getUser(req, responseHeaders)
|
|
const settings = user.getSettingsOrDefaults()
|
|
const token = user.token
|
|
|
|
if (add) {
|
|
await fetchChannel("channel", ucid, settings.instance)
|
|
db.prepare(
|
|
"INSERT INTO Subscriptions (token, ucid) VALUES (?, ?)"
|
|
).run(token, ucid)
|
|
} else {
|
|
db.prepare("DELETE FROM Subscriptions WHERE token = ? AND ucid = ?").run(token, ucid)
|
|
}
|
|
|
|
if (params.has("referrer")) {
|
|
return {
|
|
statusCode: 303,
|
|
contentType: "text/plain",
|
|
headers: Object.assign(responseHeaders, {
|
|
Location: params.get("referrer")
|
|
}),
|
|
content: "Success, redirecting..."
|
|
}
|
|
} else {
|
|
return {
|
|
statusCode: 200,
|
|
contentType: "text/plain",
|
|
headers: responseHeaders,
|
|
content: "Success."
|
|
}
|
|
}
|
|
})
|
|
.go()
|
|
}
|
|
},
|
|
{
|
|
route: `/formapi/markwatched/(${constants.regex.video_id})`, methods: ["POST"], code: async ({req, fill}) => {
|
|
const videoID = fill[0]
|
|
const user = getUser(req)
|
|
const token = user.token
|
|
if (token) {
|
|
db.prepare("INSERT OR IGNORE INTO WatchedVideos (token, videoID) VALUES (?, ?)").run(token, videoID)
|
|
}
|
|
return {
|
|
statusCode: 303,
|
|
contentType: "text/plain",
|
|
headers: {
|
|
Location: "/subscriptions"
|
|
},
|
|
content: {
|
|
status: "Success, redirecting..."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
route: "/formapi/erase", methods: ["POST"], upload: true, code: async ({req, fill, body}) => {
|
|
return new V()
|
|
.with(validate.presetLoad({body}))
|
|
.with(validate.presetURLParamsBody())
|
|
.with(validate.presetEnsureParams(["token"]))
|
|
.last(async state => {
|
|
const {params} = state
|
|
const token = params.get("token")
|
|
;["Subscriptions", "Settings", "SeenTokens", "WatchedVideos"].forEach(table => {
|
|
db.prepare(`DELETE FROM ${table} WHERE token = ?`).run(token)
|
|
})
|
|
return {
|
|
statusCode: 303,
|
|
contentType: "text/plain",
|
|
headers: {
|
|
location: "/",
|
|
"set-cookie": `token=; Path=/; Max-Age=0; HttpOnly; SameSite=Lax`
|
|
},
|
|
content: "Success, redirecting..."
|
|
}
|
|
})
|
|
.go()
|
|
}
|
|
},
|
|
{
|
|
route: "/formapi/importsession/(\\w+)", methods: ["GET"], code: async ({req, fill}) => {
|
|
return {
|
|
statusCode: 303,
|
|
headers: setToken({
|
|
location: "/subscriptions"
|
|
}, fill[0]).responseHeaders,
|
|
contentType: "text/plain",
|
|
content: "Success, redirecting..."
|
|
}
|
|
}
|
|
}
|
|
]
|