Creating and Destroying Resources
Resources are Lua scripts that you can create and store on disk, that let you link to arbitrary paths, as well as access functions.
For example, if you had a game that you wanted to link to two players, you might have code similar to this:
-- game_script.lua
local resource = require "namazu.resource"
local game_script = {}
-- Save the player ids to the resource
function game_script.set_player_ids(p1_id, p2_id)
game_script.player1_id = p1_id
game_script.player2_id = p2_id
-- Serialize this resource to disk after the changes have been made
resource.commit()
end
return game_script
-- Endpoint code
local util = require "namazu.util"
local index = require "namazu.index"
local resource = require "namazu.resource"
local response = require "namazu.response"
local responsecode = require "namazu.response.code"
local game_api = {}
function game_api.create_game(payload, request, session)
-- Since this is an authenticated request, we can get the requesting
-- player's profile directly
local p1_profile = auth.profile()
local player1_id = p1_profile.id
-- Payload is the profile id of player 2 in this example
local player2_id = payload
-- We want to make sure that the new game's path is unique
local game_id = util.uuid()
-- The creation path can be anything, but using derived values
-- (such as the player ids) makes it easier to access again in the future
local creation_path = string.format("games/%s/%s/%s", player1_id, player2_id, game_id)
local resource_id, response_code = resource.create("game_script", creation_path)
-- Make sure that the create request was successful!
if(response_code == responsecode.OK) then
-- Link player 2 to the game resource
local link_path = string.format("games/%s/%s/%s", player2_id, player1_id, game_id)
response_code = index.link(resource_id, link_path)
-- Make sure that the link was successful!
if(response_code == responsecode.OK) then
-- Invoke the function set_player_ids(p1_id, p2_id)
-- on our instance of game_script.lua
resource.invoke(resource_id, "set_player_ids", player1_id, player2_id)
return response.formulate(200)
end
-- The link was unsuccessful, so we destroy the resource so
-- that it doesn't linger on disk. This rarely happens but it's
-- good to handle!
resource.destroy(resource_id)
end
-- Something went wrong along the way
return response.formulate(400)
end
return game_api
Note
In addition to resource.destroy(resource_id)
, a resource can be destroyed if all links are removed using index.unlink(path)
Now that we have created a resource, we can get into accessing its functions.