From 90da4c70bb7cc80b524d3913e9e2d04408b591cd Mon Sep 17 00:00:00 2001
From: Luke Miller <millerluke1364@gmail.com>
Date: Mon, 19 Apr 2021 10:11:22 -0400
Subject: [PATCH 1/8] standardizing org template

---
 modpol/orgs/orgs.lua | 40 +++++++++++++++++++++-------------------
 1 file changed, 21 insertions(+), 19 deletions(-)

diff --git a/modpol/orgs/orgs.lua b/modpol/orgs/orgs.lua
index d8db2ad..fbc6668 100644
--- a/modpol/orgs/orgs.lua
+++ b/modpol/orgs/orgs.lua
@@ -7,6 +7,18 @@ modpol.orgs =
 -- sets modpol.orgs as its own fallback
 modpol.orgs.__index = modpol.orgs
 
+function temp_org()
+    return {
+        id = nil,
+        name = nil,
+        policies = {},
+        processes = {},
+        members = {},
+        parent = nil,
+        children = {}
+    }
+end
+
 -- ==================================================
 -- returns org when given its id or name
 function modpol.orgs.get_org(arg)
@@ -74,17 +86,10 @@ function modpol.orgs.init_instance()
         return false, error_msg
     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
@@ -146,14 +151,11 @@ function modpol.orgs:add_org(name)
 
     -- 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

From 44e40d96e65bb090dd20550f22d646f57732fdf4 Mon Sep 17 00:00:00 2001
From: Luke Miller <millerluke1364@gmail.com>
Date: Wed, 21 Apr 2021 16:17:41 -0400
Subject: [PATCH 2/8] added support for making requests to an org (first step
 of processes)

---
 modpol/orgs/orgs.lua | 48 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/modpol/orgs/orgs.lua b/modpol/orgs/orgs.lua
index fbc6668..52a8dee 100644
--- a/modpol/orgs/orgs.lua
+++ b/modpol/orgs/orgs.lua
@@ -13,12 +13,20 @@ function temp_org()
         name = nil,
         policies = {},
         processes = {},
+        requests = {},
         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)
@@ -249,3 +257,43 @@ 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)
+    if req1.type ~= req2.type then
+        return false
+    else
+        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 return false end
+   
+    for k, v in ipairs(request.params) do
+        num_params = num_params - 1
+    end 
+    if num_params ~= 0 then 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
+            return false
+        end
+    end
+
+    table.insert(self.requests, request)
+    return true
+
+end
\ No newline at end of file

From 4eb12d77c9b45acf1af94e16cd5c15840203590d Mon Sep 17 00:00:00 2001
From: Luke Miller <millerluke1364@gmail.com>
Date: Wed, 21 Apr 2021 22:35:30 -0400
Subject: [PATCH 3/8] have a basic form of processes working! see demo.lua for
 an example

---
 modpol/api.lua              |  4 +++-
 modpol/demo.lua             | 33 +++++++++++++++++++++++++++++++
 modpol/modpol.lua           |  2 ++
 modpol/modules/dictator.lua | 39 +++++++++++++++++++++++++++++++++++++
 modpol/orgs/orgs.lua        | 11 +++++++++--
 5 files changed, 86 insertions(+), 3 deletions(-)
 create mode 100644 modpol/demo.lua
 create mode 100644 modpol/modules/dictator.lua

diff --git a/modpol/api.lua b/modpol/api.lua
index d2be724..392c85c 100644
--- a/modpol/api.lua
+++ b/modpol/api.lua
@@ -12,4 +12,6 @@ dofile (localdir .. "/orgs/orgs.lua")
 dofile (localdir .. "/interactions/interactions.lua")
 
 -- messaging functions
-dofile (localdir .. "/processes/processes.lua")
\ No newline at end of file
+dofile (localdir .. "/processes/processes.lua")
+
+dofile (localdir .. "/modules/dictator.lua")
\ No newline at end of file
diff --git a/modpol/demo.lua b/modpol/demo.lua
new file mode 100644
index 0000000..0947599
--- /dev/null
+++ b/modpol/demo.lua
@@ -0,0 +1,33 @@
+test_org = modpol.instance:add_org('test')
+
+req_id = test_org:make_request({
+    type = 'add_member', 
+    user = 'luke', 
+    params = {'luke'}
+})
+
+process = dictator.init(test_org.id, req_id)
+process:decide(true)
+
+req_id = test_org:make_request({
+    type = 'delete', 
+    user = 'luke', 
+    params = {}
+})
+
+process = dictator.init(test_org.id, req_id)
+process:decide(true)
+
+-- test_org:add_member('luke')
+-- test_org:add_member('nathan')
+-- test_org:add_member('bruh')
+-- print(test_org:list_member())
+-- test_org:remove_member('nathan')
+-- print('================')
+-- print(test_org:list_member())
+-- test_org:add_member('testing')
+-- test_org:add_member('test 2')
+-- print('==================')
+-- print(test_org:list_member())
+-- print(modpol.orgs.list_all())
+-- test_org:delete()
diff --git a/modpol/modpol.lua b/modpol/modpol.lua
index d0100a8..d4e0de0 100644
--- a/modpol/modpol.lua
+++ b/modpol/modpol.lua
@@ -86,3 +86,5 @@ modpol.ocutil.log ("modpol loaded")
 
 -- ===================================================================
 -- End of file.
