From 37f1b48466c7391fda5d4845d1c14692fa3444f9 Mon Sep 17 00:00:00 2001
From: Luke Miller <millerluke1364@gmail.com>
Date: Tue, 8 Jun 2021 23:09:13 -0400
Subject: [PATCH 1/7] fixed issue with loading processes from memory

---
 modpol/modpol.lua | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/modpol/modpol.lua b/modpol/modpol.lua
index 101443b..844c34a 100644
--- a/modpol/modpol.lua
+++ b/modpol/modpol.lua
@@ -78,9 +78,9 @@ if (modpol.orgs.array) then
         if type(org) == 'table' then 
             setmetatable(org, modpol.orgs)
             -- sets process metatable on load
-            if type(org.processes) == 'table' then
-               for id, process in ipairs(org.processes) do
-                  setmetatable(process, modpol.modules[process.type])
+            for id, process in ipairs(org.processes) do
+                if type(process) == 'table' then
+                    setmetatable(process, modpol.modules[process.type])
                end
             end
         end

From 189053419534eac410375949909159d3056cb654 Mon Sep 17 00:00:00 2001
From: Luke Miller <millerluke1364@gmail.com>
Date: Tue, 8 Jun 2021 23:09:54 -0400
Subject: [PATCH 2/7] added an actions table to processes, which lists the
 actions required of each user

---
 modpol/modules/consent.lua    | 7 +++++++
 modpol/tests/org_req_test.lua | 5 +++--
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/modpol/modules/consent.lua b/modpol/modules/consent.lua
index 8c57765..18c3673 100644
--- a/modpol/modules/consent.lua
+++ b/modpol/modules/consent.lua
@@ -10,6 +10,7 @@ function temp_consent_process()
         type = "consent",
         org_id = nil,
         request_id = nil,
+        actions = {},
         total_votes = 0,
         majority_to_pass = 0.51,
         votes_yes = {},
@@ -27,6 +28,12 @@ function modpol.modules.consent:new_process(request_id, org_id)
     setmetatable(process, modpol.modules.consent)
     modpol.ocutil.log('Created new process for request id #' .. request_id)
 
+    -- adding new pending action for all users in the org to vote on the request
+    local process_org = modpol.orgs.get_org(org_id)
+    for k, member in ipairs(process_org.members) do 
+        process.actions[member] = {'approve'}
+    end
+
     return process
 end
 
diff --git a/modpol/tests/org_req_test.lua b/modpol/tests/org_req_test.lua
index 000e617..b65c61b 100644
--- a/modpol/tests/org_req_test.lua
+++ b/modpol/tests/org_req_test.lua
@@ -33,13 +33,14 @@ new_request = {
     params = {"new_org"}
 }
 
-request_id = modpol.instance:make_request(new_request)
 
 modpol.instance:add_member('luke')
 modpol.instance:add_member('josh')
 modpol.instance:add_member('nathan')
 
+request_id = modpol.instance:make_request(new_request)
+
 for id, process in ipairs(modpol.instance.processes) do
-    process:approve('luke', true)
+    -- process:approve('luke', true)
     process:approve('josh', true)
 end

From f616136597feb5b6c833bb517fb6e6f25bbc5998 Mon Sep 17 00:00:00 2001
From: Luke Miller <millerluke1364@gmail.com>
Date: Sun, 13 Jun 2021 14:22:07 -0400
Subject: [PATCH 3/7] moving how pending actions work around, after some
 testing and discussion. reordered how new processes are created so that they
 have access to their own ids

---
 modpol/modules/consent.lua | 13 +++++--------
 modpol/orgs/base.lua       |  1 +
 modpol/orgs/requests.lua   | 28 ++++++++++++++++++++--------
 3 files changed, 26 insertions(+), 16 deletions(-)

