123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- lapis = require "lapis"
- console = require "lapis.console"
-
- import respond_to from require "lapis.application"
- import escape_literal, escape_identifier from require "lapis.db"
- import escape, unescape from require "lapis.util"
- import create_track, update_track 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])"]: =>
- update_track(@params) if @params.id -- update a track if needed
- -- 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
-
- -- create tag pattern
- tag_pattern = unescape(@params.name)
- if tag_pattern != tag_pattern\lower!
- return redirect_to: @url_for "tag", name: escape(tag_pattern\lower!), order: @order, asc_desc: @asc_desc, page: @page
- tag_pattern = escape_literal tag_pattern
- 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"
- }
|