+
+dofile(topdir .. '/demo.lua')
\ No newline at end of file
diff --git a/modpol/modules/dictator.lua b/modpol/modules/dictator.lua
new file mode 100644
index 0000000..bd7dedd
--- /dev/null
+++ b/modpol/modules/dictator.lua
@@ -0,0 +1,39 @@
+dictator = {}
+dictator.__index = dictator
+
+function dictator.init(org_id, request_id)
+    local object = {
+        request_id = request_id,
+        org_id = org_id,
+        resolved = false
+    }
+
+    setmetatable(object, dictator)
+
+    return object
+
+end
+
+function dictator:decide(ruling)
+    local org = modpol.orgs.get_org(self.org_id)
+    print(org.name)
+    if ruling then
+        local req = org.requests[self.request_id]
+        print(self.request_id)
+        for k, v in ipairs(org.requests) do print(k, v) end
+        print(req)
+        print(req.type)
+        if req.type == 'add_org' then
+            org:add_org(req.params[1])
+        elseif req.type == 'delete' then
+            org:delete()
+        elseif req.type == 'add_member' then
+            org:add_member(req.params[1])
+        elseif req.type == 'remove_member' then
+            org:remove_member(req.params[1])
+        end
+
+    end
+    
+    org.requests[self.request_id] = nil
+end
\ No newline at end of file
diff --git a/modpol/orgs/orgs.lua b/modpol/orgs/orgs.lua
index 52a8dee..f7e2e82 100644
--- a/modpol/orgs/orgs.lua
+++ b/modpol/orgs/orgs.lua
@@ -14,6 +14,7 @@ function temp_org()
         policies = {},
         processes = {},
         requests = {},
+        request_count = 0,
         members = {},
         parent = nil,
         children = {}
@@ -261,9 +262,12 @@ 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
@@ -293,7 +297,10 @@ function modpol.orgs:make_request(request)
         end
     end
 
-    table.insert(self.requests, request)
-    return true
+    -- 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

From 23d4a54a8e9e5402f1473a02fda17cfce810393b Mon Sep 17 00:00:00 2001
From: Luke Miller <millerluke1364@gmail.com>
Date: Fri, 23 Apr 2021 22:26:04 -0400
Subject: [PATCH 4/8] reverting metatable loading code

---
 modpol/demo.lua                  | 2 ++
 modpol/modpol.lua                | 5 +++--
 modpol/storage/storage-local.lua | 6 +++---
 3 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/modpol/demo.lua b/modpol/demo.lua
