I intend to use this privately for music organization.

app.moon 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. lapis = require "lapis"
  2. console = require "lapis.console"
  3. import respond_to from require "lapis.application"
  4. import escape_literal, escape_identifier from require "lapis.db"
  5. import escape, unescape from require "lapis.util"
  6. import create_track, update_track from require "helpers"
  7. import Tracks, Tags from require "models"
  8. class extends lapis.Application
  9. layout: "layout"
  10. "/console": console.make!
  11. [track: "/track/:id[%d]"]: respond_to {
  12. GET: =>
  13. if @track = Tracks\find id: tonumber @params.id
  14. @next = @track\next!
  15. @previous = @track\previous!
  16. return render: true
  17. else
  18. return redirect_to: @url_for "tracks"
  19. POST: =>
  20. if track = update_track(@params)
  21. -- return redirect_to: @url_for "track", id: track.id -- not sure what's happening to make this error out..
  22. return redirect_to: @url_for "track", id: @params.id
  23. else
  24. return redirect_to: @url_for "tracks"
  25. }
  26. [tracks: "/tracks(/:order[%a])(/:asc_desc)(/:page[%d])"]: =>
  27. update_track(@params) if @params.id -- update a track if needed
  28. -- validate order
  29. @order = tostring(@params.order)\lower!
  30. unless Tracks.fields[@order]
  31. @order = "id"
  32. -- validate ascending/descending (ascending default)
  33. @asc_desc = tostring(@params.asc_desc)\upper!
  34. if @asc_desc != "DESC" and @asc_desc != "ASC"
  35. @asc_desc = "ASC"
  36. @page = tonumber(@params.page) or 1
  37. tracks = Tracks\paginated "* ORDER BY #{escape_identifier @order} #{@asc_desc}", per_page: 32
  38. @last_page = 1 + math.floor Tracks\count("true") / 32 -- tracks\num_pages! errors for an unknown reason
  39. -- validate page
  40. if @page < 1
  41. return redirect_to: @url_for "tracks", order: @order, asc_desc: @asc_desc, page: 1
  42. if @page > @last_page
  43. return redirect_to: @url_for "tracks", order: @order, asc_desc: @asc_desc, page: @last_page
  44. @tracks = tracks\get_page(@page)
  45. return render: true
  46. [tag: "/tag/:name(/:order[%a])(/:asc_desc)(/:page[%d])"]: =>
  47. update_track(@params) if @params.id -- update a track if needed
  48. -- validate order
  49. @order = tostring(@params.order)\lower!
  50. unless Tags.fields[@order]
  51. @order = "id"
  52. -- validate ascending/descending
  53. @asc_desc = tostring(@params.asc_desc)\upper!
  54. if @asc_desc != "DESC" and @asc_desc != "ASC"
  55. @asc_desc = "ASC"
  56. @page = tonumber(@params.page) or 1
  57. -- create tag pattern
  58. tag_pattern = unescape(@params.name)
  59. if tag_pattern != tag_pattern\lower!
  60. return redirect_to: @url_for "tag", name: escape(tag_pattern\lower!), order: @order, asc_desc: @asc_desc, page: @page
  61. tag_pattern = escape_literal tag_pattern
  62. tag_pattern = "'% #{tag_pattern\sub 2, -2} %'"
  63. tracks = Tracks\paginated "WHERE tags LIKE #{tag_pattern} ORDER BY #{escape_identifier @order} #{@asc_desc}", per_page: 32
  64. @last_page = 1
  65. if tag = Tags\find name: unescape(@params.name)
  66. @last_page = 1 + math.floor tag.count / 32
  67. -- validate page
  68. if @page < 1
  69. return redirect_to: @url_for "tag", name: @params.name, order: @order, asc_desc: @asc_desc, page: 1
  70. if @page > @last_page
  71. return redirect_to: @url_for "tag", name: @params.name, order: @order, asc_desc: @asc_desc, page: @last_page
  72. @tracks = tracks\get_page(@page)
  73. return render: true
  74. [tags: "/tags(/:order[%a])(/:asc_desc)(/:page[%d])"]: =>
  75. -- validate order
  76. @order = tostring(@params.order)\lower!
  77. unless Tags.fields[@order]
  78. @order = "count"
  79. -- validate ascending/descending
  80. @asc_desc = tostring(@params.asc_desc)\upper!
  81. if @asc_desc != "DESC" and @asc_desc != "ASC"
  82. @asc_desc = "DESC"
  83. @page = tonumber(@params.page) or 1
  84. tags = Tags\paginated "* ORDER BY #{escape_identifier @order} #{@asc_desc}", per_page: 32
  85. @last_page = 1 + math.floor Tags\count("true") / 32 -- copying from tracks since num_pages wasn't working then
  86. -- validate page
  87. if @page < 1
  88. return redirect_to: @url_for "tags", order: @order, asc_desc: @asc_desc, page: 1
  89. if @page > @last_page
  90. return redirect_to: @url_for "tags", order: @order, asc_desc: @asc_desc, page: @last_page
  91. @tags = tags\get_page(@page)
  92. return render: true
  93. [new_track: "/new"]: respond_to {
  94. GET: => render: true
  95. POST: =>
  96. track = create_track(@params)
  97. if track
  98. return redirect_to: @url_for "track", id: track.id
  99. else
  100. return redirect_to: @url_for "new_track"
  101. }