// TO BE EXECUTED ONLY AFTER ALL saturn5 individual spreadsheets gonna get loaded internal async Task AssureSaturnsDataConsistencyAsync(CancellationToken?token = null) { await Task.Run(() => { // Thread safety lock lock (this.DashboardDataLock) { token.GetValueOrDefault().ThrowIfCancellationRequested(); foreach (string dbSerialNumber in this._dataRepository.Saturns5DB.RowIndexesBySerialNumbers.Keys) { if (!this.HasSerialNumberAssociatedEntry(dbSerialNumber)) { throw new InvalidOperationException($"All individual Saturn5 spreadsheets has to be fully(partially metadata and issues sheets) prior to executing this method: {nameof(AssureSaturnsDataConsistencyAsync)}"); } } IList <Saturn5> saturns5 = this._dataRepository.Saturn5Repository.ReadAll(); foreach (Saturn5 saturn5 in saturns5) { token.GetValueOrDefault().ThrowIfCancellationRequested(); // Get dashboard row index of the dashboard row associated with currently looped through saturn 5... int dashboardRowIndex = this._dbRowIndexesBySerialNumbers[saturn5.SerialNumber] + 1; // ... and get the dashboard row containing associate dashboard entry. LiveRow dashboardRow = this._dashboardSheet[dashboardRowIndex]; string saturn5SpreadsheetId = this._dataRepository.Saturn5Repository.GetSaturn5LogSpreadsheetId(saturn5.SerialNumber); string saturn5SpreadsheetURL = this.GetUrlFromSpreadsheetId(saturn5SpreadsheetId); // if any of the properties located on the dashboard doesn't match these ones obtained from the Saturn5Repository... // ShortId if (saturn5.ShortId != dashboardRow[Saturns5DashboardRepository.Saturns5Dashboard_ShortId].GetDataAsString() // Saturn5 Spreadsheet URL || saturn5SpreadsheetURL != dashboardRow[Saturns5DashboardRepository.Saturns5Dashboard_SaturnSpreadsheetURL].GetDataAsString() // Saturn5Status || Saturn5StatusService.GetDashboardString(saturn5.Status) != dashboardRow[Saturns5DashboardRepository.Saturns5Dashboard_Status].GetDataAsString() // PhoneNumber || saturn5.PhoneNumber != dashboardRow[Saturns5DashboardRepository.Saturns5Dashboard_PhoneNumber].GetDataAsString() // LastSeenDate || saturn5.LastSeenDate != dashboardRow[Saturns5DashboardRepository.Saturns5Dashboard_LastSeenDate].GetDataAsString() // LastSeenTime || saturn5.LastSeenTime != dashboardRow[Saturns5DashboardRepository.Saturns5Dashboard_LastSeenTime].GetDataAsString() // LastSeenUsername || saturn5.LastSeenUsername != dashboardRow[Saturns5DashboardRepository.Saturns5Dashboard_LastSeenUserUsername].GetDataAsString()) { // Update dashboard sheet accordingly this.Update(saturn5); } } } }); await AssureUsersDataConsistencyAsync(token); }
private IList <string> GetUpdatedDashboardEntryRowData(Saturn5 saturn5) { IList <string> dashboardEntryRowData = new string[Saturns5DashboardRepository.Saturns5Dashboard_ColumnsCount]; string saturnSpreadsheetId = this._dataRepository.Saturn5Repository.GetSaturn5LogSpreadsheetId(saturn5.SerialNumber); dashboardEntryRowData[Saturns5DashboardRepository.Saturns5Dashboard_SerialNumber] = null; dashboardEntryRowData[Saturns5DashboardRepository.Saturns5Dashboard_ShortId] = saturn5.ShortId; dashboardEntryRowData[Saturns5DashboardRepository.Saturns5Dashboard_SaturnSpreadsheetURL] = this.GetUrlFromSpreadsheetId(saturnSpreadsheetId); dashboardEntryRowData[Saturns5DashboardRepository.Saturns5Dashboard_Status] = Saturn5StatusService.GetDashboardString(saturn5.Status); dashboardEntryRowData[Saturns5DashboardRepository.Saturns5Dashboard_PhoneNumber] = saturn5.PhoneNumber; dashboardEntryRowData[Saturns5DashboardRepository.Saturns5Dashboard_LastSeenDate] = saturn5.LastSeenDate; dashboardEntryRowData[Saturns5DashboardRepository.Saturns5Dashboard_LastSeenTime] = saturn5.LastSeenTime; dashboardEntryRowData[Saturns5DashboardRepository.Saturns5Dashboard_LastSeenUserUsername] = saturn5.LastSeenUsername; try { dashboardEntryRowData[Saturns5DashboardRepository.Saturns5Dashboard_LastSeenUserFirstName] = this._dataRepository.UserRepository.GetUserFirstName(saturn5.LastSeenUsername); dashboardEntryRowData[Saturns5DashboardRepository.Saturns5Dashboard_LastSeenUserSurname] = this._dataRepository.UserRepository.GetUserSurname(saturn5.LastSeenUsername); string userSpreadsheetId = this._dataRepository.UserRepository.GetUserLogSpreadsheetId(saturn5.LastSeenUsername); dashboardEntryRowData[Saturns5DashboardRepository.Saturns5Dashboard_LastSeenUserSpreadsheetURL] = this.GetUrlFromSpreadsheetId(userSpreadsheetId); } // If last seen username is associated with user which has been deleted since, catch an exception. catch (ArgumentException ex) when(ex.ParamName == "username") { } // Return constructed row data. return(dashboardEntryRowData); }
// Update public void UpdateUserDetails(User user) { // Thread safety lock lock (this.DashboardDataLock) { // Get live spreadsheets database reference. LiveSpreadsheetsDb db = this._dataRepository.GoogleService.SpreadsheetsDb; // Loop through all the rows in the dashboard // Loop through each of the rows (apart from the header row) in the LiveSheet containing saturn 5 database. for (int i = 1; i < this._dashboardSheet.RowCount; i++) { // Obtain dashboard row located on the currently looped through index... LiveRow dashboardRow = this._dashboardSheet[i]; // ... get the cell containing last seen Username for the specific saturn unit located on the dashboard row... LiveCell usernameCell = dashboardRow[Saturns5DashboardRepository.Saturns5Dashboard_LastSeenUserUsername]; // ... get the username data from that cell... string dashboardRowUsername = usernameCell.GetDataAsString(); // ... and compare provided user Username with dashboard row saturn 5 last seen username, // if they are found being equal, update data in other user related cells. if (user.Username == dashboardRowUsername) { // Boolean flag indicating necessity for updating the changes. bool changesRequired = false; LiveCell firstNameCell = dashboardRow[Saturns5DashboardRepository.Saturns5Dashboard_LastSeenUserFirstName]; LiveCell surnameCell = dashboardRow[Saturns5DashboardRepository.Saturns5Dashboard_LastSeenUserSurname]; LiveCell userSpreadsheetURLCell = dashboardRow[Saturns5DashboardRepository.Saturns5Dashboard_LastSeenUserSpreadsheetURL]; LiveCell saturn5StatusCell = dashboardRow[Saturns5DashboardRepository.Saturns5Dashboard_Status]; string currentFirstName = firstNameCell.GetDataAsString(); string currentSurname = surnameCell.GetDataAsString(); string currentSpreadsheetURL = userSpreadsheetURLCell.GetDataAsString(); // Obtain status from the dashboard cell associated with the saturn 5 // with (according dashboard) the same last user as the one provided for update. Saturn5Status currentStatus = Saturn5StatusService.GetStatusFromDashboardString(saturn5StatusCell.GetDataAsString()); if (currentStatus.IsWithUser()) { // Get saturn5 status according the type of the user the saturn5 is getting allocated to. Saturn5Status status = user.Type.GetWithUserSaturn5Status(); if (currentStatus != status) { changesRequired = true; saturn5StatusCell.SetData(Saturn5StatusService.GetDashboardString(status)); } } if (currentFirstName != user.FirstName) { changesRequired = true; firstNameCell.SetData(user.FirstName); } if (currentSurname != user.Surname) { changesRequired = true; surnameCell.SetData(user.Surname); } string userSpreadsheetId = this._dataRepository.UserRepository.GetUserLogSpreadsheetId(dashboardRowUsername); string newSpreadsheetURL = this.GetUrlFromSpreadsheetId(userSpreadsheetId); if (currentSpreadsheetURL != newSpreadsheetURL) { changesRequired = true; userSpreadsheetURLCell.SetData(newSpreadsheetURL); } if (changesRequired) { dashboardRow.Upload(db); } } } } }