some more improvements; basics for testing; new endpoints with html + json output

This commit is contained in:
dreamer 2020-10-01 10:24:14 +02:00
parent cddb4db941
commit 3082956dee
11 changed files with 141 additions and 102 deletions

View File

@ -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
View 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

View File

@ -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

View File

@ -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"
}
})

View 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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 }},

View File

@ -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")

View File

@ -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