index 0947599..eef7ec2 100644
--- a/modpol/demo.lua
+++ b/modpol/demo.lua
@@ -18,6 +18,8 @@ req_id = test_org:make_request({
 process = dictator.init(test_org.id, req_id)
 process:decide(true)
 
+for k, v in ipairs(modpol.orgs.array) do print(k, v.name) end
+
 -- test_org:add_member('luke')
 -- test_org:add_member('nathan')
 -- test_org:add_member('bruh')
diff --git a/modpol/modpol.lua b/modpol/modpol.lua
index b1b5a66..25c2f00 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
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"

From 6d5d93b4b7beaf8377f91e9ebe66a7f23d9d4242 Mon Sep 17 00:00:00 2001
From: Luke Miller <millerluke1364@gmail.com>
Date: Fri, 23 Apr 2021 22:41:40 -0400
Subject: [PATCH 5/8] bug fixes

---
 modpol/orgs/orgs.lua | 48 ++++++++++++++++++++++++++------------------
 1 file changed, 28 insertions(+), 20 deletions(-)

diff --git a/modpol/orgs/orgs.lua b/modpol/orgs/orgs.lua
index e1d84f4..43ba3cc 100644
--- a/modpol/orgs/orgs.lua
+++ b/modpol/orgs/orgs.lua
@@ -92,9 +92,8 @@ 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 = temp_org()
@@ -128,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
 
@@ -152,21 +152,18 @@ 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
@@ -185,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
@@ -195,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
@@ -207,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')
 
@@ -235,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
 
 -- =======================================
@@ -247,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
 
 -- ===========================================
@@ -299,16 +299,24 @@ 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 return false end
+    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 return false 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

From 6d070133b79015859fa659421bf0c20f706795a8 Mon Sep 17 00:00:00 2001
From: Luke Miller <millerluke1364@gmail.com>
Date: Fri, 23 Apr 2021 22:44:55 -0400
Subject: [PATCH 6/8] cleaning up

---
 modpol/api.lua    | 4 +---
 modpol/modpol.lua | 4 +---
 2 files changed, 2 insertions(+), 6 deletions(-)

diff --git a/modpol/api.lua b/modpol/api.lua
index 392c85c..d2be724 100644
--- a/modpol/api.lua
+++ b/modpol/api.lua
@@ -12,6 +12,4 @@ dofile (localdir .. "/orgs/orgs.lua")
 dofile (localdir .. "/interactions/interactions.lua")
 
 -- messaging functions
-dofile (localdir .. "/processes/processes.lua")
-
-dofile (localdir .. "/modules/dictator.lua")
\ No newline at end of file
+dofile (localdir .. "/processes/processes.lua")
\ No newline at end of file
diff --git a/modpol/modpol.lua b/modpol/modpol.lua
index 25c2f00..d220ed5 100644
--- a/modpol/modpol.lua
+++ b/modpol/modpol.lua
@@ -84,6 +84,4 @@ modpol.instance = modpol.orgs.array[1] or modpol.orgs.init_instance()
 modpol.ocutil.log ("modpol loaded")
 
 -- ===================================================================
--- End of file.
-
-dofile(topdir .. '/demo.lua')
\ No newline at end of file
+-- End of file.
\ No newline at end of file

From a67dab55fe757480012add401d8034febc0c32f5 Mon Sep 17 00:00:00 2001
From: Luke Miller <millerluke1364@gmail.com>
Date: Mon, 26 Apr 2021 00:23:02 -0400
Subject: [PATCH 7/8] removing dictator for master merge

---
 modpol/modules/dictator.lua | 39 -------------------------------------
 1 file changed, 39 deletions(-)
 delete mode 100644 modpol/modules/dictator.lua

diff --git a/modpol/modules/dictator.lua b/modpol/modules/dictator.lua
deleted file mode 100644
index bd7dedd..0000000
--- a/modpol/modules/dictator.lua
+++ /dev/null
@@ -1,39 +0,0 @@
-dictator = {}
-dictator.__index = dictator
-
-function dictator.init(org_id, request_id)
-    local object = {
-        request_id = request_id,
-        org_id = org_id,
-        resolved = false
-    }
-
-    setmetatable(object, dictator)
-
-    return object
-
-end
-
-function dictator:decide(ruling)
-    local org = modpol.orgs.get_org(self.org_id)
-    print(org.name)
-    if ruling then
-        local req = org.requests[self.request_id]
-        print(self.request_id)
-        for k, v in ipairs(org.requests) do print(k, v) end
-        print(req)
-        print(req.type)
-        if req.type == 'add_org' then
-            org:add_org(req.params[1])
-        elseif req.type == 'delete' then
-            org:delete()
-        elseif req.type == 'add_member' then
-            org:add_member(req.params[1])
-        elseif req.type == 'remove_member' then
-            org:remove_member(req.params[1])
-        end
-
-    end
-    
-    org.requests[self.request_id] = nil
-end
\ No newline at end of file

From 411f4bd0a9c247d5934e504a6b7a0aea908e2f6a Mon Sep 17 00:00:00 2001
From: Luke Miller <millerluke1364@gmail.com>
Date: Mon, 26 Apr 2021 00:23:45 -0400
Subject: [PATCH 8/8] removed test file

---
 modpol/demo.lua | 35 -----------------------------------
 1 file changed, 35 deletions(-)
 delete mode 100644 modpol/demo.lua

diff --git a/modpol/demo.lua b/modpol/demo.lua
deleted file mode 100644
index eef7ec2..0000000
--- a/modpol/demo.lua
+++ /dev/null
@@ -1,35 +0,0 @@
-test_org = modpol.instance:add_org('test')
-
-req_id = test_org:make_request({
-    type = 'add_member', 
-    user = 'luke', 
-    params = {'luke'}
-})
-
-process = dictator.init(test_org.id, req_id)
-process:decide(true)
-
-req_id = test_org:make_request({
-    type = 'delete', 
-    user = 'luke', 
-    params = {}
-})
-
-process = dictator.init(test_org.id, req_id)
-process:decide(true)
-
-for k, v in ipairs(modpol.orgs.array) do print(k, v.name) end
-
--- test_org:add_member('luke')
--- test_org:add_member('nathan')
--- test_org:add_member('bruh')
--- print(test_org:list_member())
--- test_org:remove_member('nathan')
--- print('================')
--- print(test_org:list_member())
--- test_org:add_member('testing')
--- test_org:add_member('test 2')
--- print('==================')
--- print(test_org:list_member())
--- print(modpol.orgs.list_all())
--- test_org:delete()