diff --git a/modpol/modules/consent.lua b/modpol/modules/consent.lua
index 18c3673..ff02e71 100644
--- a/modpol/modules/consent.lua
+++ b/modpol/modules/consent.lua
@@ -8,9 +8,9 @@ modpol.modules.consent.__index = modpol.modules.consent
 function temp_consent_process()
     return {
         type = "consent",
+        id = nil,
         org_id = nil,
         request_id = nil,
-        actions = {},
         total_votes = 0,
         majority_to_pass = 0.51,
         votes_yes = {},
@@ -20,23 +20,20 @@ end
 
 -- ===============================================
 -- function to create a new consent process to resolve a pending process
-function modpol.modules.consent:new_process(request_id, org_id)
+function modpol.modules.consent:new_process(id, request_id, org_id)
     local process = temp_consent_process()
+    process.id = id
     process.request_id = request_id
     process.org_id = org_id
 
     setmetatable(process, modpol.modules.consent)
     modpol.ocutil.log('Created new process for request id #' .. request_id)
 
-    -- adding new pending action for all users in the org to vote on the request
-    local process_org = modpol.orgs.get_org(org_id)
-    for k, member in ipairs(process_org.members) do 
-        process.actions[member] = {'approve'}
-    end
-
     return process
 end
 
+
+
 -- =========================================
 -- function to delete a process, called when process finishes
 function modpol.modules.consent:delete()
diff --git a/modpol/orgs/base.lua b/modpol/orgs/base.lua
index 1a975a6..2b8fbf5 100644
--- a/modpol/orgs/base.lua
+++ b/modpol/orgs/base.lua
@@ -14,6 +14,7 @@ function temp_org()
         policies = {},
         processes = {},
         requests = {},
+        pending = {},
         members = {},
         parent = nil,
         children = {}
diff --git a/modpol/orgs/requests.lua b/modpol/orgs/requests.lua
index 9b405ba..22d0e0b 100644
--- a/modpol/orgs/requests.lua
+++ b/modpol/orgs/requests.lua
@@ -13,10 +13,6 @@ function modpol.orgs:create_process(process_type, request_id)
         return
     end
 
-    -- retrieving requested module
-    local module = modpol.modules[process_type]
-    local new_process = module:new_process(request_id, self.id)
-
     -- linear search for empty process slots (lazy deletion)
     for k, v in ipairs(self.processes) do
         if v == 'deleted' then
@@ -28,17 +24,33 @@ function modpol.orgs:create_process(process_type, request_id)
     local index
     -- attempts to fill empty spots in list, otherwise appends to end
     if empty_index then
-        self.processes[empty_index] = new_process
         index = empty_index
     else
-        table.insert(self.processes, new_process)
-        index = #self.processes
+        index = #self.processes + 1
     end
 
-    new_process.id = index
+    -- retrieving requested module
+    local module = modpol.modules[process_type]
+    local new_process = module:new_process(index, request_id, self.id)
+
+    self.processes[index] = new_process
+
     return index
 end
 
+-- ===========================
+-- adds a new pending action to the org's table
+function modpol.orgs:add_pending_action(user, process_id, action)
+    self.pending[user][process_id] = action
+
+    -- pending = {
+    --     ['lukvmil']={
+    --         [1]='approve'
+    --     }
+    -- }
+
+end
+
 -- ===========================
 -- compares to requests to see if they are identical
 function modpol.orgs.comp_req(req1, req2)

From 2e6c8a5ee3377079b41f12bf0c1b8e76a9d1b39f Mon Sep 17 00:00:00 2001
From: Luke Miller <millerluke1364@gmail.com>
Date: Sun, 13 Jun 2021 14:26:54 -0400
Subject: [PATCH 4/7] added process id to log message

---
 modpol/modules/consent.lua | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/modpol/modules/consent.lua b/modpol/modules/consent.lua
index ff02e71..edab92c 100644
--- a/modpol/modules/consent.lua
+++ b/modpol/modules/consent.lua
@@ -27,7 +27,7 @@ function modpol.modules.consent:new_process(id, request_id, org_id)
     process.org_id = org_id
 
     setmetatable(process, modpol.modules.consent)
-    modpol.ocutil.log('Created new process for request id #' .. request_id)
+    modpol.ocutil.log('Created new process #' .. id .. ' for request id #' .. request_id)
 
     return process
 end

From 295cd983b80bda355c8b4b0325046642d48da121 Mon Sep 17 00:00:00 2001
From: Luke Miller <millerluke1364@gmail.com>
Date: Sun, 13 Jun 2021 15:06:47 -0400
Subject: [PATCH 5/7] added remove pending action function, now called in
 consent module when pending action is completed

---
 modpol/modules/consent.lua | 11 ++++++++++-
 modpol/orgs/requests.lua   | 33 +++++++++++++++++++++++++--------
 2 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/modpol/modules/consent.lua b/modpol/modules/consent.lua
index edab92c..cd7aade 100644
--- a/modpol/modules/consent.lua
+++ b/modpol/modules/consent.lua
@@ -29,11 +29,17 @@ function modpol.modules.consent:new_process(id, request_id, org_id)
     setmetatable(process, modpol.modules.consent)
     modpol.ocutil.log('Created new process #' .. id .. ' for request id #' .. request_id)
 
+    -- modpol.orgs.get_org(self.org_id):add_pending_action('luke', self.id, 'approve')
+    local p_org = modpol.orgs.get_org(org_id)
+
+    for i, member in ipairs(p_org.members) do
+        p_org:add_pending_action(id, member, 'approve')
+    end
+
     return process
 end
 
 
-
 -- =========================================
 -- function to delete a process, called when process finishes
 function modpol.modules.consent:delete()
@@ -59,6 +65,9 @@ function modpol.modules.consent:approve(user, decision)
     end
 
     self.total_votes = self.total_votes + 1
+    
+    local p_org = modpol.orgs.get_org(self.org_id)
+    p_org:remove_pending_action(self.id, user, "approve")
 
     self:update_status()
 end
diff --git a/modpol/orgs/requests.lua b/modpol/orgs/requests.lua
index 22d0e0b..e9399d0 100644
--- a/modpol/orgs/requests.lua
+++ b/modpol/orgs/requests.lua
@@ -40,17 +40,34 @@ end
 
 -- ===========================
 -- adds a new pending action to the org's table
-function modpol.orgs:add_pending_action(user, process_id, action)
-    self.pending[user][process_id] = action
-
-    -- pending = {
-    --     ['lukvmil']={
-    --         [1]='approve'
-    --     }
-    -- }
+function modpol.orgs:add_pending_action(process_id, user, action)
+    -- adds tables if they don't exist already
+    self.pending[user] = self.pending[user] or {}
+    self.pending[user][process_id] =  self.pending[user][process_id] or {}
 
+    -- inserting actual action
+    table.insert(self.pending[user][process_id], action)
+    modpol.ocutil.log("Added pending action '" .. action .. "' to " .. user .. " in process #" .. process_id)
 end
 
+-- ========================
+-- removes a pending action from the org's table
+function modpol.orgs:remove_pending_action(process_id, user, action)
+    if self.pending[user] then
+        if self.pending[user][process_id] then
+            for i, a in pairs(self.pending[user][process_id]) do
+                if a == action then
+                    self.pending[user][process_id][i] = nil
+                    modpol.ocutil.log("Removed pending action '" .. action .. "' from " .. user .. " in process #" .. process_id)
+                    return
+                end
+            end
+        end
+    end
+    modpol.ocutil.log("Could not remove pending action '" .. action .. "' from " .. user .. " in process #" .. process_id)
+end
+
+
 -- ===========================
 -- compares to requests to see if they are identical
 function modpol.orgs.comp_req(req1, req2)

From 6de2be011f6ae8c03845b37197de4fc0c7dd281c Mon Sep 17 00:00:00 2001
From: Luke Miller <millerluke1364@gmail.com>
Date: Mon, 14 Jun 2021 17:21:13 -0400
Subject: [PATCH 6/7] added a function to wipe all pending actions for dead
 processes, consent module now does this on close

---
 modpol/modules/consent.lua | 5 +----
 modpol/orgs/requests.lua   | 8 ++++++++
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/modpol/modules/consent.lua b/modpol/modules/consent.lua
index cd7aade..5d82899 100644
--- a/modpol/modules/consent.lua
+++ b/modpol/modules/consent.lua
@@ -44,6 +44,7 @@ end
 -- function to delete a process, called when process finishes
 function modpol.modules.consent:delete()
     local process_org = modpol.orgs.get_org(self.org_id)
+    process_org:wipe_pending_actions(self.id)
     process_org.processes[self.id] = "deleted"
     modpol.ocutil.log('Deleted process #' .. self.id)
 end
@@ -90,8 +91,4 @@ function modpol.modules.consent:update_status()
     else
         modpol.ocutil.log('Waiting for more votes...')
     end
-end
-
-function modpol.modules.consent.pending_processes()
-
 end
\ No newline at end of file
diff --git a/modpol/orgs/requests.lua b/modpol/orgs/requests.lua
index e9399d0..ae941d1 100644
--- a/modpol/orgs/requests.lua
+++ b/modpol/orgs/requests.lua
@@ -67,6 +67,14 @@ function modpol.orgs:remove_pending_action(process_id, user, action)
     modpol.ocutil.log("Could not remove pending action '" .. action .. "' from " .. user .. " in process #" .. process_id)
 end
 
+-- =====================
+-- removes all pending actions for a given process id from all users
+function modpol.orgs:wipe_pending_actions(process_id)
+    for user in pairs(self.pending) do
+        self.pending[user][process_id] = nil
+    end
+    modpol.ocutil.log("Removed all pending actions for process #" .. process_id)
+end
 
 -- ===========================
 -- compares to requests to see if they are identical

From 12623ee4a2b80341d784607432ece41cc7ce63ab Mon Sep 17 00:00:00 2001
From: Luke Miller <millerluke1364@gmail.com>
Date: Mon, 14 Jun 2021 17:32:59 -0400
Subject: [PATCH 7/7] documentation

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

diff --git a/modpol/orgs/requests.lua b/modpol/orgs/requests.lua
index ae941d1..4cd9012 100644
--- a/modpol/orgs/requests.lua
+++ b/modpol/orgs/requests.lua
@@ -53,8 +53,10 @@ end
 -- ========================
 -- removes a pending action from the org's table
 function modpol.orgs:remove_pending_action(process_id, user, action)
+    -- cautiously checks if pending action exists before removing it
     if self.pending[user] then
         if self.pending[user][process_id] then
+            -- searching for action to remove
             for i, a in pairs(self.pending[user][process_id]) do
                 if a == action then
                     self.pending[user][process_id][i] = nil