From 7a27bba95ed01a1cba5720168cd5f4fb7dd997fa Mon Sep 17 00:00:00 2001 From: "Chris.Watts90@outlook.com" Date: Wed, 7 Mar 2018 08:59:29 +0000 Subject: [PATCH 1/4] add method to clear unassigned card identifiers. #69 --- .../WindowsDataCenter/Interfaces/IRepository.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/DataCenter_Windows/WindowsDataCenter/Interfaces/IRepository.cs b/DataCenter_Windows/WindowsDataCenter/Interfaces/IRepository.cs index 30f8141..e5e4f59 100644 --- a/DataCenter_Windows/WindowsDataCenter/Interfaces/IRepository.cs +++ b/DataCenter_Windows/WindowsDataCenter/Interfaces/IRepository.cs @@ -66,6 +66,10 @@ namespace Interfaces /// with nested list /// IdentifierList GetUnassignedIdentifierList(); + /// + /// Remove all unassigned identifiers from the system. + /// + void ClearUnassignedIdentifiers(); /// /// Update a user in the system with the new values. From b266fbf8e0612cb15fcd1e73d5f000b3a4c57211 Mon Sep 17 00:00:00 2001 From: "Chris.Watts90@outlook.com" Date: Wed, 7 Mar 2018 09:01:02 +0000 Subject: [PATCH 2/4] Remove 0.3 upgrade script. Implement Clear Unassigned Card method to remove all cards/identifiers from the database not assigned to a user. Add procedure to delete cards from the db. #69 --- .../WindowsDataCenter/SQLiteRepository/SQLiteProcedures.cs | 3 +++ .../WindowsDataCenter/SQLiteRepository/SQLiteRepository.cs | 7 +++++++ .../SQLiteRepository/SQLiteRepository.csproj | 4 ---- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteProcedures.cs b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteProcedures.cs index 9b810f8..bcded4e 100644 --- a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteProcedures.cs +++ b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteProcedures.cs @@ -63,6 +63,9 @@ namespace SQLiteRepository public const string GET_UNASSIGNED_CARD_LIST = "select * from " + nameof(CardUniqueId) + " where " + nameof(CardUniqueId.UserId_FK) + "=?"; + public const string CLEAR_UNASSIGNED_CARDS = + "delete from " + nameof(CardUniqueId) + " where " + nameof(CardUniqueId.UserId_FK) + "=?"; + public const string UPDATE_CARD_USER_ID = "update " + nameof(CardUniqueId) + " set " + nameof(CardUniqueId.UserId_FK) + "=? where " + nameof(CardUniqueId.Id) + "=?"; diff --git a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.cs b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.cs index 01e3a60..c867d5d 100644 --- a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.cs +++ b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.cs @@ -309,6 +309,13 @@ namespace SQLiteRepository return ret; } + public void ClearUnassignedIdentifiers() + { + _connection.Execute( + SQLiteProcedures.CLEAR_UNASSIGNED_CARDS, + Constants.UNASSIGNED_CARD_USER_ID); + } + //TODO: Check time logs table on update to ensure associated cards/unique identifiers are removed/added as appropriate. public OperationResponse UpdateUser(User user, out int userIdResult) { diff --git a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.csproj b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.csproj index eece48e..46517fc 100644 --- a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.csproj +++ b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.csproj @@ -77,7 +77,6 @@ - @@ -107,9 +106,6 @@ - - - From 153876d6a13e78ee8413a68b113f475866211e36 Mon Sep 17 00:00:00 2001 From: "Chris.Watts90@outlook.com" Date: Wed, 7 Mar 2018 09:02:19 +0000 Subject: [PATCH 3/4] Add API method to CardsController for clearing all unassigned identifiers from system. #69 --- .../WindowsDataCenter/Controllers/CardsController.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/Controllers/CardsController.cs b/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/Controllers/CardsController.cs index 8908259..ee9d5b5 100644 --- a/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/Controllers/CardsController.cs +++ b/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/Controllers/CardsController.cs @@ -27,5 +27,15 @@ namespace WindowsDataCenter _logger.Trace("Call to GetUnassignedCards, returning {0} items", unassignedCards.data.Count); return Ok(unassignedCards); } + + [HttpDelete] + [Route("unassigned")] + [CacheControl(MaxAge = 0)] + public IHttpActionResult ClearUnassignedCards() + { + _repo.ClearUnassignedIdentifiers(); + _logger.Trace("Call to ClearUnassignedCards, removed all identifiers."); + return Ok(); + } } } \ No newline at end of file From 50863b937caa49522c64be2888ddd657711c3005 Mon Sep 17 00:00:00 2001 From: "Chris.Watts90@outlook.com" Date: Wed, 7 Mar 2018 09:03:31 +0000 Subject: [PATCH 4/4] Add section to the Admin page that will allow administrator to clear all unassigned identifiers. #69 --- .../WindowsDataCenter/www/Admin.html | 28 +++++++++++- .../WindowsDataCenter/www/admin.js | 43 ++++++++++++++++++- .../WindowsDataCenter/www/admin.min.js | 2 +- 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/Admin.html b/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/Admin.html index c4fcdb6..b6667d0 100644 --- a/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/Admin.html +++ b/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/Admin.html @@ -77,7 +77,33 @@ +
+
+

