ruleset my.movies.app { meta { name "movies" use module io.picolabs.wrangler alias wrangler use module html shares genres } global { event_domain = "my_movies_app" genres = function(){ html:header("movie genres","") + << <h1>Movie genres</h1> <form action="genre.html"> <select name="genre" required autofocus> <option value="">choose a genre</option> #{ent:genres.map(function(g){ << <option value="#{g.get("id")}">#{g.get("name")}</option> >>}).join("")} </select> <button type="submit">See movies</button> </form> <p>This product uses the TMDb API but is not endorsed or certified by <a href="https://www.themoviedb.org/">TMDb</a>.</p> >> + html:footer() } } rule initialize { select when wrangler ruleset_installed where event:attr("rids") >< meta:rid every { wrangler:createChannel( ["movies"], {"allow":[{"domain":event_domain,"name":"*"}],"deny":[]}, {"allow":[{"rid":meta:rid,"name":"*"}],"deny":[]} ) } fired { raise my_movies_app event "factory_reset" } } rule keepChannelsClean { select when my_movies_app factory_reset foreach wrangler:channels(["movies"]).reverse().tail() setting(chan) wrangler:deleteChannel(chan.get("id")) } rule saveAPIkey { select when my_movies_app factory_reset fired { ent:api_key := ctx:rid_config{"api_key"} raise my_movies_app event "new_api_key" attributes event:attrs } } rule getMovieGenres { select when my_movies_app new_api_key pre { the_url = "https://api.themoviedb.org/3/genre/movie/list?api_key=" response = http:get(the_url+ent:api_key) the_genres = response.get("content").decode().get("genres") } fired { ent:genres := the_genres raise my_movies_app event "new_genres" attributes event:attrs } } }