mirror of
				https://git.sr.ht/~cadence/cloudtube
				synced 2025-10-27 19:59:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			69 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const {render, redirect} = require("pinski/plugins")
 | |
| const db = require("../utils/db")
 | |
| const {getToken, getUser} = require("../utils/getuser")
 | |
| const constants = require("../utils/constants")
 | |
| const {getInstances} = require("../background/instances")
 | |
| const validate = require("../utils/validate")
 | |
| const V = validate.V
 | |
| 
 | |
| module.exports = [
 | |
| 	{
 | |
| 		route: "/settings", methods: ["GET"], code: async ({req}) => {
 | |
| 			const user = getUser(req)
 | |
| 			const settings = user.getSettings()
 | |
| 			const instances = getInstances()
 | |
| 			return render(200, "pug/settings.pug", {constants, user, settings, instances})
 | |
| 		}
 | |
| 	},
 | |
| 	{
 | |
| 		route: "/settings", methods: ["POST"], upload: true, code: async ({req, body}) => {
 | |
| 			return new V()
 | |
| 				.with(validate.presetLoad({body}))
 | |
| 				.with(validate.presetURLParamsBody())
 | |
| 				.last(async state => {
 | |
| 					const {params} = state
 | |
| 					const responseHeaders = {
 | |
| 						Location: "/settings"
 | |
| 					}
 | |
| 					const token = getToken(req, responseHeaders)
 | |
| 					const data = {}
 | |
| 
 | |
| 					for (const key of Object.keys(constants.user_settings)) {
 | |
| 						const setting = constants.user_settings[key]
 | |
| 						if (params.has(key)) {
 | |
| 							const provided = params.get(key)
 | |
| 							if (setting.type === "string") {
 | |
| 								if (provided) data[key] = provided
 | |
| 								else data[key] = null
 | |
| 							} else if (setting.type === "integer") {
 | |
| 								if (isNaN(provided)) data[key] = null
 | |
| 								else data[key] = +provided
 | |
| 							} else if (setting.type === "boolean") {
 | |
| 								if (provided === "1") data[key] = 1
 | |
| 								else data[key] = 0
 | |
| 							} else {
 | |
| 								throw new Error("Unsupported setting type: "+setting.type)
 | |
| 							}
 | |
| 						} else {
 | |
| 							data[key] = null
 | |
| 						}
 | |
| 					}
 | |
| 
 | |
| 					db.prepare("DELETE FROM Settings WHERE token = ?").run(token)
 | |
| 					const keys = ["token", ...Object.keys(constants.user_settings)]
 | |
| 					const baseFields = keys.join(", ")
 | |
| 					const atFields = keys.map(k => "@"+k).join(", ")
 | |
| 					db.prepare(`INSERT INTO Settings (${baseFields}) VALUES (${atFields})`).run({token, ...data})
 | |
| 
 | |
| 					return {
 | |
| 						statusCode: 303,
 | |
| 						headers: responseHeaders,
 | |
| 						contentType: "text/html",
 | |
| 						content: "Redirecting..."
 | |
| 					}
 | |
| 				})
 | |
| 				.go()
 | |
| 		}
 | |
| 	}
 | |
| ]
 | 
