lapis = require "lapis" console = require "lapis.console" import respond_to from require "lapis.application" import escape_literal, escape_identifier from require "lapis.db" import unescape from require "lapis.util" import create_track, update_track, escape_tag from require "helpers" import Tracks, Tags from require "models" class extends lapis.Application layout: "layout" "/console": console.make! [track: "/track/:id[%d]"]: respond_to { GET: => if @track = Tracks\find id: tonumber @params.id @next = @track\next! @previous = @track\previous! return render: true else return redirect_to: @url_for "tracks" POST: => if track = update_track(@params) -- return redirect_to: @url_for "track", id: track.id -- not sure what's happening to make this error out.. return redirect_to: @url_for "track", id: @params.id else return redirect_to: @url_for "tracks" } [tracks: "/tracks(/:order[%a])(/:asc_desc)(/:page[%d])"]: => update_track(@params) if @params.id -- update a track if needed -- validate order @order = tostring(@params.order)\lower! unless Tracks.fields[@order] @order = "id" -- validate ascending/descending (ascending default) @asc_desc = tostring(@params.asc_desc)\upper! if @asc_desc != "DESC" and @asc_desc != "ASC" @asc_desc = "ASC" @page = tonumber(@params.page) or 1 tracks = Tracks\paginated "* ORDER BY #{escape_identifier @order} #{@asc_desc}", per_page: 32 @last_page = 1 + math.floor Tracks\count("true") / 32 -- tracks\num_pages! errors for an unknown reason -- validate page if @page < 1 return redirect_to: @url_for "tracks", order: @order, asc_desc: @asc_desc, page: 1 if @page > @last_page return redirect_to: @url_for "tracks", order: @order, asc_desc: @asc_desc, page: @last_page @tracks = tracks\get_page(@page) return render: true [tag: "/tag/:name(/:order[%a])(/:asc_desc)(/:page[%d])"]: => -- validate order @order = tostring(@params.order)\lower! unless Tags.fields[@order] @order = "id" -- validate ascending/descending @asc_desc = tostring(@params.asc_desc)\upper! if @asc_desc != "DESC" and @asc_desc != "ASC" @asc_desc = "ASC" @page = tonumber(@params.page) or 1 tag_pattern = escape_literal unescape(@params.name) tag_pattern = "'% " .. tag_pattern\sub(2, -2) .. " %'" tracks = Tracks\paginated "WHERE tags LIKE #{tag_pattern} ORDER BY #{escape_identifier @order} #{@asc_desc}", per_page: 32 @last_page = 1 if tag = Tags\find name: unescape(@params.name) @last_page = 1 + math.floor tag.count / 32 -- validate page if @page < 1 return redirect_to: @url_for "tag", name: @params.name, order: @order, asc_desc: @asc_desc, page: 1 if @page > @last_page return redirect_to: @url_for "tag", name: @params.name, order: @order, asc_desc: @asc_desc, page: @last_page @tracks = tracks\get_page(@page) return render: true [tags: "/tags(/:order[%a])(/:asc_desc)(/:page[%d])"]: => -- validate order @order = tostring(@params.order)\lower! unless Tags.fields[@order] @order = "count" -- validate ascending/descending @asc_desc = tostring(@params.asc_desc)\upper! if @asc_desc != "DESC" and @asc_desc != "ASC" @asc_desc = "DESC" @page = tonumber(@params.page) or 1 tags = Tags\paginated "* ORDER BY #{escape_identifier @order} #{@asc_desc}", per_page: 32 @last_page = 1 + math.floor Tags\count("true") / 32 -- copying from tracks since num_pages wasn't working then -- validate page if @page < 1 return redirect_to: @url_for "tags", order: @order, asc_desc: @asc_desc, page: 1 if @page > @last_page return redirect_to: @url_for "tags", order: @order, asc_desc: @asc_desc, page: @last_page @tags = tags\get_page(@page) return render: true [new_track: "/new"]: respond_to { GET: => render: true POST: => track = create_track(@params) if track return redirect_to: @url_for "track", id: track.id else return redirect_to: @url_for "new_track" }