crystal-gauntlet/src/template_endpoints/song_upload.cr

47 lines
1.4 KiB
Crystal

require "ecr"
include CrystalGauntlet
# this function exists because first id for songs is not 1
def get_next_song_id() : Int32
begin
id = DATABASE.query_one("select id from next_id where name = ?", "songs", as: {Int32})
rescue
next_id = config_get("songs.preserve_newgrounds_ids").as(Bool) ? Songs::REUPLOADED_SONG_ADD_ID : Songs::CUSTOM_SONG_START
DATABASE.exec("insert into next_id (name, id) values (?, ?)", "songs", next_id)
next_id
else
next_id = id + 1
DATABASE.exec("update next_id set id = ? where name = ?", next_id, "songs")
return next_id
end
end
CrystalGauntlet.template_endpoints[{
name: "song_upload",
path: "/tools/song_upload",
methods: ["get", "post"]
}] = ->(context : HTTP::Server::Context, params : Hash(String, String?)) {
context.response.content_type = "text/html"
disabled = !(config_get("songs.allow_custom_songs").as?(Bool))
error = nil
song_id = nil
body = context.request.body
if body && !disabled
begin
params = URI::Params.parse(body.gets_to_end)
song_id = get_next_song_id()
DATABASE.exec("insert into songs (id, url) values (?, ?)", song_id, params["url"])
rescue error
# todo: HELP HOW DO I DO THIS BUT BETTER
ECR.embed("./public/template/song_upload.ecr", context.response)
else
ECR.embed("./public/template/song_upload.ecr", context.response)
end
else
ECR.embed("./public/template/song_upload.ecr", context.response)
end
}