Unassigned Cards

+ +
+
+
+ + + + + + + + + + + + + +
Card Unique IdLast Used Date
+
+
+
- + \ No newline at end of file diff --git a/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/admin.js b/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/admin.js index 964fd63..b912835 100644 --- a/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/admin.js +++ b/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/admin.js @@ -2,6 +2,7 @@ var self = this; self.groupsList = ko.observable(null); self.groupEditItem = ko.observable(null); + self.unassignedCardList = ko.observable(null); self.helpers = new Helpers(); self.uiPages = { overview: "overview", @@ -11,7 +12,9 @@ self.apiEndpoints = { deleteGroups:"/api/groups/delete", getGroups: "/api/groups", - editGroup: "/api/groups/edit" + editGroup: "/api/groups/edit", + getUnassignedCards: "/api/cards/unassigned", + clearUnassignedCards: "/api/cards/unassigned" }; self.clearGroupForm = function () { self.helpers.goToMenuOption(self.uiPages.group); @@ -69,10 +72,48 @@ var errorObj = self.helpers.processRequestFailure(resp, status, error); }); }; + self.getUnassignedCardData = function() { + var url = self.helpers.createRequestUrl(self.apiEndpoints.getUnassignedCards, null, false); + $.getJSON(url, + function(res) { + self.unassignedCardList(res); + }).fail(function(resp, status, error) { + console.log("error - getUnassignedCards"); + var errorObj = self.helpers.processRequestFailure(resp, status, error); + }); + }; + self.clearUnassignedCards = function() { + var url = self.helpers.createRequestUrl(self.apiEndpoints.clearUnassignedCards, null, false); + $.ajax({ + type: "DELETE", + url: url, + data: "", + success: function() { + self.getUnassignedCardData(); //update + }, + error: function(jqxhr, status, error) { + console.log("error - clearUnassignedCards"); + var errorObj = self.helpers.processRequestFailure(resp, status, error); + } + }); + }; + self.padNumber = function (number) { + return (number < 10 ? "0" : "") + number; + }; + self.convertToDisplayDateTime = function (dateValue) { + var date = new Date(dateValue); // dd MM YY HH:mm:ss e.g.: 01 Mar 17 17:34:02 + return date.getDate() + " " + + date.toLocaleString("en-us", { month: "long" }) + " " + + (date.getYear()-100) + " " + + self.padNumber(date.getHours()) + ":" + + self.padNumber(date.getMinutes()) + ":" + + self.padNumber(date.getSeconds()); + }; Sammy(function () { this.disable_push_state = true; this.get("#overview", function () { self.getGroups(); + self.getUnassignedCardData(); }); this.post("#editgroup", function () { self.submitGroupEdit(self.groupEditItem()); diff --git a/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/admin.min.js b/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/admin.min.js index f6a459f..6a6123e 100644 --- a/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/admin.min.js +++ b/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/admin.min.js @@ -1 +1 @@ -function AdminVM(){var n=this;n.groupsList=ko.observable(null);n.groupEditItem=ko.observable(null);n.helpers=new Helpers;n.uiPages={overview:"overview",group:"groups",home:function(){return this.overview}};n.apiEndpoints={deleteGroups:"/api/groups/delete",getGroups:"/api/groups",editGroup:"/api/groups/edit"};n.clearGroupForm=function(){n.helpers.goToMenuOption(n.uiPages.group);n.groupEditItem(null)};n.hideGroupForm=function(){n.groupEditItem(null)};n.newGroupForm=function(){n.groupEditItem({Id:-1,Name:""});n.helpers.goToMenuOption(n.uiPages.group)};n.groupFormHidden=ko.computed(function(){return n.groupEditItem()==null},n);n.editGroupClick=function(t){n.helpers.goToMenuOption(n.uiPages.group);n.groupEditItem(t)};n.getGroups=function(){var t=n.helpers.createRequestUrl(n.apiEndpoints.getGroups,null,!1);$.getJSON(t,function(t){n.groupsList(t)}).fail(function(t,i,r){console.log("error - getGroups");var u=n.helpers.processRequestFailure(t,i,r)})};n.deleteGroup=function(t){var i=n.helpers.createRequestUrl(n.apiEndpoints.deleteGroups,[{key:"groupId",value:t}],!1,!1);$.ajax({url:i,type:"DELETE",success:function(){console.log("deleted "+t);n.hideGroupForm();n.helpers.goToMenuOption(n.uiPages.home())}});console.log("delete: "+t)};n.submitGroupEdit=function(t){var i=n.helpers.createRequestUrl(n.apiEndpoints.editGroup,null,!1);$.post(i,t,function(){},"json").done(function(){n.groupEditItem(null);n.helpers.goToMenuOption(n.uiPages.home())}).fail(function(t,i,r){n.helpers.goToMenuOption(n.uiPages.home());var u=n.helpers.processRequestFailure(t,i,r)})};Sammy(function(){this.disable_push_state=!0;this.get("#overview",function(){n.getGroups()});this.post("#editgroup",function(){return n.submitGroupEdit(n.groupEditItem()),!1});this.get("",function(){this.app.runRoute("get","#"+n.uiPages.home())})}).run()}ko.applyBindings(new AdminVM) \ No newline at end of file +function AdminVM(){var n=this;n.groupsList=ko.observable(null);n.groupEditItem=ko.observable(null);n.unassignedCardList=ko.observable(null);n.helpers=new Helpers;n.uiPages={overview:"overview",group:"groups",home:function(){return this.overview}};n.apiEndpoints={deleteGroups:"/api/groups/delete",getGroups:"/api/groups",editGroup:"/api/groups/edit",getUnassignedCards:"/api/cards/unassigned",clearUnassignedCards:"/api/cards/unassigned"};n.clearGroupForm=function(){n.helpers.goToMenuOption(n.uiPages.group);n.groupEditItem(null)};n.hideGroupForm=function(){n.groupEditItem(null)};n.newGroupForm=function(){n.groupEditItem({Id:-1,Name:""});n.helpers.goToMenuOption(n.uiPages.group)};n.groupFormHidden=ko.computed(function(){return n.groupEditItem()==null},n);n.editGroupClick=function(t){n.helpers.goToMenuOption(n.uiPages.group);n.groupEditItem(t)};n.getGroups=function(){var t=n.helpers.createRequestUrl(n.apiEndpoints.getGroups,null,!1);$.getJSON(t,function(t){n.groupsList(t)}).fail(function(t,i,r){console.log("error - getGroups");var u=n.helpers.processRequestFailure(t,i,r)})};n.deleteGroup=function(t){var i=n.helpers.createRequestUrl(n.apiEndpoints.deleteGroups,[{key:"groupId",value:t}],!1,!1);$.ajax({url:i,type:"DELETE",success:function(){console.log("deleted "+t);n.hideGroupForm();n.helpers.goToMenuOption(n.uiPages.home())}});console.log("delete: "+t)};n.submitGroupEdit=function(t){var i=n.helpers.createRequestUrl(n.apiEndpoints.editGroup,null,!1);$.post(i,t,function(){},"json").done(function(){n.groupEditItem(null);n.helpers.goToMenuOption(n.uiPages.home())}).fail(function(t,i,r){n.helpers.goToMenuOption(n.uiPages.home());var u=n.helpers.processRequestFailure(t,i,r)})};n.getUnassignedCardData=function(){var t=n.helpers.createRequestUrl(n.apiEndpoints.getUnassignedCards,null,!1);$.getJSON(t,function(t){n.unassignedCardList(t)}).fail(function(t,i,r){console.log("error - getUnassignedCards");var u=n.helpers.processRequestFailure(t,i,r)})};n.clearUnassignedCards=function(){var t=n.helpers.createRequestUrl(n.apiEndpoints.clearUnassignedCards,null,!1);$.ajax({type:"DELETE",url:t,data:"",success:function(){n.getUnassignedCardData()},error:function(t,i,r){console.log("error - clearUnassignedCards");var u=n.helpers.processRequestFailure(resp,i,r)}})};n.padNumber=function(n){return(n<10?"0":"")+n};n.convertToDisplayDateTime=function(t){var i=new Date(t);return i.getDate()+" "+i.toLocaleString("en-us",{month:"long"})+" "+(i.getYear()-100)+" "+n.padNumber(i.getHours())+":"+n.padNumber(i.getMinutes())+":"+n.padNumber(i.getSeconds())};Sammy(function(){this.disable_push_state=!0;this.get("#overview",function(){n.getGroups();n.getUnassignedCardData()});this.post("#editgroup",function(){return n.submitGroupEdit(n.groupEditItem()),!1});this.get("",function(){this.app.runRoute("get","#"+n.uiPages.home())})}).run()}ko.applyBindings(new AdminVM) \ No newline at end of file