PreviouslyOnIFM/code/handlers/artisthandler.lua

96 lines
2.4 KiB
Lua

local db = require("lapis.db")
local to_json = require("lapis.util").to_json
local autoload = require("lapis.util").autoload
local preload = require("lapis.db.model").preload
local models = autoload("models")
local function Artisthandler(self)
local artist_id = self.params.artist
local json = self.params.json or nil
-- find the artist
local artist = models.Artists:find({ id = artist_id })
if not artist then
self:write({"Not Found", status = 404})
return
end
local hidden_fields = {
"unique_name",
"created_at",
"updated_at"
}
for i, field in ipairs(hidden_fields) do
artist[field] = nil
end
-- find all tracks with this artist
local tracks = db.query([[
SELECT track.name AS track_name, track.id AS track_id, track.img_url
FROM track_artists
INNER JOIN
tracks AS track ON (track_artists.track = track.id)
WHERE track_artists.artist = ?
]], artist["id"])
artist["tracks"] = tracks
-- find all airtimes for each track
local total_airtimes = 0
local last_airtime = ""
for i, track in ipairs(tracks) do
local track_airtimes = 0
track["last_airtime"] = ""
local airtimes = db.query([[
SELECT airtime
FROM airtimes
WHERE track = ?
]], track["track_id"])
-- this can probably be done in SQL directly
for j, airtime in ipairs(airtimes) do
track_airtimes = track_airtimes + 1
total_airtimes = total_airtimes + 1
if airtime.airtime > last_airtime then
last_airtime = airtime.airtime
end
if airtime.airtime > track["last_airtime"] then
track["last_airtime"] = airtime.airtime
end
end
artist["tracks"][i]["track_airtimes"] = track_airtimes
-- find all releases with this track
local releases = db.query([[
SELECT release.id AS release_id, release.name AS release_name
FROM track_releases
INNER JOIN
releases AS release ON (track_releases.release = release.id)
WHERE track = ?
]], track["track_id"])
artist["tracks"][i]["releases"] = {}
for k, release in ipairs(releases) do
table.insert(artist["tracks"][i]["releases"], release)
end
end
artist["total_airtimes"] = total_airtimes
artist["last_airtime"] = last_airtime
if json then
return { json = artist }
end
self.artist = artist
return { render = "artist" }
end
return Artisthandler