some more improvements; basics for testing; new endpoints with html + json output
This commit is contained in:
parent
cddb4db941
commit
3082956dee
@ -1,4 +1,6 @@
|
|||||||
FROM mileschou/lapis:latest as previouslyon
|
FROM mileschou/lapis:alpine as previouslyon
|
||||||
|
|
||||||
|
RUN docker-luarocks-install busted
|
||||||
|
|
||||||
WORKDIR /srv/lapis
|
WORKDIR /srv/lapis
|
||||||
|
|
||||||
|
|||||||
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 lapis = require("lapis")
|
||||||
local config = require("lapis.config").get()
|
local config = require("lapis.config").get()
|
||||||
local to_json = require("lapis.util").to_json
|
|
||||||
local json_params = require("lapis.application").json_params
|
local json_params = require("lapis.application").json_params
|
||||||
local db = require("lapis.db")
|
|
||||||
|
|
||||||
local app = lapis.Application()
|
local app = lapis.Application()
|
||||||
|
app:enable("etlua")
|
||||||
|
|
||||||
local autoload = require("lapis.util").autoload
|
local autoload = require("lapis.util").autoload
|
||||||
local models = autoload("models")
|
|
||||||
local handlers = autoload("handlers")
|
local handlers = autoload("handlers")
|
||||||
|
|
||||||
app:get("/", function(self)
|
app:get("/", function(self)
|
||||||
-- return "Welcome to Lapis " .. require("lapis.version")
|
return config.greeting
|
||||||
return config.greeting .. " from port " .. config.postgres.password
|
|
||||||
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
@ -20,12 +17,16 @@ app:match("/spl/:station", function(self)
|
|||||||
return handlers.Splhandler(self)
|
return handlers.Splhandler(self)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
app:match("/station/:station", json_params(function(self)
|
app:match("station", "/station/:station(.:json)", json_params(function(self)
|
||||||
return handlers.Stationhandler(self)
|
return handlers.Stationhandler(self)
|
||||||
end))
|
end))
|
||||||
|
|
||||||
app:match("/track/:track", json_params(function(self)
|
app:match("track", "/track/:track", json_params(function(self)
|
||||||
return handlers.Trackhandler(self)
|
return handlers.Trackhandler(self)
|
||||||
end))
|
end))
|
||||||
|
|
||||||
|
app:match("artist", "/artist/:artist", json_params(function(self)
|
||||||
|
return handlers.Artisthandler(self)
|
||||||
|
end))
|
||||||
|
|
||||||
return app
|
return app
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
local config = require("lapis.config")
|
local config = require("lapis.config")
|
||||||
config("development", {
|
config("development", {
|
||||||
greeting = "waddup",
|
greeting = "dingen",
|
||||||
postgres = {
|
postgres = {
|
||||||
host = "postgres",
|
host = "postgres",
|
||||||
user = "postgres",
|
user = "postgres",
|
||||||
@ -8,3 +8,12 @@ config("development", {
|
|||||||
database = "postgres"
|
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 = nil
|
||||||
local track_name = self.params.track_name -- mandatory
|
local track_name = self.params.track_name -- mandatory
|
||||||
local track_info_url = nil
|
local track_info_url = self.params.info_url or nil
|
||||||
if self.params.info_url then
|
local track_img_url = self.params.img_url or "blanco.png"
|
||||||
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 release = nil
|
local release = nil
|
||||||
local release_name = nil
|
local release_name = self.params.release_name or nil
|
||||||
if self.params.release_name then
|
local release_year = tonumber(self.params.year) or nil
|
||||||
release_name = self.params.release_name
|
|
||||||
end
|
local release_country = self.params.country or nil
|
||||||
local release_year = nil
|
local release_label = self.params.label or 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 airtime = self.params.time -- mandatory
|
local airtime = self.params.time -- mandatory
|
||||||
local airdate = self.params.date -- mandatory
|
local airdate = self.params.date -- mandatory
|
||||||
|
|||||||
@ -8,6 +8,7 @@ local models = autoload("models")
|
|||||||
|
|
||||||
function Stationhandler(self)
|
function Stationhandler(self)
|
||||||
local station_id = self.params.station
|
local station_id = self.params.station
|
||||||
|
local json = self.params.json or nil
|
||||||
|
|
||||||
local station = models.Stations:find({ station = station_id })
|
local station = models.Stations:find({ station = station_id })
|
||||||
if not station then
|
if not station then
|
||||||
@ -16,11 +17,8 @@ function Stationhandler(self)
|
|||||||
print("This is: " .. station["name"])
|
print("This is: " .. station["name"])
|
||||||
end
|
end
|
||||||
|
|
||||||
local artist = nil
|
local limit = self.params.limit or 10
|
||||||
local release = nil
|
local offset = self.params.offset or 0
|
||||||
local return_dict = {}
|
|
||||||
local limit = 10
|
|
||||||
local offset = 0
|
|
||||||
|
|
||||||
-- local airtimes = models.Airtimes:paginated("where station = ? order by airtime desc", station["id"], {
|
-- local airtimes = models.Airtimes:paginated("where station = ? order by airtime desc", station["id"], {
|
||||||
-- per_page = 10,
|
-- per_page = 10,
|
||||||
@ -34,21 +32,21 @@ function Stationhandler(self)
|
|||||||
|
|
||||||
-- airtimes = airtimes:get_page(1)
|
-- airtimes = airtimes:get_page(1)
|
||||||
|
|
||||||
local airtimes = db.query([[
|
self.airtimes = db.query([[
|
||||||
SELECT airtime, track.name AS track, track.year, track.info_url, track.img_url,
|
SELECT airtime, track.id AS track_id, track.name AS track, track.year, track.info_url, track.img_url,
|
||||||
artist.name as artist,
|
artist.id AS artist_id, artist.name as artist,
|
||||||
release.name AS release, release.country, release.label AS label
|
release.id AS release_id, release.name AS release, release.country, release.label AS label
|
||||||
FROM airtimes
|
FROM airtimes
|
||||||
INNER JOIN
|
INNER JOIN
|
||||||
tracks AS track ON (airtimes.track = track.id)
|
tracks AS track ON (airtimes.track = track.id)
|
||||||
INNER JOIN
|
INNER JOIN
|
||||||
track_artists as track_artist ON (track_artist.track = track.id)
|
track_artists AS track_artist ON (track_artist.track = track.id)
|
||||||
INNER JOIN
|
INNER JOIN
|
||||||
artists as artist ON (track_artist.artist = artist.id)
|
artists AS artist ON (track_artist.artist = artist.id)
|
||||||
INNER JOIN
|
INNER JOIN
|
||||||
track_releases as track_release ON (track_release.track = track.id)
|
track_releases AS track_release ON (track_release.track = track.id)
|
||||||
INNER JOIN
|
INNER JOIN
|
||||||
releases as release ON (track_release.release = release.id)
|
releases AS release ON (track_release.release = release.id)
|
||||||
WHERE station = ?
|
WHERE station = ?
|
||||||
ORDER BY airtime
|
ORDER BY airtime
|
||||||
DESC LIMIT ?
|
DESC LIMIT ?
|
||||||
@ -56,7 +54,15 @@ function Stationhandler(self)
|
|||||||
]], station["id"], limit, offset*limit
|
]], 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
|
end
|
||||||
|
|
||||||
|
|||||||
@ -24,9 +24,6 @@ function Trackhandler(self)
|
|||||||
track[field] = nil
|
track[field] = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
local artists = {}
|
|
||||||
local airtimes = nil
|
|
||||||
|
|
||||||
local artists = db.query([[
|
local artists = db.query([[
|
||||||
SELECT artist.name AS artist_name
|
SELECT artist.name AS artist_name
|
||||||
FROM track_artists
|
FROM track_artists
|
||||||
|
|||||||
@ -34,6 +34,8 @@ return {
|
|||||||
{"img_url", types.varchar({ null=true }) },
|
{"img_url", types.varchar({ null=true }) },
|
||||||
})
|
})
|
||||||
create_index("tracks", "unique_name", { unique=true })
|
create_index("tracks", "unique_name", { unique=true })
|
||||||
|
create_index("tracks", "name")
|
||||||
|
create_index("tracks", "year")
|
||||||
|
|
||||||
-- track_artists
|
-- track_artists
|
||||||
schema.create_table("track_artists", {
|
schema.create_table("track_artists", {
|
||||||
@ -54,6 +56,7 @@ return {
|
|||||||
{"updated_at", types.time},
|
{"updated_at", types.time},
|
||||||
{"station", types.integer},
|
{"station", types.integer},
|
||||||
{"name", types.varchar},
|
{"name", types.varchar},
|
||||||
|
{"image", types.varchar},
|
||||||
})
|
})
|
||||||
create_index("stations", "station", "name", { unique=true })
|
create_index("stations", "station", "name", { unique=true })
|
||||||
|
|
||||||
@ -61,21 +64,24 @@ return {
|
|||||||
created_at = os.date(),
|
created_at = os.date(),
|
||||||
updated_at = os.date(),
|
updated_at = os.date(),
|
||||||
station = 1,
|
station = 1,
|
||||||
name = "Cybernetic Broadcasting System"
|
name = "Cybernetic Broadcasting System",
|
||||||
|
image = "CBS.red.png"
|
||||||
})
|
})
|
||||||
|
|
||||||
db.insert("stations", {
|
db.insert("stations", {
|
||||||
created_at = os.date(),
|
created_at = os.date(),
|
||||||
updated_at = os.date(),
|
updated_at = os.date(),
|
||||||
station = 2,
|
station = 2,
|
||||||
name = "Disco Fetish"
|
name = "Disco Fetish",
|
||||||
|
image = "DF.red.png"
|
||||||
})
|
})
|
||||||
|
|
||||||
db.insert("stations", {
|
db.insert("stations", {
|
||||||
created_at = os.date(),
|
created_at = os.date(),
|
||||||
updated_at = os.date(),
|
updated_at = os.date(),
|
||||||
station = 3,
|
station = 3,
|
||||||
name = "The Dream Machine"
|
name = "The Dream Machine",
|
||||||
|
image = "tdm.png"
|
||||||
})
|
})
|
||||||
|
|
||||||
-- airtime
|
-- airtime
|
||||||
@ -103,6 +109,9 @@ return {
|
|||||||
{"country", types.varchar({ null=true }) },
|
{"country", types.varchar({ null=true }) },
|
||||||
})
|
})
|
||||||
create_index("releases", "name")
|
create_index("releases", "name")
|
||||||
|
create_index("releases", "label")
|
||||||
|
create_index("releases", "year")
|
||||||
|
create_index("releases", "country")
|
||||||
|
|
||||||
-- track_releases
|
-- track_releases
|
||||||
schema.create_table("track_releases", {
|
schema.create_table("track_releases", {
|
||||||
@ -116,26 +125,6 @@ return {
|
|||||||
create_index("track_releases", "track")
|
create_index("track_releases", "track")
|
||||||
create_index("track_releases", "release")
|
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
|
-- -- mixes
|
||||||
-- schema.create_table("mixes", {
|
-- schema.create_table("mixes", {
|
||||||
-- {"id", types.serial, { unique=true, primary_key=true }},
|
-- {"id", types.serial, { unique=true, primary_key=true }},
|
||||||
|
|||||||
@ -4,20 +4,6 @@
|
|||||||
-- -- Track stuff --
|
-- -- 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
|
-- -- mixes
|
||||||
-- -- name/date
|
-- -- name/date
|
||||||
|
|||||||
@ -5,6 +5,7 @@ local Model = require("lapis.db.model").Model
|
|||||||
local Stations = Model:extend("stations", {
|
local Stations = Model:extend("stations", {
|
||||||
-- "station", types.integer
|
-- "station", types.integer
|
||||||
-- "name", types.varchar
|
-- "name", types.varchar
|
||||||
|
-- "image", types.varchar
|
||||||
|
|
||||||
timestamp = true,
|
timestamp = true,
|
||||||
relations = {
|
relations = {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user