some more improvements; basics for testing; new endpoints with html + json output
This commit is contained in:
parent
cddb4db941
commit
3082956dee
@ -1,5 +1,7 @@
|
||||
FROM mileschou/lapis:latest as previouslyon
|
||||
FROM mileschou/lapis:alpine as previouslyon
|
||||
|
||||
RUN docker-luarocks-install busted
|
||||
|
||||
WORKDIR /srv/lapis
|
||||
|
||||
CMD lapis server
|
||||
CMD lapis server
|
||||
|
||||
8
README.md
Normal file
8
README.md
Normal file
@ -0,0 +1,8 @@
|
||||
database and api for keeping track of all IFM tracks
|
||||
|
||||
== drop db and create fresh ==
|
||||
* in postgres container:
|
||||
** DROP SCHEMA public CASCADE;
|
||||
** CREATE SCHEMA public;
|
||||
* in lapis container:
|
||||
** lapis migrate
|
||||
15
code/app.lua
15
code/app.lua
@ -1,18 +1,15 @@
|
||||
local lapis = require("lapis")
|
||||
local config = require("lapis.config").get()
|
||||
local to_json = require("lapis.util").to_json
|
||||
local json_params = require("lapis.application").json_params
|
||||
local db = require("lapis.db")
|
||||
|
||||
local app = lapis.Application()
|
||||
app:enable("etlua")
|
||||
|
||||
local autoload = require("lapis.util").autoload
|
||||
local models = autoload("models")
|
||||
local handlers = autoload("handlers")
|
||||
|
||||
app:get("/", function(self)
|
||||
-- return "Welcome to Lapis " .. require("lapis.version")
|
||||
return config.greeting .. " from port " .. config.postgres.password
|
||||
return config.greeting
|
||||
|
||||
end)
|
||||
|
||||
@ -20,12 +17,16 @@ app:match("/spl/:station", function(self)
|
||||
return handlers.Splhandler(self)
|
||||
end)
|
||||
|
||||
app:match("/station/:station", json_params(function(self)
|
||||
app:match("station", "/station/:station(.:json)", json_params(function(self)
|
||||
return handlers.Stationhandler(self)
|
||||
end))
|
||||
|
||||
app:match("/track/:track", json_params(function(self)
|
||||
app:match("track", "/track/:track", json_params(function(self)
|
||||
return handlers.Trackhandler(self)
|
||||
end))
|
||||
|
||||
app:match("artist", "/artist/:artist", json_params(function(self)
|
||||
return handlers.Artisthandler(self)
|
||||
end))
|
||||
|
||||
return app
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
local config = require("lapis.config")
|
||||
config("development", {
|
||||
greeting = "waddup",
|
||||
greeting = "dingen",
|
||||
postgres = {
|
||||
host = "postgres",
|
||||
user = "postgres",
|
||||
@ -8,3 +8,12 @@ config("development", {
|
||||
database = "postgres"
|
||||
}
|
||||
})
|
||||
|
||||
config("test", {
|
||||
postgres = {
|
||||
host = "postgres",
|
||||
user = "postgres",
|
||||
password = "the_password",
|
||||
database = "test"
|
||||
}
|
||||
})
|
||||
|
||||
57
code/handlers/artisthandler.lua
Normal file
57
code/handlers/artisthandler.lua
Normal file
@ -0,0 +1,57 @@
|
||||
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")
|
||||
|
||||
|
||||
function Artisthandler(self)
|
||||
local artist_id = self.params.artist
|
||||
|
||||
local artist = models.Artists:find({ id = artist_id })
|
||||
if not artist then
|
||||
self:write({"Not Found", status = 404})
|
||||
end
|
||||
|
||||
local hidden_fields = {
|
||||
"unique_name",
|
||||
"created_at",
|
||||
"updated_at"
|
||||
}
|
||||
|
||||
for i, field in ipairs(hidden_fields) do
|
||||
artist[field] = nil
|
||||
end
|
||||
|
||||
local tracks = db.query([[
|
||||
SELECT track.name AS track_name, release.name AS release_name
|
||||
FROM track_artists
|
||||
INNER JOIN
|
||||
tracks AS track ON (track_artists.track = track.id)
|
||||
INNER JOIN
|
||||
track_releases AS track_release ON (track_release.track = track.id)
|
||||
INNER JOIN
|
||||
releases AS release ON (track_release.release = release.id)
|
||||
WHERE track_artists.artist = ?
|
||||
]], artist["id"])
|
||||
|
||||
|
||||
artist["tracks"] = tracks
|
||||
|
||||
-- local airtimes = db.query([[
|
||||
-- SELECT airtime
|
||||
-- FROM airtimes
|
||||
-- WHERE track = ?
|
||||
-- ]], track["id"])
|
||||
|
||||
-- artist["airtimes"] = {}
|
||||
-- for i, airtime in ipairs(airtimes) do
|
||||
-- artist["airtimes"][i] = airtime.airtime
|
||||
-- end
|
||||
|
||||
return { json = artist }
|
||||
|
||||
end
|
||||
|
||||
return Artisthandler
|
||||
@ -39,32 +39,15 @@ function Splhandler(self)
|
||||
|
||||
local track = nil
|
||||
local track_name = self.params.track_name -- mandatory
|
||||
local track_info_url = nil
|
||||
if self.params.info_url then
|
||||
track_info_url = self.params.info_url
|
||||
end
|
||||
local track_img_url = nil
|
||||
if self.params.img_url then
|
||||
track_img_url = self.params.img_url
|
||||
end
|
||||
local track_info_url = self.params.info_url or nil
|
||||
local track_img_url = self.params.img_url or "blanco.png"
|
||||
|
||||
local release = nil
|
||||
local release_name = nil
|
||||
if self.params.release_name then
|
||||
release_name = self.params.release_name
|
||||
end
|
||||
local release_year = nil
|
||||
if self.params.year then
|
||||
release_year = tonumber(self.params.year)
|
||||
end
|
||||
local release_country = nil
|
||||
if self.params.country then
|
||||
release_country = self.params.country
|
||||
end
|
||||
local release_label = nil
|
||||
if self.params.label then
|
||||
release_label = self.params.label
|
||||
end
|
||||
local release_name = self.params.release_name or nil
|
||||
local release_year = tonumber(self.params.year) or nil
|
||||
|
||||
local release_country = self.params.country or nil
|
||||
local release_label = self.params.label or nil
|
||||
|
||||
local airtime = self.params.time -- mandatory
|
||||
local airdate = self.params.date -- mandatory
|
||||
@ -172,4 +155,4 @@ function Splhandler(self)
|
||||
|
||||
end
|
||||
|
||||
return Splhandler
|
||||
return Splhandler
|
||||
|
||||
@ -8,6 +8,7 @@ local models = autoload("models")
|
||||
|
||||
function Stationhandler(self)
|
||||
local station_id = self.params.station
|
||||
local json = self.params.json or nil
|
||||
|
||||
local station = models.Stations:find({ station = station_id })
|
||||
if not station then
|
||||
@ -16,11 +17,8 @@ function Stationhandler(self)
|
||||
print("This is: " .. station["name"])
|
||||
end
|
||||
|
||||
local artist = nil
|
||||
local release = nil
|
||||
local return_dict = {}
|
||||
local limit = 10
|
||||
local offset = 0
|
||||
local limit = self.params.limit or 10
|
||||
local offset = self.params.offset or 0
|
||||
|
||||
-- local airtimes = models.Airtimes:paginated("where station = ? order by airtime desc", station["id"], {
|
||||
-- per_page = 10,
|
||||
@ -31,33 +29,41 @@ function Stationhandler(self)
|
||||
-- return airtime
|
||||
-- end
|
||||
-- })
|
||||
|
||||
|
||||
-- airtimes = airtimes:get_page(1)
|
||||
|
||||
local airtimes = db.query([[
|
||||
SELECT airtime, track.name AS track, track.year, track.info_url, track.img_url,
|
||||
artist.name as artist,
|
||||
release.name AS release, release.country, release.label AS label
|
||||
self.airtimes = db.query([[
|
||||
SELECT airtime, track.id AS track_id, track.name AS track, track.year, track.info_url, track.img_url,
|
||||
artist.id AS artist_id, artist.name as artist,
|
||||
release.id AS release_id, release.name AS release, release.country, release.label AS label
|
||||
FROM airtimes
|
||||
INNER JOIN
|
||||
INNER JOIN
|
||||
tracks AS track ON (airtimes.track = track.id)
|
||||
INNER JOIN
|
||||
track_artists as track_artist ON (track_artist.track = track.id)
|
||||
INNER JOIN
|
||||
artists as artist ON (track_artist.artist = artist.id)
|
||||
INNER JOIN
|
||||
track_releases as track_release ON (track_release.track = track.id)
|
||||
INNER JOIN
|
||||
releases as release ON (track_release.release = release.id)
|
||||
INNER JOIN
|
||||
track_artists AS track_artist ON (track_artist.track = track.id)
|
||||
INNER JOIN
|
||||
artists AS artist ON (track_artist.artist = artist.id)
|
||||
INNER JOIN
|
||||
track_releases AS track_release ON (track_release.track = track.id)
|
||||
INNER JOIN
|
||||
releases AS release ON (track_release.release = release.id)
|
||||
WHERE station = ?
|
||||
ORDER BY airtime
|
||||
ORDER BY airtime
|
||||
DESC LIMIT ?
|
||||
OFFSET ?
|
||||
]], station["id"], limit, offset*limit
|
||||
)
|
||||
|
||||
return { json = airtimes }
|
||||
if json then
|
||||
return { json = self.airtimes }
|
||||
end
|
||||
|
||||
for i, item in ipairs(self.airtimes) do
|
||||
print(to_json(item))
|
||||
end
|
||||
|
||||
return { render = "station" }
|
||||
|
||||
end
|
||||
|
||||
return Stationhandler
|
||||
return Stationhandler
|
||||
|
||||
@ -24,9 +24,6 @@ function Trackhandler(self)
|
||||
track[field] = nil
|
||||
end
|
||||
|
||||
local artists = {}
|
||||
local airtimes = nil
|
||||
|
||||
local artists = db.query([[
|
||||
SELECT artist.name AS artist_name
|
||||
FROM track_artists
|
||||
@ -35,7 +32,7 @@ function Trackhandler(self)
|
||||
WHERE track_artists.track = ?
|
||||
]], track["id"])
|
||||
|
||||
|
||||
|
||||
track["artist"] = artists[1]["artist_name"]
|
||||
|
||||
local airtimes = db.query([[
|
||||
@ -48,9 +45,9 @@ function Trackhandler(self)
|
||||
for i, airtime in ipairs(airtimes) do
|
||||
track["airtimes"][i] = airtime.airtime
|
||||
end
|
||||
|
||||
|
||||
return { json = track }
|
||||
|
||||
end
|
||||
|
||||
return Trackhandler
|
||||
return Trackhandler
|
||||
|
||||
@ -34,6 +34,8 @@ return {
|
||||
{"img_url", types.varchar({ null=true }) },
|
||||
})
|
||||
create_index("tracks", "unique_name", { unique=true })
|
||||
create_index("tracks", "name")
|
||||
create_index("tracks", "year")
|
||||
|
||||
-- track_artists
|
||||
schema.create_table("track_artists", {
|
||||
@ -54,6 +56,7 @@ return {
|
||||
{"updated_at", types.time},
|
||||
{"station", types.integer},
|
||||
{"name", types.varchar},
|
||||
{"image", types.varchar},
|
||||
})
|
||||
create_index("stations", "station", "name", { unique=true })
|
||||
|
||||
@ -61,21 +64,24 @@ return {
|
||||
created_at = os.date(),
|
||||
updated_at = os.date(),
|
||||
station = 1,
|
||||
name = "Cybernetic Broadcasting System"
|
||||
name = "Cybernetic Broadcasting System",
|
||||
image = "CBS.red.png"
|
||||
})
|
||||
|
||||
db.insert("stations", {
|
||||
created_at = os.date(),
|
||||
updated_at = os.date(),
|
||||
station = 2,
|
||||
name = "Disco Fetish"
|
||||
name = "Disco Fetish",
|
||||
image = "DF.red.png"
|
||||
})
|
||||
|
||||
db.insert("stations", {
|
||||
created_at = os.date(),
|
||||
updated_at = os.date(),
|
||||
station = 3,
|
||||
name = "The Dream Machine"
|
||||
name = "The Dream Machine",
|
||||
image = "tdm.png"
|
||||
})
|
||||
|
||||
-- airtime
|
||||
@ -103,6 +109,9 @@ return {
|
||||
{"country", types.varchar({ null=true }) },
|
||||
})
|
||||
create_index("releases", "name")
|
||||
create_index("releases", "label")
|
||||
create_index("releases", "year")
|
||||
create_index("releases", "country")
|
||||
|
||||
-- track_releases
|
||||
schema.create_table("track_releases", {
|
||||
@ -116,26 +125,6 @@ return {
|
||||
create_index("track_releases", "track")
|
||||
create_index("track_releases", "release")
|
||||
|
||||
-- -- labels
|
||||
-- schema.create_table("labels", {
|
||||
-- {"id", types.serial, { unique=true, primary_key=true }},
|
||||
-- {"created_at", types.time},
|
||||
-- {"updated_at", types.time},
|
||||
-- {"name", types.varchar},
|
||||
-- {"date", types.date({ null=true }) }},
|
||||
-- })
|
||||
-- create_index("labels", "name", { unique = true })
|
||||
|
||||
-- -- label_releases
|
||||
-- schema.create_table("label_releases", {
|
||||
-- {"id", types.serial, { unique=true, primary_key=true }},
|
||||
-- {"created_at", types.time},
|
||||
-- {"updated_at", types.time},
|
||||
-- {"release", types.foreign_key},
|
||||
-- {"label", types.foreign_key}
|
||||
-- })
|
||||
-- create_index("label_releases", "release", "label", { unique=true })
|
||||
|
||||
-- -- mixes
|
||||
-- schema.create_table("mixes", {
|
||||
-- {"id", types.serial, { unique=true, primary_key=true }},
|
||||
|
||||
@ -4,20 +4,6 @@
|
||||
-- -- Track stuff --
|
||||
-- -- ----------- --
|
||||
|
||||
-- -- labels
|
||||
-- -- - name/date
|
||||
-- local Labels = Model:extend("labels", {
|
||||
-- timestamp = true,
|
||||
-- })
|
||||
|
||||
-- -- release_labels
|
||||
-- local ReleaseLabels = Model:extend("release_labels", {
|
||||
-- timestamp = true,
|
||||
-- relations = {
|
||||
-- {"release", has_many = "Releases"},
|
||||
-- {"label", has_many = "Labels"}
|
||||
-- }
|
||||
-- })
|
||||
|
||||
-- -- mixes
|
||||
-- -- name/date
|
||||
@ -49,4 +35,4 @@
|
||||
|
||||
|
||||
-- local autoload = require("lapis.util").autoload
|
||||
-- return autoload("models")
|
||||
-- return autoload("models")
|
||||
|
||||
@ -5,6 +5,7 @@ local Model = require("lapis.db.model").Model
|
||||
local Stations = Model:extend("stations", {
|
||||
-- "station", types.integer
|
||||
-- "name", types.varchar
|
||||
-- "image", types.varchar
|
||||
|
||||
timestamp = true,
|
||||
relations = {
|
||||
@ -12,4 +13,4 @@ local Stations = Model:extend("stations", {
|
||||
}
|
||||
})
|
||||
|
||||
return Stations
|
||||
return Stations
|
||||
|
||||
Loading…
Reference in New Issue
Block a user