diff --git a/modpol/modpol.lua b/modpol/modpol.lua index 33ccded..d220ed5 100644 --- a/modpol/modpol.lua +++ b/modpol/modpol.lua @@ -71,9 +71,10 @@ dofile (topdir .. "/api.lua") -- =================================================================== -- Final checks - for id, org in ipairs(modpol.orgs.array) do - setmetatable(org, modpol.orgs) + if type(org) == 'table' then + setmetatable(org, modpol.orgs) + end end -- create instance if not present @@ -83,4 +84,4 @@ modpol.instance = modpol.orgs.array[1] or modpol.orgs.init_instance() modpol.ocutil.log ("modpol loaded") -- =================================================================== --- End of file. +-- End of file. \ No newline at end of file diff --git a/modpol/orgs/orgs.lua b/modpol/orgs/orgs.lua index b4c9aae..43ba3cc 100644 --- a/modpol/orgs/orgs.lua +++ b/modpol/orgs/orgs.lua @@ -7,6 +7,27 @@ modpol.orgs = modpol.orgs or -- sets modpol.orgs as its own fallback modpol.orgs.__index = modpol.orgs +function temp_org() + return { + id = nil, + name = nil, + policies = {}, + processes = {}, + requests = {}, + request_count = 0, + members = {}, + parent = nil, + children = {} + } +end + +modpol.orgs.request_params = { + add_org = 1, + delete = 0, + add_member = 1, + remove_member = 1 +} + -- ================================================== -- returns org when given its id or name function modpol.orgs.get_org(arg) @@ -71,22 +92,14 @@ end function modpol.orgs.init_instance() local error_msg if modpol.orgs.array[1] then - error_msg = 'Error: instance has already been initialized' - modpol.ocutil.log(error_msg) - return false, error_msg + modpol.ocutil.log('Error: instance has already been initialized') + return false end - local instance = { - id = 1, - name = "instance", - policies = {}, - members = {}, - ledger = {}, - parent = nil, - children = {}, - properties = {}, - old_names = {} - } + local instance = temp_org() + instance.id = 1 + instance.name = "instance" + setmetatable(instance, modpol.orgs) -- adding instance to org list @@ -114,14 +127,15 @@ function modpol.orgs:record(msg, entry_type) if type(msg) == 'string' and not(modpol.ocutil.str_empty(msg)) then entry.action_msg = msg else - print('Error: msg must be a non empty string') + modpol.ocutil.log('Error: msg must be a non empty string') return false end if type(entry_type) == 'string' and not(modpol.ocutil.str_empty(entry_type)) then entry.entry_type = entry_type else - print('Error: entry_type must be a non empty string') + modpol.ocutil.log('Error: entry_type must be a non empty string') + print(msg, entry_type) return false end @@ -138,33 +152,27 @@ end -- ex: instance:add_org('town hall') function modpol.orgs:add_org(name) if self.id == nil then - error_msg = 'Error: add_org can only be called by another org' - modpol.ocutil.log(error_msg) - return false, error_msg + modpol.ocutil.log('Error: add_org can only be called by another org') + return false end if modpol.ocutil.str_empty(name) then - error_msg = 'Error: org name is required' - modpol.ocutil.log(error_msg) - return false, error_msg + modpol.ocutil.log('Error: org name is required') + return false end if modpol.orgs.get_org(name) then - error_msg = 'Error: org name is already being used' - modpol.ocutil.log(error_msg) - return false, error_msg + modpol.ocutil.log('Error: org name is already being used') + return false end -- creating the child sub org modpol.orgs.count = modpol.orgs.count + 1 - local child_org = { - id = modpol.orgs.count, - name = name, - policies = {}, - members = {}, - parent = self.id, - children = {}, - } + local child_org = temp_org() + child_org.id = modpol.orgs.count + child_org.name = name + child_org.parent = self.id + setmetatable(child_org, modpol.orgs) -- adding child id to list of children @@ -174,6 +182,7 @@ function modpol.orgs:add_org(name) modpol.orgs.array[child_org.id] = child_org self:record('created sub org ' .. name, 'add_org') + modpol.ocutil.log('Created sub org ' .. name) return child_org end @@ -184,7 +193,8 @@ end -- note: "reason" param was removed, can be added back function modpol.orgs:delete() if self.id == 1 then - return false, 'Error: cannot delete instance' + modpol.ocutil.log('Error: cannot delete instance') + return false end if #self.children > 0 then @@ -196,7 +206,7 @@ function modpol.orgs:delete() end modpol.orgs.array[self.id] = 'removed' - print('Removed ' .. self.name .. ': ' .. self.id) + modpol.ocutil.log('Removed ' .. self.name .. ': ' .. self.id) self:record('Deleted ' .. self.name .. ' and all child orgs', 'del_org') @@ -224,7 +234,8 @@ function modpol.orgs:add_member(user) -- adds to end if no empty spots table.insert(self.members, user) end - self.record('Added member ' .. user, 'add_member') + self:record('Added member ' .. user, 'add_member') + end -- ======================================= @@ -236,7 +247,7 @@ function modpol.orgs:remove_member(user) if user_index then self.members[user_index] = '' end - self.record('Removed member ' .. user, 'del_member') + self:record('Removed member ' .. user, 'del_member') end -- =========================================== @@ -263,3 +274,57 @@ function modpol.orgs:list_member() end return str end + +-- =========================== +-- compares to requests to see if they are identical +function modpol.orgs.comp_req(req1, req2) + -- compares request type + if req1.type ~= req2.type then + return false + else + -- comparing parameters + -- we can assume the number of params is the same as this is checked in the make_request func + for k, v in ipairs(req1.params) do + if v ~= req2.params[k] then + return false + end + end + end + return true +end + +-- ================================ +-- tries to make a request to the org +function modpol.orgs:make_request(request) + -- makes sure the request has the valid number of parameters + local num_params = modpol.orgs.request_params[request.type] + + if num_params == nil then + modpol.ocutil.log("Error: request type is invalid") + return false + end + + for k, v in ipairs(request.params) do + num_params = num_params - 1 + end + + if num_params ~= 0 then + modpol.ocutil.log("Error: request has invalid number of parameters") + return false + end + + -- checking to see if identical request already exists + for k, v in ipairs(self.requests) do + if self.comp_req(request, v) == true then + modpol.ocutil.log("Error: request has already been made") + return false + end + end + + -- use lazy deletion here, not very clean + -- table.insert(self.requests, request) + self.request_count = self.request_count + 1 + self.requests[self.request_count] = request + return self.request_count + +end \ No newline at end of file diff --git a/modpol/storage/storage-local.lua b/modpol/storage/storage-local.lua index ce61a95..d94214e 100644 --- a/modpol/storage/storage-local.lua +++ b/modpol/storage/storage-local.lua @@ -117,9 +117,9 @@ local load_orgs = function() modpol.orgs = func() -- this block resets the metatable after being loaded in so that the class functions work - for id, org in ipairs(modpol.orgs.array) do - setmetatable(org, modpol.orgs) - end + -- for id, org in ipairs(modpol.orgs.array) do + -- setmetatable(org, modpol.orgs) + -- end local nn = modpol.ocutil.table_length (modpol.orgs.array) local str = "entries"