From 3082956deebe5394b8579e8f040adb3a93ca62b9 Mon Sep 17 00:00:00 2001 From: dreamer Date: Thu, 1 Oct 2020 10:24:14 +0200 Subject: [PATCH] some more improvements; basics for testing; new endpoints with html + json output --- Dockerfile | 6 ++-- README.md | 8 +++++ code/app.lua | 15 +++++---- code/config.lua | 11 +++++- code/handlers/artisthandler.lua | 57 ++++++++++++++++++++++++++++++++ code/handlers/splhandler.lua | 33 +++++------------- code/handlers/stationhandler.lua | 50 ++++++++++++++++------------ code/handlers/trackhandler.lua | 9 ++--- code/migrations.lua | 35 +++++++------------- code/models/models.lua | 16 +-------- code/models/stations.lua | 3 +- 11 files changed, 141 insertions(+), 102 deletions(-) create mode 100644 README.md create mode 100644 code/handlers/artisthandler.lua diff --git a/Dockerfile b/Dockerfile index 176f8ca..389503c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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 \ No newline at end of file +CMD lapis server diff --git a/README.md b/README.md new file mode 100644 index 0000000..b88f54b --- /dev/null +++ b/README.md @@ -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 diff --git a/code/app.lua b/code/app.lua index b8a3698..83503f6 100644 --- a/code/app.lua +++ b/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 diff --git a/code/config.lua b/code/config.lua index bc6f681..e864256 100644 --- a/code/config.lua +++ b/code/config.lua @@ -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" + } +}) diff --git a/code/handlers/artisthandler.lua b/code/handlers/artisthandler.lua new file mode 100644 index 0000000..5eb617e --- /dev/null +++ b/code/handlers/artisthandler.lua @@ -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 diff --git a/code/handlers/splhandler.lua b/code/handlers/splhandler.lua index 9559241..2ef63d7 100644 --- a/code/handlers/splhandler.lua +++ b/code/handlers/splhandler.lua @@ -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 \ No newline at end of file +return Splhandler diff --git a/code/handlers/stationhandler.lua b/code/handlers/stationhandler.lua index b46cf25..78516e8 100644 --- a/code/handlers/stationhandler.lua +++ b/code/handlers/stationhandler.lua @@ -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 \ No newline at end of file +return Stationhandler diff --git a/code/handlers/trackhandler.lua b/code/handlers/trackhandler.lua index 0340260..6a59c4f 100644 --- a/code/handlers/trackhandler.lua +++ b/code/handlers/trackhandler.lua @@ -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 \ No newline at end of file +return Trackhandler diff --git a/code/migrations.lua b/code/migrations.lua index 7c8a21a..f698a90 100644 --- a/code/migrations.lua +++ b/code/migrations.lua @@ -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 }}, diff --git a/code/models/models.lua b/code/models/models.lua index 8bc7a86..e0481dd 100644 --- a/code/models/models.lua +++ b/code/models/models.lua @@ -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") \ No newline at end of file +-- return autoload("models") diff --git a/code/models/stations.lua b/code/models/stations.lua index 1777ab4..9b734da 100644 --- a/code/models/stations.lua +++ b/code/models/stations.lua @@ -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 \ No newline at end of file +return Stations